mysqlでストアドプロシージャ その2
2012/09/22
mysql
sql
ストアド
mysqlでストアドです。
oracleほどではないですが、使えて便利そうな予感です。
参考
ストアドプロシージャで実験
簡単なシナリオ
aテーブルに入っている値をbテーブルに挿入します。SQL一本でできそうですが...
以下テーブル
create table a (
id smallint unsigned not null auto_increment primary key,
tday timestamp
);
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
);
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;
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;
: