MySQL ストアド

CREATE ROUTINEの権限が必要。

基本

create procedure sample01()

select now();

mysql>call sample01;

削除

mysql>drop procedure sample01;

一覧

show procedure status;

中身

show create procedure sample01;

引数をとる

create procedure sample01(in a int, in b int)

select a + b;

mysql>call sample01(10,5);

返り値

create procedure sample01(out x int)

set x = 3;

mysql> call sample01(@var);

mysql> select @var;

複数のクエリを発行

delimiter //

create procedure sample01()

begin

select 1;

select 2;

end//

delimiter ;

mysql> call sample01;

IF文

delimiter //

create procedure sample02(in x int)

begin

if x = 1 then

select “inp 1”;

elseif x = 2 then

select “int 2”;

else

select “inp else”;

end if

end //

delimiter ;

call sample02(1);

select~into文で変数へ

delimiter //

create procedure p(in a int, out sum int)

begin

select a * 2 into @tmp;

set sum = @tmp;

end //

delimiter ;

call p (4,@sum);

select @sum;

カーソル単位で処理する

declare xxx cursor という形で宣言。

for select でselectの結果を定義。

fetch cursor for カラムで代入。

処理前にopenして最後にcloseする。

delimiter //

create procedure p(in i_id int, in i_str varchar(10), out o_id int, out o_str varchar(10))

begin

declare myid int;

declare mystr varchar(10);

declare mycur cursor for select id,str from test_tbl; 

set @pos = 0;

select count(*) into @total from test_tbl;

set o_id = 0;

set o_str = ”;

open mycur;

while @total > @pos do

fetch mycur into myid,mystr;

if myid = i_id or mystr = i_str then

set o_id = myid;

set o_str = mystr;

set @pos = @total;

end if;

set @pos = @pos + 1;

end while;

close mycur;

end //

delimiter ;

mysql> CALL p( 4, ‘cc’, @id, @str );

mysql> SELECT @id;