DBD::OCI8

DBD::OCI8 は Ruby/DBI 用のデータベースドライバです。 DBIの使い方は以下のページを参照してください。

ここでは DBD::OCI8 に特有の事柄のみを記述します。

リモート接続

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:dbname', 'username', 'password')

ローカル接続

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', 'username', 'password')

sysユーザで接続

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', 'sys', 'password_of_sys', {'Privilege' => :SYSDBA})

または

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', 'sys', 'password_of_sys', {'Privilege' => :SYSOPER})

OS認証

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', nil, nil)

非ブロッキングモード

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', 'username', 'password', {'NonBlocking' => true})

接続後は非ブロッキングモードで SQL が実行されます。

注意: データベースへの接続はブロッキングモードで行なわれます。

バインド変数

 require 'dbi'
 dbh = DBI.connect('DBI:OCI8:', 'username', 'password')
 sth = dbh.parse('INSERT INTO emp(ename, sal) VALUES (?, ?)')
 sth.execute('FOOMAN', 100)

明示的なデータ型の定義

 dbh = DBI.connect('DBI:OCI8:', 'username', 'password')
 sth = dbh.prepare('SELECT SYSDATE FROM DUAL')
 sth.func(:define, 1, Date) # fetch the 1st column as Date.
 sth.execute()

BLOB

BLOBデータの挿入:

 image = open('SagradaFamilia.gif', "rb").read()
 # BLOBカラムに 'EMPTY_BLOB()' を挿入する。
 sth = dbh.prepare("INSERT INTO photos(name, image) VALUES (?, EMPTY_BLOB())")
 sth.execute("Sagrada Familia")
 # 挿入された行の ROWID を得る。
 rowid = sth.func(:rowid) # call driver specific code.
 # 空の BLOB カラムを OCI8::BLOB として選択する。
 lob = dbh.select_one("SELECT image FROM photos WHERE ROWID = ?", rowid)[0] # 1st row, 1st column
 # データをLOBに書き込む。
 lob.write(image)

BLOBデータの更新:

 new_image = open('SagradaFamilia.gif', "rb").read()
 # BLOBカラムを OCI8::BLOB として選択する。行をロックするために 'FOR UPDATE' を付ける。
 lob = dbh.select_one("SELECT image FROM photos WHERE name = ? FOR UPDATE", 'Sagrada familia')[0]
 # OCI8::BLOB#write(data) で LOB にデータを書き込む。
 lob.write(new_image)
 # OCI8::BLOB#truncate(data.size) で長さを修正する。
 lob.truncate(new_image.size)

BLOBデータの取得:

 # BLOBカラムを OCI8::BLOB として選択する。
 lob = dbh.select_one("SELECT image FROM photos WHERE name = ?", 'Sagrada familia')[0]
 # OCI8::BLOB#read でデータを読み取る。
 image = lob.read()

BLOBデータの削除:

 # 対象行を削除
 dbh.do("DELETE FROM photos WHERE name = ?", 'Sagrada familia')

CLOB

CLOBデータの挿入:

 text = open('gutenberg.txt', "r").read()
 # CLOBカラムに 'EMPTY_CLOB()' を挿入する。
 sth = dbh.prepare("INSERT INTO books(title, content) VALUES (?, EMPTY_CLOB())")
 sth.execute("Project Gutenberg")
 # 挿入された行の ROWID を得る。
 rowid = sth.func(:rowid) # call driver specific code.
 # 空の CLOB カラムを OCI8::CLOB として選択する。
 lob = dbh.select_one("SELECT content FROM books WHERE ROWID = ?", rowid)[0] # 1st row, 1st column
 # データをLOBに書き込む。
 lob.write(text)

CLOBデータの更新:

 new_text = open('gutenberg.txt', "r").read()
 # CLOBカラムを OCI8::CLOB として選択する。行をロックするために 'FOR UPDATE' を付ける。
 lob = dbh.select_one("SELECT content FROM books WHERE title = ? FOR UPDATE", 'Project Gutenberg')[0]
 # OCI8::CLOB#write(data) で LOB にデータを書き込む。
 lob.write(new_text)
 # OCI8::CLOB#truncate(OCI8::CLOB#pos) で長さを修正する。
 # lob.truncate(new_text.size) は使わないでください。new_text.size はバイト単位で
 # 数を数えますが、#truncate の第一引数は文字の数です。
 lob.truncate(lob.pos)

CLOBデータの取得:

 # CLOBカラムを OCI8::CLOB として選択する。
 lob = dbh.select_one("SELECT content FROM books WHERE title = ?", 'Project Gutenberg')[0]
 # OCI8::CLOB#read でデータを読み取る。
 text = lob.read()

CLOBデータの削除:

 # 対象行を削除
 dbh.do("DELETE FROM books WHERE content = ?", 'Project Gutenberg')

出力パラメータ

 # DBMS_OUTPUT を有効にする。
 dbh.do("BEGIN DBMS_OUTPUT.ENABLE; END;")
  ... DBMS_OUTPUT.PUT_LINE を使用する。 ...
 # DBMS_OUTPUT.GET_LINE を使用して PUT_LINE された文字列を得る。
 dbh.prepare("BEGIN DBMS_OUTPUT.GET_LINE(?, ?); END;") do |sth|
   # 第一パラメータを長さ255の文字列としてバインド
   sth.bind_param(1, ' ' * 255)
   # 第二パラメータを整数としてバインド
   sth.bind_param(2, 0)
   while true
     sth.execute
     # 第二パラメータが0だったら出力データ有り
     break if sth.func(:bind_value, 2) != 0
     # 第一パラメータを出力する。
     puts sth.func(:bind_value, 1)
   end
 end
Last modified:2007/11/25 18:43:24
Keyword(s):
References:[SideMenu]