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を使用しています。