PL/SQL の OUT パラメータを取得するには?

サンプルコードで使用するパッケージのソース

CREATE OR REPLACE PACKAGE my_package IS
  PROCEDURE my_proc(a1 IN number, a2 IN varchar2, b1 OUT number, b2 OUT varchar2);
END;
/
CREATE OR REPLACE PACKAGE BODY my_package IS
  PROCEDURE my_proc(a1 IN number, a2 IN varchar2, b1 OUT number, b2 OUT varchar2) IS
  BEGIN
    b1 := a1 * 2;
    b2 := UPPER(a2);
  END;
END;
/

ruby-oci8 API

明示的に名前でもってパラメータをバインドする。

 # use OCI8::Cursor#bind_param and OCI8::Cursor#exec
 cursor = conn.parse('begin my_package.my_proc(:a1, :a2, :b1, :b2); end;')
 cursor.bind_param(':a1', 123)
 cursor.bind_param(':a2', 'abc')
 # Fixnum としてバインド。値は NULL
 cursor.bind_param(':b1', nil, Fixnum)
 # String としてバインド。文字列の最大長は 20 で、値は NULL。
 cursor.bind_param(':b2', nil, String, 20)
 cursor.exec()
 # パラメータを名前でバインドしたときは名前を使用。
 p cursor[':b1'] # => 246
 p cursor[':b2'] # => ABC

明示的に位置でもってパラメータをバインドする。

 # use OCI8::Cursor#bind_param and OCI8::Cursor#exec
 cursor = conn.parse('begin my_package.my_proc(:a1, :a2, :b1, :b2); end;')
 cursor.bind_param(1, 123)
 cursor.bind_param(2, 'abc')
 cursor.bind_param(3, nil, Fixnum)
 cursor.bind_param(4, nil, String, 20)
 cursor.exec()
 # パラメータを位置でバインドしたときは位置を使用。
 p cursor[3] # => 246
 p cursor[4] # => "ABC"

暗黙的にパラメータをバインドする。

 # use OCI8::Cursor#exec with bind parameters.
 cursor = conn.parse('begin my_package.my_proc(:a1, :a2, :b1, :b2); end;')
 cursor.exec(123, 'abc', [nil, Fixnum], [nil, String, 20])
 # 1番目の引数は1番目の位置のバインド値となる。
 # 2番目は2番目のバインド位置....。
 # 値が配列のときは、配列の最初の要素がバインドする値で、
 # 2番目の要素が型、3番目の要素は最大長となる。
 # パラメータは位置でもってバインドされる。
 p cursor[3] # => 246
 p cursor[4] # => "ABC"

実行してバインドパラメータの値を一回で取得する。

 # OCI8#exec with bind parameters
 # 実行する SQL が PL/SQL ブロックの場合は、パラメータすべての値を配列で戻す。
 params = conn.exec('begin my_package.my_proc(:a1, :a2, :b1, :b2); end;',
                     123, 'abc', [nil, Fixnum], [nil, String, 20])
 p params[0] # => 123
 p params[1] # => "abc"
 p params[2] # => 246
 p params[3] # => "ABC"

DBD::OCI8

Ruby/DBI そのものは OUT パラメータをサポートしていません。DBDドライバ固有の 関数でサポートされます。

 sth = dbh.prepare('begin my_package.my_proc(?, ?, ?, ?); end;')
 sth.bind_param(1, 123)
 sth.bind_param(2, 'abc')
 # NULL値をバインドするために type アトリビュート付きで nil を使う。
 sth.bind_param(3, nil, {'type' => Fixnum})
 # しかし、文字列の場合は最大長を指定する方法がないため、NULL値は
 # バインドできない。
 sth.bind_param(4, ' ' * 20)
 sth.execute
 # DBDドライバ固有関数を呼び出す。
 p sth.func(:bind_value, 3) # => 246
 p sth.func(:bind_value, 4) # => "ABC"

Rails (ActiveRecord)

生のコネクションを取得して、ruby-oci8 API で使用する。

 conn = ActiveRecord::Base.connection.raw_connection
 ...
更新日時:2007-01-24 14:07:06 UTC
キーワード:
参照:[FAQ] [SideMenu]