改めて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
PATHの設定

ORACLE_HOMEをPATHに追加します。

% export PATH="$ORACLE_HOME:$PATH"
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))'
%