weblog of key_amb

主にIT関連の技術メモ

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;