(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 ;