2007/07/05

Ruby with OCI8


サンプルコードで使用するパッケージのソース
CREATE OR REPLACE PACKAGE MIS_TEST01 IS
  PROCEDURE my_proc(a1 IN number, a2 IN varchar2, 
                    b1 OUT number, b2 OUT varchar2
  );
END;
/
CREATE OR REPLACE PACKAGE BODY MIS_TEST01 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;
/
明示的に名前でもってパラメータをバインドする。
# use OCI8::Cursor#bind_param and OCI8::Cursor#exec
sql = 'begin MIS_TEST01.my_proc(:a1, :a2, :b1, :b2); end;'
cursor = conn.parse(sql)
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
sql = 'begin MIS_TEST01.my_proc(:a1, :a2, :b1, :b2); end;'
cursor = conn.parse(sql)
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.
sql = 'begin MIS_TEST01.my_proc(:a1, :a2, :b1, :b2); end;'
cursor = conn.parse(sql)
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 ブロックの場合は、パラメータすべての値を配列で戻す。
sql = 'begin MIS_TEST01.my_proc(:a1, :a2, :b1, :b2); end;'
params = conn.exec(
  sql, 123, 'abc', 
  [nil, Fixnum], [nil, String, 20]
)
p params[0] # => 123
p params[1] # => "abc"
p params[2] # => 246
p params[3] # => "ABC"
http://ruby-oci8.rubyforge.org/ja/api_OCI8.html

沒有留言: