2013-04-20 33 views
2

我想傳入一個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 ; 

回答

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; 
+0

這個答案只返回第一行。你知道如何返回所有行嗎? – Shane 2013-04-20 14:41:00

+0

您是否測試過'SELECT UID,密碼 FROM認證WHERE CHARACTER_length(Password)> passwordLength;'在phpmyadmin中查詢結果? – 2013-04-20 14:43:49

+0

是的(作爲一個側面說明,我在小於號中犯了一個錯誤,它應該是'CHARACTER_length(Password) Shane 2013-04-20 14:49:15

0

我建議修改這些行:

... 
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,並關閉光標之前退出循環。

+0

如果我嘗試去執行存儲過程我得到以下錯誤:下面的查詢失敗:「調用'ShortPasswd'(@ P0); 」的MySQL說:#1326 - 遊標未打開 – Shane 2013-04-20 14:45:02