[ Home ] [ English | Japanese ]
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})
or
require 'dbi'
dbh = DBI.connect('DBI:OCI8:', 'sys', 'password_of_sys', {'Privilege' => :SYSOPER})非ブロッキングモード
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) # 一番目のカラムを Date として fetch
sth.execute()BLOB
To insert BLOB data:
image = open('SagradaFamilia.gif', "rb").read()
# BLOBカラムに 'EMPTY_BLOB()' を挿入する。
sth = dbh.prepare("INSERT INTO photo(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 photo WHERE ROWID = ?", rowid)[0] # 1st row, 1st column
# データをLOBに書き込む。
lob.write(image)
To update BLOB data:
new_image = open('SagradaFamilia.gif', "rb").read()
# BLOBカラムを OCI8::BLOB として選択する。行をロックするために 'FOR UPDATE' を付ける。
lob = dbh.select_one("SELECT image FROM photo 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)
To select BLOB data:
# BLOBカラムを OCI8::BLOB として選択する。
lob = dbh.select_one("SELECT image FROM photo WHERE name = ?", 'Sagrada familia')[0]
# OCI8::BLOB#read でデータを読み取る。
image = lob.read()
To delete BLOB data: 単純に DELETE するだけ。
CLOB
To insert CLOB data:
text = open('gutenberg.txt', "r").read()
# CLOBカラムに 'EMPTY_CLOB()' を挿入する。
sth = dbh.prepare("INSERT INTO book(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 book WHERE ROWID = ?", rowid)[0] # 1st row, 1st column
# データをLOBに書き込む。
lob.write(text)
To update CLOB data:
new_text = open('gutenberg.txt', "r").read()
# CLOBカラムを OCI8::CLOB として選択する。行をロックするために 'FOR UPDATE' を付ける。
lob = dbh.select_one("SELECT content FROM book 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)
To select CLOB data:
# CLOBカラムを OCI8::CLOB として選択する。
lob = dbh.select_one("SELECT content FROM book WHERE title = ?", 'Project Gutenberg')[0]
# OCI8::CLOB#read でデータを読み取る。
text = lob.read()
To delete CLOB data: 単純に DELETE するだけ。
出力パラメータ
例:
# 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