IThaiのブログ

IT関連の話題やタイに関する様々なことを書いていきます。

(MYSQL)ストアドプロシージャのログ出力方法

ストアドプロシージャのログ出力を出したいと思うようになった契機は、シェルでストアドプロシージャを呼んで、戻り値で成功判定をしたいと思ったことでした。

ストアドルーチンで戻り値を返すなら、通常ストアドファンクションを使うのですが、ストアドファンクションは動的SQLはサポートしていないらしいです。

どうしても動的SQLを使いたかったので、ストアドプロシージャで以下のようにしました。

delimiter //
create procedure xxx()
begin
select "文字列";
end
//
delimiter ;

これで呼び出し元に文字列が返ってきました。これはデバッグなどでログを出力するのにも使えますので、変数の値を知りたいのときなどによく使えます。

ちなみにdelimiterはMYSQLの区切り文字である「;」のかわりに他の文字を区切り文字に指定することができます。

例えばdelimiter // とすれば「//」を区切り文字に指定できます。

話が少しずれますが、ストアドプロシージャでは動的SQLを使用することがよくあります。動的SQLには文字列の連結のためにconcat()がよく使用されますが、注意しないといけないのは、ストアドプロシージャではpreparedステートメントを使わないと動的SQLを利用できないことです。

以下のように使用できます。

delimiter //
create procedure xxx(IN arg INT)
begin
@sub=concat(" select id from A where id = ", arg);
@sql=concat(" select * from B where id = ", @sub);
prepare s from @sql;
execute s;
end
//
delimiter ;