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