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
Keyword(s):
References:[SideMenu]