【问题标题】:Printing out multiple rows in stored procedure在存储过程中打印出多行
【发布时间】:2013-04-13 19:28:24
【问题描述】:

我想传入一个 int 值并返回一个小于这个 int 的短密码列表。我在修改 MySQL 游标示例时遇到了问题:http://dev.mysql.com/doc/refman/5.0/en/cursors.html。我想用短密码打印出行,但任何时候结果有不止一行 PhpMyAdmin 只会无限期地显示“处理请求”。我究竟做错了什么?它破坏了我周六的工作效率!

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ShortPasswd`(IN `passwordLength` TINYINT)
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a INT;
  DECLARE b VARCHAR(255);
  DECLARE cur1 CURSOR FOR SELECT UID, Password
      FROM authentication WHERE CHARACTER_length(Password) < passwordLength;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SELECT b;
  END LOOP;

  CLOSE cur1;
END
$$
DELIMITER ;

【问题讨论】:

    标签: mysql stored-procedures phpmyadmin


    【解决方案1】:

    我建议修改这些行:

    ...
    DECLARE FINISHED BOOLEAN DEFAULT 0;
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    ...
    IF done THEN
      CLOSE cur1;
      LEAVE read_loop;
    END IF;
    
    ...
    END LOOP read_loop;
    

    我使用 0/1 而不是 FALSE/TRUE,并在离开 LOOP 之前关闭光标。

    【讨论】:

    • 如果我尝试这样做并去执行存储过程,我会收到以下错误:以下查询失败:“CALL ShortPasswd(@p0);”MySQL 说:#1326 - 光标是没有打开
    【解决方案2】:
    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `ShortPasswd`(IN `passwordLength` TINYINT)
    BEGIN
    
       SELECT UID, Password
          FROM authentication WHERE CHARACTER_length(Password) > passwordLength;
    
    END
    $$
    DELIMITER ;
    

    您将直接获得行 UID、密码。正如你从查询中得到的那样

    call ShortPasswd;
    

    【讨论】:

    • 这个答案只返回第一行。你知道如何返回所有行吗?
    • 你在phpmyadmin中测试过SELECT UID, Password FROM authentication WHERE CHARACTER_length(Password) &gt; passwordLength;查询的结果吗?
    • 是的(作为旁注,我在小于号中犯了一个错误,它应该是CHARACTER_length(Password) &lt; passwordLength;)无论如何,如果我手动运行查询SELECT UID, Password FROM authentication WHERE CHARACTER_length(Password) &lt; 10,我会返回6行但是当我把存储过程中的相同查询我得到了我应该得到的 6 行中的第一行。我是否需要遍历行并随时打印它们?
    • 你在哪里跑call shortPasswd?在 Phpmyadmin 或控制台中或直接在程序中尝试?
    • 返回所有行。我在我的应用程序中多次使用过这些东西。
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多