2009-03-09 5 views
9

몇 개의 커서가있는 MySQL 저장 프로 시저가 있습니다. 값을 출력하여 클라이언트에게 다시 출력하고 싶습니다. SQLyog Enterprise.MySQL 저장 프로 시저에서 인쇄를 시뮬레이트하는 방법

변수를 TEXT로 선언하고 루프 내부에서 연결을 시도했지만 작동하지 않습니다. 적어도 그렇게하려고하지는 않았습니다.

DECLARE _output TEXT; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = _ID; /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 

이 나는 ​​시도했다 :

SET _output = _output + _ID 

SET _output = CONCAT(_output,_ID) 

그러나 그들은 모두 단지 NULL

SET _output = _ID;을 반환 그냥 나에게 마지막으로 가져온 행을 제공합니다. 도움이되었지만 전 원하는 바가 아니 었습니다.

MySQL 저장 프로 시저에서 MySQL 인쇄물을 재현하기 위해 각 출력 행을 화면으로 가져 오는 가장 좋은 방법은 무엇입니까?

답변

14

SELECT _ 출력으로 올바르게 수행하고 있습니다. INTO 절없이 선택되는 모든 것은 클라이언트에 리턴됩니다.

모두 가져 오려면 SELECT를 루프로 이동하거나 (각각을 개별적으로 인쇄 할 수 있음) 함께 연결하면됩니다. NULL을 반환하는 concat 문제는 ​​_output을 아무 것도 초기화하지 않았기 때문에 NULL 인 것입니다. NULL을 가진 어떤 것도 concatting하면 NULL을 반환합니다. (_ID ","_output)

DECLARE _output TEXT DEFAULT ''; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = CONCAT(",", _ID); /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 
+6

가 그 '_output SET = CONCAT해야하지,'는 그렇지 않으면 마지막 ID가됩니다

다음을 시도 – Marcus

관련 문제