Rails3.0 で MySQL のストアドプロシージャを呼び出してみる

ストアドプロシージャにまつわる諸々は MySQL のマニュアル等をご参照のこと。ここでは SQL レベルのお話にとどめます。

MySQL 側でストアドプロシージャを用意する

今回はきわめて簡単な SELECT 文をストアドプロシージャとして定義します。

CREATE PROCEDURE sampleProc()
SELECT * FROM posts;

正しい権限で実行していれば、ストアドプロシージャが作成されるはずです。

Rails 側からストアドプロシージャを呼び出す

呼び出しには find_by_sql を利用します。

posts = Post.find_by_sql("CALL sampleProc()")

また ActiveRecord::Base.connection.execute を使う場合、事前にコネクションの情報を取得しておき、適宜 flush を行ってあげる必要があります。

db = ActiveRecord::Base.connection.raw_connection
Post.connection.execute("CALL sampleProc()") # これはOK
Post.connection.execute("CALL sampleProc()") # 二回目はNG
db.next_result if db.more_results? # flush してあげる
Post.connection.execute("CALL sampleProc()") # これで再びOKに