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"
キーワード:
参照:[FAQ] [SideMenu]