hash は、
{'S'=>srvname, 'U'=>user, 'P'=>psw,
'lang'=>language, 'timeout'=>time-out, 'async'=>boolean,
'login-timeout'=>login-timeout,
'appname'=>applicatin-name 'hostname'=>host-name }
の形式を取り、それぞれのキーと値の組合せは以下のようになります。
context_class には、SybSQLContext
の サブクラスを指定してください。
デフォルト(SybSQLContext)で定義し
ているメッセージコールバックメソッドを再定義したい時に使います。
query = SybSQL.new({'S'=>'SYBSRV01','U'=>'sa','P'=>'XXXXXX',
'lang'=>'ja_JP.ujis'} )
class MyContext < SybSQLContext
def srvmsgCB( con,msghash)
print "My server-callback\n"
end
end
query = SybSQL.new({'S'=>'SYBSRV01','U'=>'sa','P'=>'XXXXXX'}, MyContext)
commandには1トランザクションで実行できる複数のSQLコマン ドを指定することも可能です。
例
query.sql('select * from sysservers')
raise "ERROR: SELECT" unless (query.cmd_done? )nbindはバインドする最大カラム番号を指定します。通常は全てバイ ンドするのでnilを指定して下さい。
| cmd | SybCommand オブジェクト |
| st | SybConstant::CS_SUCCEED または SybConstant::CS_ROW_FAIL |
| col | カラム名配列 |
| row | ローデータの配列 |
| true | rowをresultメソッドが返す結果に加える |
| nil | rowをresultメソッドが返す結果に加えない。 (巨大ローを検索する時に、メモリを節約するのに使える) |
| false | fetch をキャンセルする。 |
query.sql("select title_id, notes from titles"){
|cm,s,c,r|
note = r[1]
# get first sentence
if( note =~ /^([^\.]*)\./io ) then
print r[0],"\t",$1,"\n"
end
nil # Not use SybResult
}
成功すると true、失敗すると false を返します。
例
raise "ERROR: USE DB" unless query.sql_norow('use master')
fetch_rowfail(true) なら、CS_ROW_FAIL のロー結果はデータとし て含まれますが、fetch_rowfail(false)なら、CS_ROW_FAIL のロー結果はnilと して、結果に含まれます。
デフォルトの振舞いは、fetch_rowfail(false) です。
| SyBaseデータ型 | rubyデータ型 |
|---|---|
| TINYINT | Integer |
| SMALLINT | Integer |
| INT | Integer |
| REAL | Float |
| FLOAT | Float |
| その他 | String |
type に指定可能なSybConstant定数は、
のいずれかです。例: 二つの結果ローをプリントする
query.sql("select * from table1\n select * from table2")
raise "failed, SELECT" unless (query.cmd_done? )
raise "No result in table1" unless (res = query.nth_results(0, CS_ROW_RESULT) )
res.rows.each {
|r| print " #{r.join('|')}\n"
}
raise "No result table2" unless (res = query.nth_results(1, CS_ROW_RESULT) )
res.rows.each {
|r| print " #{r.join('|')}\n"
}
nth_results(0, SybConstant::CS_ROW_RESULT)と同義
nth_results(0, SybConstant::CS_PARAM_RESULT)と同義
デフォルト状態では、1024 バイトに設定されています。
lg = false ならば、トランザクションログは取られません。 ただし、あらかじめ select into/bulkcopy オプションがDBに設定する必要 があります。
デフォルトでは、ログは取られない設定になっています
データは、image_transize() メソッドで指定したバイトづつ受信されます。
エラーが起きると、RuntimeError例外を発行します。
例 au_pix テーブルからのイメージデータ検索
query=SybSQL.new( {'S'=>'SYBASE', 'U'=>'sa', 'P'=>'XXXXXX'} )
raise "ERROR use pubs2" unless( query.sql_norow("use pubs2") )
# CS_OPT_TEXTSIZE (サーバが返す最大の Image/Text データサイズ)の拡張
unless( query.connection.setopt(CS_OPT_TEXTSIZE, 1024 * 1024)) then
$stderr.print("NG setopt(CS_OPT_TEXTSIZE)\n");
end
file = File.open("486-29-1786.ras","w") # 格納するファイルのオープン
query.image_transize(8192) # 転送サイズ設定
imgsize = 0
sql = "select au_id ,pic from au_pix where au_id = '486-29-1786'"
query.sql_getimage(sql, 2){
|rid,r,cid,clm, data|
if( data.kind_of?(String) )then
file.write(data)
imgsize += data.length
elsif (data.nil?) then
print "End of data\n"
file.close
end
}
print "Size=#{imgsize}\n"
SybIODesc オブジェクトは、Image/Text データを効率的に送信する場合に 必要になってきます。
返却値は 検索した SybIODescオブジェクトです。エラーが起きると、 RuntimeError例外を発行します。
エラーが起きると、RuntimeError例外を発行します。
転送する時のブロックサイズは、image_transizeメソッドで決定されます。
エラーが起きると、RuntimeError例外を発行します。
例 pubs2のau_pixテーブルに、新しいイメージデータを持つローを追加します。
query=SybSQL.new( {'S'=>'SYBASE', 'U'=>'sa', 'P'=>'XXXXXX'} )
# bulkcopy オプションを設定 (すでに設定されていれば必要ない)
raise "ERROR use master" unless( query.sql_norow("use master") )
query.sql("exec sp_dboption pubs2,'select into/bulkcopy',true")
raise "ERROR sp_dboption" unless (query.cmd_done? )
# sp_dboption の リターンステータスをチェック
raise "ERROR sp_dboption" if( query.top_status_result != 0 )
# checkpoint
raise "ERROR use pubs2" unless( query.sql_norow("use pubs2") )
raise "ERROR checkpoint" unless( query.sql_norow("checkpoint") )
# 新しいローを追加
sql = "insert au_pix (au_id,format_type ) values ('my-image-1', 'JPG')"
raise "ERROR insert" unless( query.sql_norow(sql) )
# Image項目をNULL で Update する (必須)
sql = 'update au_pix set pic=NULL where au_id = "my-image-1"'
raise "ERROR update" unless( query.sql_norow(sql) )
query.image_transize( 2048 ) # 転送サイズの設定
query.image_log( false ) # LOG は切捨て
# SybIODesc の検索
sql = 'select au_id,pic from au_pix where au_id = "my-image-1"'
query.sql_iodesc(sql,2)
iodesc = query.top_row_result.nthrow(0,1)
raise "Cannot fetch IODESC" unless( iodesc.kind_of?(SybIODesc) )
# ファイル my-image-1.jpg の内容を DB に転送する。
query.send_imagefile(iodesc, "my-image-1.jpg")
print "Success Insert image file\n"
csrname には、割り当てるカーソルの名前を指定します
langcmdにはカーソルボディを表す SQL コマンドストリングを指定します。
(参照: SybCommand#cursor_new)
rowcount には、1回のフェッチ要求で返されるロー数を指定します。
(参照: SybCommand#cursor_rows)
curopt には、カーソル割り当てのオプションを指定します。
(参照: SybCommand#cursor_new)
nbindはバインドする最大カラム番号を指定します。通常は全てバイ ンドするのでnilを指定して下さい。
ブロックそ指定すれば、1 ローを検索する度に、ブロックが呼び出され、 select, update, delete などのネストされたコマンド実行もできます
| cmd | SybCommand オブジェクト |
| st | SybConstant::CS_SUCCEED または SybConstant::CS_ROW_FAIL |
| col | カラム名配列 |
| row | ローデータの配列 |
| true | rowをresultメソッドが返す結果に加える |
| nil | rowをresultメソッドが返す結果に加えない。 (巨大ローを検索する時に、メモリを節約するのに使える) |
| false | fetch をキャンセルする。 |
例
sample/cursor_disp.rb 及び sample/cursor_update.rb を参考にしてく
ださい。