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 を参考にしてく
ださい。