web-dev-qa-db-ja.com

MySQLストアドプロシージャで印刷をシミュ​​レートする方法

いくつかのカーソルを持つMySQLストアドプロシージャがあります。値を出力してクライアントに出力を送りたいのですが。 SQLyog Enterprise

変数を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印刷を再現するために、フェッチされた各行を画面に出力する最良の方法は何ですか?

13
Brian Boatright

SELECT _outputで正しく実行しています。 INTO句なしで選択されたものはすべてクライアントに返されます。

それらをすべて取得するには、SELECTをループに移動して(それぞれを個別に出力する)、またはそれらを連結します。 concatが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 NOT THEN 
 SET _output = CONCAT ( "、"、_ID);/*以下を参照してください*/
 
 END IF; 
 UNTIL done END REPEAT; 
 CLOSE cur1; 
 
 SELECT _output ; 
17
Harrison Fisk