Rubyからオラクルに接続する(Linux,Windows両対応版!)

Rubyでオラクルに接続して、なにやらする方法です。
基本http://ruby-oci8.rubyforge.org/ja/index.htmlここ参考

今回の動き

今回はWindowsにサーバーを立てて、そこにWindows上で動くRubyからDBのテーブル読みと、Linuxで動くRubyからのDBのテーブル読みをやってみる

構成はWindowsはサーバで同一マシンでクライアントもやる。だからWindowsはローカルローカルのつながり

Linuxは別マシンでWindowsに接続にいくから、リモートの関係でやってます。

Windowsはxp pro LinuxRed Hat Enterprise Linux 4だったかな
ラクルは10g
Windowsへのオラクルインストールはこちら参考・・・だけど別にダブルクリックだけなんで何したわけでもないですけど
http://yakinikunotare.boo.jp/orebase/index.php?Windows%A4%CB%A5%D5%A5%EA%A1%BC%A4%CE%A5%AA%A5%E9%A5%AF%A5%EB%A4%F2%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

windowsクライアント準備

Oracle Database 10g Express Edition Downloads
http://www.oracle.com/technology/software/products/database/xe/index.html
クライアントをインストール

サーバを入れていればクライアントも同時に入っている。これはインストーラー一発。オラクルのクライアントが必要なのは、Rubyのモジュールがオラクルクライアントを使うからです。

ラクルへの接続モジュール導入(Windows編)

RubyForge: Ruby/OCI8: ファイルリスト
http://rubyforge.org/frs/?group_id=256
ここから、ruby-oci8-1.0.0-rc2-mswin32.rbをダウンロード、Windowsはバイナリ版が提供されているのでコンパイルいらず、楽チンです。

ダウンロードしてこんな感じでぶち込む

ruby ruby-oci8-1.0.0-rc2-mswin32.rb

聞かれますので

 Copy OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8
 Copy oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8
 Copy oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
 OK?
 Enter Yes/No:

もちろんYes

 Copying OCI8.rb to c:/ruby/lib/ruby/site_ruby/1.8/DBD/OCI8 ... done
 Copying oci8.rb to c:/ruby/lib/ruby/site_ruby/1.8 ... done
 Copying oci8lib.so to c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt ... done
 OK

完了
早速接続してみる

Rubyから接続(Windows版)

このコードを書く前にWidnowsなら再起動する。
そうじゃないとパスを認識しないくて、実行時に

 OCI.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。 

なんて素敵なメッセージが表示されます

require 'oci8'
myOra = OCI8.new("ゆ〜ざ〜めい", "ぱすわーど","localhost")
myOra.exec('select * from hoge_tbl'){|r|
    puts r.join(',')
}

こんなんです。
すばらしく簡単にSQLがぶち込めますね
あとは自由自在にどうぞ

Linux版オラクルクライアント準備

Windowsで出来たので気をよくしてLinux版に挑戦です。
同じといえば同じですね。
Linuxにオラクルのクライアントをぶち込みます。

今回はRedhat系に入れるのでrpmが提供されているので、これを便利に使わせてもらいます

http://otn.oracle.co.jp/tech/oci/instantclient/instantclient.html

ここからダウンロードします
めちゃくちゃ同意とか、登録とか書かないとダウンロードできません
この時点で使う気がうせます・・・

  • Instant Clientパッケージ - 基本 :
  • Instant Clientパッケージ - SDK

この二つをダウソ
最新版にはrpmパッケージが用意されていないので少し古いバージョンを使います

いろいろ面倒なので、WindowsでダウンロードしてSCPとかで送り込みます

oracle-instantclient-basic-10.1.0.4-1.i386.rpm
oracle-instantclient-devel-10.1.0.4-1.i386.rpm
rpm -i oracle-instantclient-basic-10.1.0.4-1.i386.rpm
rpm -i oracle-instantclient-devel-10.1.0.4-1.i386.rpm

ここにインストールされる

/usr/lib/oracle/10.1.0.4/client/lib

なのでライブラリのサーチパスに追加する

LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.4/client/lib

※追記される場合は追記するように書いてくださいw
有効化

export LD_LIBRARY_PATH

LinuxRuby接続モジュールコンパイルインストール

この入ったライブラリを元に、Ruby用のオラクル接続モジュールをコンパイルしてインストールします

先ほどのサーチパス追加はその意味嘘情報でした。
さっきのパスの設定は実行時にも必要になります

ここから
http://rubyforge.org/frs/?group_id=256
ruby-oci8-1.0.0-rc2.tar.gz
こいつを落とす

今回はまったく認証とかいろいろ書かなくていいのでwgetでゲッツ

wget http://rubyforge.org/frs/download.php/19956/ruby-oci8-1.0.0-rc2.tar.gz

ガッツり完了
展開

tar xvzf ruby-oci8-1.0.0-rc2.tar.gz

これができる

ruby-oci8-1.0.0-rc2

移動

cd ruby-oci8-1.0.0-rc2

コンパイルします

make

ずらずら出てmake完了
インスコ

make install

完了

Linuxクライアント→Windowsラクルサーバ接続

次はこの状況で接続してみました
10gから簡易接続(EZCONNECT)というやり方が使えるっぽいので早速こいつでコネします
まず
Windowsサーバ側でドスっと、コマンド打ち込んでみます。サーバと一緒にインストールされているはずです

lsnrctl service

こんなのがズラズラでます

サービス"XEXDB"には、1件のインスタンスがあります。
  インスタンス"xe"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "D000" 確立:0 拒否:0 現行:0 最大:1002 状態:ready
         DISPATCHER <machine: 自分のコンピュータ名, pid: 5868>
         (ADDRESS=(PROTOCOL=tcp)(HOST=自分のコンピュータ名)(PORT=2025))

これで自分のコンピュータで受け付けているサービスがXEXDBってことがわかります。これを簡易接続パラメータに組み込んで接続すると、ソースはこうなる

require 'oci8'
myOra = OCI8.new("ゆ〜ざ〜めい", "ぱすわーど","192.168.XXX.XXX:1521/XEXDB")
myOra.exec('select * from hoge_tbl'){|r|
    puts r.join(',')
}

うぉーまたも1日がかりの作業!ってかオラクルわかりにくいよ!慣れてないとダメダメです

実はこのrpmで入れたオラクルクライアントがwindows版よりも微妙に古いせいか、インスタント版なのかは知らんが微妙に性能が低いw

暗黙変換とかをやってくれなかったりします

↓このエントリーに関しての追加更新はたぶんこっちでやるので、満足されなかったかたはこちらもどうぞ
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2F%A5%AA%A5%E9%A5%AF%A5%EB%A4%CB%C0%DC%C2%B3%A4%B9%A4%EB

改訂新版 SQLポケットリファレンス (Pocket reference)

改訂新版 SQLポケットリファレンス (Pocket reference)