Railsでストアドを呼び出して結果を取得する方法
SQL Serverの場合
ストアドプロシージャを用意する。
INの文字列をテーブル登録して、OUT='okaeshi'、888を返す訳分からんプロシージャ。
CREATE PROCEDURE TEST_PROC @Param1 varchar(10) , @Param2 varchar(100) OUTPUT AS BEGIN INSERT INTO TESTS(COLUMN1) values(@Param1) SELECT @Param2 = 'okaeshi' RETURN 888 END
SQL Serverのストアド用モデルを用意する。
class SqlServerStoredProcedure < ActiveRecord::Base def self.proc_exec(sql) find_by_sql(sql) end establish_connection "sqlsvr" end
呼び出し方
sql = "declare @rtn int" sql += ",@Param2 varchar(100);" sql += "exec @rtn = test_proc" sql += " @Param1 = N'" + "ACBDEFG" + "'" sql += ",@Param2 = @Param2 output;" sql += "select 'rtns' = @rtn" sql += ",Param2 = @Param2;" @rtns = SqlServerStoredProcedure.proc_exec(sql)
結果をViewに表示
結果はHashの配列で返されるので・・・
[{"rtns"=>888, "Param2"=>"okaeshi"}]
View側は次のように取り出す。
<p><%=h @rtns.first["rtns"] %></p> <p><%=h @rtns.first["Param2"] %></p>
呼び出す時にSQLを作る必要があるのだが、もっとすっきりした方法がいいな・・・
Oracleの場合
参考:
http://mikebradford.org/2008/3/11/calling-an-oracle-stored-procedure-in-rails
ActiveRecord, Oracle and stored procedures | Software bits and pieces
ストアドプロシージャを用意する。
INの文字列をOUTで返すプロシージャ。
create or replace procedure testproc( instr in char , outstr out char ) as begin outstr := instr; end; /
Oracleのストアド用モデルを用意する。
class OraSp < ActiveRecord::Base def self.proc_exec conn = connection.raw_connection sql = "DECLARE outstr char(100); BEGIN testproc(:instr, outstr); :outstr := outstr; END;" cursor = conn.parse(sql) cursor.bind_param(":instr", "AAAAA") cursor.bind_param(":outstr", nil, String, 100) cursor.exec outstr = cursor[":outstr"] cursor.close outstr end establish_connection "oracle" end
呼び出し方
@outstr = OraSp.proc_exec
結果をViewに表示
<p><%=h @outstr %></p>
bind_paramで苦労した・・・
OUTパラメータは、プロシージャの引数の位置に設定できないみたい。
ダメだった例:
sql = "BEGIN testproc(:instr, ★:outstr★); END;"
OKだった例:
sql = "DECLARE outstr char(100); BEGIN testproc(:instr, outstr); ★:outstr★ := outstr; END;"