2009-03-09 17 views
9

私は、いくつかのカーソルを持つMySQLストアドプロシージャを持っています。私は出力をクライアントに送り返すために値を出力したい。 SQLyog EnterpriseMySQLストアドプロシージャのプリントをシミュレートする方法

私は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を返すコンカットの問題は、_outputを何も初期化していないためNULLだったためです。何かをNULLで連結すると、NULLが返されます。

すると、次を試してみてください。

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

はそれが '= CONCAT(_output、 ""、_ID)を_output設定しないでください;' そうでなければ、それは唯一の最後のIDを持っています – Marcus

関連する問題