MySQLでストアドプロシージャを作ろう
いくつか簡単なプロシージャを作ってみる。
まず、テスト用のDBを作る。
create database hoge; use hoge create table hoge ( id int unsigned not null, name varchar(255) not null );
1. insertプロシージャ
プロシージャはCREATE PROCEDUREステートメントで作る。
mysqlクライアントで直接ステートメントを発行して作る場合、delimiter(文の区切り文字)を変更しておく。
とりあえず、ただinsertするだけのプロシージャ。
delimiter // -- delimiterを'//'に変更 create procedure insert_hoge (IN i_id int) begin insert into hoge values (i_id, 'hoge'); end; // -- create procedure終わり delimiter ; -- delimiterを元に戻す
これでinsertプロシージャが出来た。
call insert_hoge(1);
とすると、(1, 'hoge')というレコードがinsertされる。
2. 条件によって処理を変える
ストアドプロシージャとファンクションを含むストアドルーチンで使用出来る制御構文は、フローコントロール・コンストラクトと呼ばれるようだ。
この中には、プログラマにはお馴染みの IF文や WHILE文などが含まれる。
ここでは、IF文の例を挙げる。
delimiter // create procedure insert_hoge2 () begin if ((select count(1) from hoge) < 10) then call insert_hoge(1); else call insert_hoge(2); end if; end; // delimiter ;
これは、レコードの件数が10件に満たないときは、insert_hoge(1)を実行し、レコード数が10以上のときは、insert_hoge(2)を実行する。
call insert_hoge2();
3. 条件を満たす間、繰り返す。
WHILE文の例を挙げる。
delimiter // create procedure make_hoge_data () begin while ((select count(1) from hoge) < 20) do call insert_hoge2(); end while; end; // delimiter ;
今度は、レコード数が20未満の間、insert_hoge2()を実行し続ける。
call make_hoge_data();
4. プロシージャの削除
drop procedure make_hoge_data; drop procedure insert_hoge2; drop procedure insert_hoge;