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に