複数行のデータを変数へ代入する( Cursors )
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 を使用しています。