From: Hideto ISHIBASHI Date: 2000-12-21T23:44:09+09:00 Subject: [ruby-list:26701] Re: [Q] Oracle PL/SQL with bind vars 石橋秀仁です。こんばんは。 Yoshida Masato wrote: > よしだです > > Hideto ISHIBASHI writes: > > ところで、auto commitのようなのは用意されないのでしょうか? > > 実装は簡単だと思ったんで作ってみたんすが・・・ > > 望ましい仕様というのがどうなのかよくわからなかったので・・・ (^^; > > 必要性を感じたことが無かったので入れてなかったのですが,確か > に簡単そうだったのでとりあえず実装してみました。 > > http://www.yoshidam.net/oracle-0.2.10.tar.gz よしださん、素早い対応ありがとうございます。 #あまりに素早くて驚きました (^^; てっきりファイナライザを使ってコミット処理を書くのかと 思っていましたが、OCIで提供されている機能で実現できたのですね。 安心して使わせていただくことができます。 ちなみに、自動コミットが欲しいな、と思ったきっかけですが、 動的ウェブサイトで人気の言語PHPの、Oracle8関数(OCI8)では、 自動コミットが標準です。 : int OCIExecute (int statement [, int mode]) : (略)オプションのmodeにより実行モードを指定することが可能とです。 : (デフォルトはOCI_COMMIT_ON_SUCCESSです) 自動的にコミット : されたくない場合は、OCI_DEFAULTをモードとして指定します。 ぼくは明示的でない自動コミットがデフォルトになっているのは、 気持ち悪くてヤです (^^; でも、デフォルトで非自動コミットモードであれば、 選択肢として自動コミット機能もあっていい、と思ったのでした。 ところで、簡単に使いたい向き(=僕^^;)のために、 Oracle#exec のイテレータ呼び出し機能を書いてみました。 メール末尾にパッチを添付しました。 これを使うと、 conn = Oracle.new("scott", "tiger") conn.exec("select * from foo") { |r| print(r.join("\t"), "\n") } conn.logoff と書けて、エラー処理などいらない場合は簡単です。 あるいは、同じ内容を一行野郎で、 ruby -r oracle -e 'Oracle.new("scott", "tiger").exec("select * from foo") { |r| print(r.join("\t"), "\n") }' と書けるのが僕にとっては嬉しい点です。 ただし迷った点がありました。yieldループ(# for each row)の中で、 Oracle::Cursor#fetchがraiseしたOCIErrorを無視するかどうか。 どうすべきか迷ったので、お任せします (^^; #File#openのイテレータ呼び出し時と(比較して、類推しやすく) #合わせるのが自然でしょうか。 diff -cr oracle-0.2.10.orig/lib/oracle.rb oracle-0.2.10/lib/oracle.rb *** oracle-0.2.10.orig/lib/oracle.rb Thu Dec 21 16:19:12 2000 --- oracle-0.2.10/lib/oracle.rb Thu Dec 21 22:51:11 2000 *************** *** 34,40 **** end def exec(sql, *bindvars) ! Oracle::Cursor.new(@conn, sql, *bindvars) end def parse(sql) --- 34,51 ---- end def exec(sql, *bindvars) ! cursor = Oracle::Cursor.new(@conn, sql, *bindvars) ! if iterator? ! begin ! cursor.fetch { |row| yield(row) } # for each row ! rescue OCIError ! # re-raise or ignore? ! ensure ! cursor.close # if cursor ! end ! else ! cursor ! end end def parse(sql) 心配性なもので、無駄なコメントが入っています。無視してください (^^; それでは。 -- Hideto "rubyholic" ISHIBASHI http://www.rr.iij4u.or.jp/~hideto-i/