mysqlでストアドプロシージャ その5 - ラベルを使ってcontinue,breakっぽく
2012/09/24
mysql
sql
ストアド
mysqlでストアドプロシージャ その5です。
ループでラベル使うとcontinue,breakっぽく使えますねと。
DROP PROCEDURE IF EXISTS p004;
delimiter //
CREATE PROCEDURE p004()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a_id INT;
DECLARE cur CURSOR FOR
SELECT id FROM a;
-- この宣言で読み取り行がないことを検知します。
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur; -- カーソルオープン
main:REPEAT -- 繰り返し
FETCH cur INTO a_id;
IF NOT done THEN
-- continueっぽく使える
IF a_id < 20 THEN ITERATE main; END IF;
-- 通常inset にwhereが使えなかったのでdualを使ってるけどこの辺自信がない...
INSERT INTO b (ida) SELECT a_id FROM dual WHERE NOT EXISTS(SELECT 1 FROM b WHERE ida=a_id);
-- breakっぽく使える
IF a_id = 22 THEN LEAVE main; END IF;
END IF;
UNTIL done END REPEAT main;
-- クローズ!!
CLOSE cur;
END
//
CALL p004();-- ここで実行
DROP PROCEDURE IF EXISTS p004;
delimiter //
CREATE PROCEDURE p004()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a_id INT;
DECLARE cur CURSOR FOR
SELECT id FROM a;
-- この宣言で読み取り行がないことを検知します。
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur; -- カーソルオープン
main:REPEAT -- 繰り返し
FETCH cur INTO a_id;
IF NOT done THEN
-- continueっぽく使える
IF a_id < 20 THEN ITERATE main; END IF;
-- 通常inset にwhereが使えなかったのでdualを使ってるけどこの辺自信がない...
INSERT INTO b (ida) SELECT a_id FROM dual WHERE NOT EXISTS(SELECT 1 FROM b WHERE ida=a_id);
-- breakっぽく使える
IF a_id = 22 THEN LEAVE main; END IF;
END IF;
UNTIL done END REPEAT main;
-- クローズ!!
CLOSE cur;
END
//
CALL p004();-- ここで実行
DROP PROCEDURE IF EXISTS p004;
: