RoR から Oracle DB に接続する
拠ん所なき事由に依って、CentOS6.3上のRuby on Railsから既存の Oracle DB にアクセスすることになった。
その足跡を備忘録として書いておく。
flyman はOracle を知らない。で、取り敢えずは DB2/400 に接続しているのと同様の方法、すなわち、 DBI+ODBC の環境を構築することにしようとググッてみたところ、ruby-oci8 なるインターフェースがあるらしいと判った。これは単独でも、DBIと組み合わせても使えるようなので、これもインストールすることにした。
Oracle のドライバを入手する。
ドライバはOracleのサイトからDL出来るが、ユーザーアカウントが必要なので、無い人はアカウント登録をしておく。無料だ。
使用するのは、『Instant Client』ドライバだ。
Instant Clientのダウンロードサイトから、
instantclient-basic-linux-11.2.0.3.0.zip (またはinstantclient-basiclite-linux-11.2.0.3.0.zip)
instantclient-odbc-linux-11.2.0.3.0.zip
instantclient-sdk-linux-11.2.0.3.0.zip
instantclient-sqlplus-linux-11.2.0.3.0.zip
(現在の最新バージョン)を落としてくる。1番目は必須、2番目は、ODBC用、3番目は ruby-oci8 に必要、4番目はインタラクティブなツール SQL*Plus を使わなければ不要だ。今回は32bitバージョンを使用する。
これらにはそれぞれ、
oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm
oracle-instantclient11.2-odbc-11.2.0.3.0-1.i386.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm
oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.i386.rpm
というRPMパッケージも用意されている。こちらでも良いかも知れないが、flyman の環境では RPM でうまく行かず、ZIP バージョンでやり直してうまく行った。
落としてきた ZIP ファイルを同じディレクトリに解凍する。
flymanはインストール先を
/opt/Oracle
とした。
flyman は Windows 環境で解凍して CentOSにコピーしたのだが、実行ファイルに実行属性が付いていなかったので、実行属性を付けた。
ここで、後でインストールする OCI8 のために、
# cd /opt/Oracle
# ln -s libclntsh.so.11.1 libclntsh.so
と、リンクを張っておく。
環境変数を設定する。
/etc/profile.d/oracle.sh ファイルを作り、以下を記入する。
export ORACLE_HOME=/opt/Oracle
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME
export NLS_LANG=JAPANESE_JAPAN.UTF8
NLS_LANG は適宜設定する。
ODBCの設定ファイルを書く。
設定ファイルは、
/etc/odbcinst.ini
/etc/odbc.ini
の二つだ。1から手で書く必要はない。
ODBCの設定を追加するシェルスクリプトが用意されている。
# cd /opt/Oracle
# ./odbc_update.ini.sh /
実行時のパラメータ DriverManagerHome は “/” とする。
また、~/.odbc.ini が出来ているので、内容を /etc/odbc.ini (システムDSN)に追加する。
ここで、[]で囲われたDNS名とDSN=部分は、使用するDSN名称に変更する。
また、ServerNameも環境に合わせて書き換える。
ServerName = サーバー名:ポート/サービス名
といった具合だ。
ServerName = 192.168.0.100:1521/orcl
みたいな感じ。
なお、GUIのDSNツールは使えなかった。
tnsnames.ora を書く。
このファイルの置き場所は環境変数 TNS_ADMIN で指定した場所だ。今回は /opt/Oracle 直下に作る。内容は、
MyOracle =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = orcl))
)
こんな感じだ。書き方はググれば色々出てくるだろう。
/etc/hosts に、自分自身を追記する。
127.0.0.1 localhost localhost.localdomain HOST名 HOST名.ドメイン名
これがないと、sqlplusで ORA-21561 エラーになる。――ならないこともあるみたい。ややこしい。
ruby-oci8 を落としてくる。
場所は、冒頭のリンクから辿れる。flyman はソースから、
make
make install
した。
以上でインストールと設定は完了だ。
接続テストをする。
isqlなら、
isql MyOracle ユーザー名 パスワード -v
SQL*Plusなら、
sqlplus ユーザー名/パスワード@サーバー名:ポート/サービス名
または
sqlplus ユーザー名/パスワード@MyOracle
で、接続出来ればメデタシメデタシだ。
ruby でも試してみよう。test.rb を以下のように書いて、ruby test.rb してみる。
require “oci8″
print “Using OCI8\n”
begin
conn = OCI8.new("ユーザー名”,"パスワード”,"192.168.0.100:1521/orcl")
cursor = conn.exec("select VALUE from NLS_DATABASE_PARAMETERS where PARAMETER=’NLS_CHARACTERSET’")
puts “Server Character: ” + cursor.fetch()[0]
cursor.close
ensure
conn.logoff if conn
end
DBI+ODBC のテストプログラムも書いてみる。
require “rubygems”
require “dbi”print “Using DBI+ODBC\n”
begin
conn = DBI.connect("DBI:ODBC:MyOracle”,"ユーザー名”,"パスワード")
row = conn.select_one("select VALUE from NLS_DATABASE_PARAMETERS where PARAMETER=’NLS_CHARACTERSET’")
puts “Server Character: ” + row[0]
ensure
conn.disconnect if conn
end
いやはや、こうして書けばなんと言うこともないのだが、一週間も格闘してしまった。ちなみに、Windows版のInstant Client にも多々問題があったが、linuxよりは繋がりやすかった。
関東地方、明日はまた雪の予報。すでに午前中の電車の間引きが決定している。気が重いねぇ。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/876
HVAC Repair
flyman のおもちゃ箱 - PhotoLog : RoR から Oracle DB に接続する by flyman
Trackback by maytag electric dryer repair — 2018年7月20日(金曜日) @ 03時23分12秒