改めてPerlからOracleに接続する方法のまとめ
環境はCygwin + Oracle Instant Client + DBD::Oracleですが、どこでも同じようなものです。
インストール
Instant Client Downloadsに行き、コンパイルに必要な「Instant Client Package - SDK」をダウンロードして展開します。
展開した先(/usr/local/instantclient_10_2等)をORACLE_HOMEとして設定します。
% export ORACLE_HOME=/usr/local/instantclient_10_2
続けてインストールします。
% cpan -f DBD::Oracle
テストはすっ飛ばしてもいいんじゃまいか。
確認
では確認。
接続
% perl -MDBI -e '$h=DBI->connect(qw(dbi:Oracle:SID USERNAME PASSWORD))' install_driver(Oracle) failed: Can't load '/usr/lib/perl5/site_perl/5.8/cygwin/auto/DBD/Oracle/Oracle.dll' for module DBD::Oracle: No such file or directory at /usr/lib/perl5/5.8/cygwin/DynaLoader.pm line 230. at (eval 3) line 3 Compilation failed in require at (eval 3) line 3. Perhaps a required shared library or dll isn't installed where expected at -e line 1 %
エラーです。ランタイムライブラリが無いからです。
ランタイムライブラリの導入
実行に必要な「Instant Client Package - Basic Lite(Instant Client Package - Basicでもいいです)」をダウンロードしてORACLE_HOMEに展開します。この時点でディレクトリ構成は以下のようになります。
/usr/local/instantclient_10_2/(*.dllとか*.jarとか) /usr/local/instantclient_10_2/sdk /usr/local/instantclient_10_2/sdk/demo /usr/local/instantclient_10_2/sdk/include /usr/local/instantclient_10_2/sdk/lib
tnsnames.ora
% perl -MDBI -e '$h=DBI->connect(qw(dbi:Oracle:SID USERNAME PASSWORD))' DBI connect('SID','USERNAME',...) failed: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor (DBD ERROR: OCIServerAttach) at -e line 1 %
おぅっ。$ORACLE_HOME/NETWORK/ADMIN/ディレクトリを作って、そこにtnsnames.oraを置きます。
完了
% perl -MDBI -e '$h=DBI->connect(qw(dbi:Oracle:SID USERNAME PASSWORD))' %