複数行のデータを変数へ代入する( Cursors )

メモ:  Category:mysql

SELECT 文で得られた単一行の結果を変数へ代入するには SELECT … INTO を使用しますが、複数行からなる結果を変数へ代入していくには、 CURSOR を使用します。

カーソルは、 DECLARE (カーソル宣言)、 OPEN (カーソルを開く)、 FETCH (取得)、 CLOSE (カーソルを閉じる)の4つの処理でデータを取得します。

1.DECLARE(カーソル宣言)

DECLARE カーソル名 CURSOR FOR SELECT文

2.OPEN(カーソルを開く)

OPEN カーソル名

3.FETCH(取得)

FETCH カーソル名 INTO 変数1[,変数2...]

4.CLOSE(カーソルを閉じる)

CLOSE カーソル名

カーソルの使用例

MySQL のマニュアルのサンプルが、 DECLARE … HANDLER を使っていてわかりやすいので、ほぼそのまま例として使用します。

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a,b INT;
  DECLARE cur1 CURSOR FOR SELECT price1,price2 FROM test.t1;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO a, b;
    IF NOT done THEN
       IF a < b THEN
          INSERT INTO test.t3 VALUES (a,b);
       END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
END

ループを抜けるきっかけとして、 DECLARE … HANDLER を使用しています。

bluenote by BBB