mysqlでストアドプロシージャ その5 - ラベルを使ってcontinue,breakっぽく 2012/09/24

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;

: