2013-04-20 5 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

+0

당신은'선택 UID, 패스워드 인증에서 WHERE CHARACTER_length (Password)> passwordLength;'쿼리 결과는 phpmyadmin? –

+0

예 (부수적으로 나는 Shane

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; 

내가 대신 TRUE/FALSE의 0/1을 사용하고, 커서가 전에 LOOP를 떠나 닫습니다.

+0

나는 그것을 시도하고 나는 다음과 같은 오류가 저장 프로 시저 실행로 이동합니다 : 다음 쿼리는 실패했습니다 "ShortPasswd' (@의 P0)'전화, "MySQL은 말했다 : # 1326 - 커서가 열려 있지 않다 – Shane

관련 문제