プログラマメモ2 - programmer no memo2

mysqlでストアドプロシージャ その2 2012/09/22

mysqlでストアドです。
oracleほどではないですが、使えて便利そうな予感です。

参考


ストアドプロシージャで実験

簡単なシナリオ

aテーブルに入っている値をbテーブルに挿入します。
SQL一本でできそうですが...

 以下テーブル

create table a (
  id          smallint unsigned not null auto_increment primary key,
  tday      timestamp
);

create table b (
  id          smallint unsigned not null auto_increment primary key,
  ida smallint,
  tday      timestamp
);

用意したプロシージャは以下
カーソル使ってます。
DROP PROCEDURE IF EXISTS p001;
delimiter //
CREATE PROCEDURE p001()
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; -- カーソルオープン
  
    REPEAT -- 繰り返し
        FETCH cur INTO a_id;
        IF NOT done THEN
            -- 通常inset にwhereが使えなかったのでdualを使ってるけどこの辺自信がない...
            INSERT INTO b (ida) SELECT a_id FROM dual WHERE NOT EXISTS(SELECT 1 FROM b WHERE ida=a_id);  
        END IF;
    UNTIL done END REPEAT;
  
    -- クローズ!!
    CLOSE cur;

END
//
CALL p001();-- ここで実行
DROP PROCEDURE IF EXISTS p001;

: