PerlのDBD::Oracleを使ってOracleに接続する方法
インストール・設定
-
CentOSにDBD::Oracleをインストール
Oracleのライブラリへのパスを設定しておきます。
# export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/xe/libインストールするのは、DBI、DBD::Oracle になります。
# cpan DBI ・・・ ・・・ # cpan DBD::Oracle ・・・ ・・・ PYTHIAN/DBD-Oracle-1.74.tar.gz /usr/bin/make test -- OK Running make install Prepending /root/.cpan/build/DBD-Oracle-1.74-mbT2hT/blib/arch /root/.cpan/build/ DBD-Oracle-1.74-mbT2hT/blib/lib to PERL5LIB for 'install' Files found in blib/arch: installing files in blib/lib into architecture depende nt library tree Installing /usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so Appending installation info to /usr/lib64/perl5/perllocal.pod PYTHIAN/DBD-Oracle-1.74.tar.gz /usr/bin/make install -- OK
プログラム
DBD::OracleをつかってPerlでOracleにアクセスするサンプルプログラムを作成します。
#!/usr/bin/perl use strict; use warnings; use utf8; binmode(STDOUT, ":utf8"); use DBD::Oracle; use Data::Dumper; test(); sub test { my $dbname = 'xe'; my $user = 'aji'; my $passwd = 'saba'; my $dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd); my $sth = $dbh->prepare("SELECT * FROM users"); $sth->execute; while (my $row = $sth->fetchrow_hashref) { print $row->{ID} .": " .$row->{NAME} . " " .$row->{CREATED}; print "\n"; } }
Oracleの場合、環境変数の設定が必要なので、以下を実行して環境変数を設定します。
$ . /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
環境変数を設定したら、サンプルスクリプトを実行します。 Oracleからデータを取得できると、以下のようになります。
$ perl test_dbd.pl 1: アジ 14-08-23 2: サバ 14-08-23
CGI
Apacheを使用してCGIからOracleにアクセスする場合も、Oracle用環境変数の設定が必要になります。 CGIの中で設定する方法もありますが、今回はApacheの方で設定します。
-
httpd.conf
-
CGIサンプル
CentOSにおいて、yumでhttpdをインストールしてデフォルトのまま変更していない場合、httpd.confを以下の赤い部分のように変更します。
・・・・ <Directory "/var/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all # 以下を追加 SetEnv ORACLE_HOME /u01/app/oracle/product/11.2.0/xe SetEnv ORACLE_OWNER oracle SetEnv NLS_LANG JAPANESE_JAPAN.AL32UTF8 </Directory> ・・・ ・・・ # 以下の先頭の"#"を除去して有効にする AddHandler cgi-script .cgi
以下のようなサンプルCGIを作成します。
#!/usr/bin/perl use strict; use warnings; use utf8; binmode(STDOUT, ":utf8"); use DBD::Oracle; print "Content-Type: text/html;\n\n"; test(); sub test { my $dbname = 'xe'; my $user = 'aji'; my $passwd = 'saba'; my $dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd); my $sth = $dbh->prepare("SELECT * FROM users"); $sth->execute; while (my $row = $sth->fetchrow_hashref) { print $row->{ID} .": " .$row->{NAME} . " " .$row->{CREATED}; print "\n"; } }
アクセスすると、以下のようにOracleのデータが表示されます。
トラブル
-
DBD::Oracleのインストール失敗
PerlのYAMLモジュールがインストールされていないと以下のようになります。
# cpan DBI ・・・ ・・・ Installing /usr/local/bin/dbilogstrip Appending installation info to /usr/lib64/perl5/perllocal.pod TIMB/DBI-1.631.tar.gz /usr/bin/make install -- OK Warning (usually harmless): 'YAML' not installed, will not store persistent stateCentOSの場合、yumでperl-YAMLをインストールすればOKです。
# yum install perl-YAMLDBIを入れ直します。
# cpan cpan> cpan> force install DBI CPAN: Storable loaded ok (v2.20) Going to read '/root/.cpan/Metadata' Database was generated on Sun, 17 Aug 2014 11:17:02 GMT Running install for module 'DBI' CPAN: YAML loaded ok (v0.70) Running make for T/TI/TIMB/DBI-1.631.tar.gz ・・・ ・・・ TIMB/DBI-1.631.tar.gz /usr/bin/make test -- OK Running make install Prepending /root/.cpan/build/DBI-1.631-1xgZFR/blib/arch /root/.cpan/build/DBI-1. 631-1xgZFR/blib/lib to PERL5LIB for 'install' Manifying blib/man1/dbiprof.1 Manifying blib/man1/dbiproxy.1 Manifying blib/man1/dbilogstrip.1 Files found in blib/arch: installing files in blib/lib into architecture depende nt library tree Installing /usr/local/lib64/perl5/auto/DBI/DBI.so Appending installation info to /usr/lib64/perl5/perllocal.pod TIMB/DBI-1.631.tar.gz /usr/bin/make install -- OK cpan[2]>
DBI, YAMLエラー
以下のようなエラーになる場合、DBIが無いことが原因でエラーになっているので、DBIをインストール
# cpan DBD::Oracle CPAN: Storable loaded ok (v2.20) Going to read '/root/.cpan/Metadata' Database was generated on Sun, 17 Aug 2014 11:17:02 GMT Running install for module 'DBD::Oracle' CPAN: Data::Dumper loaded ok (v2.124) 'YAML' not installed, falling back to Data::Dumper and Storable to read prefs '/ root/.cpan/prefs' Running make for P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz CPAN: Digest::SHA loaded ok (v5.47) CPAN: Compress::Zlib loaded ok (v2.021) Checksum for /root/.cpan/sources/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz ok ・・・ ・・・ CPAN.pm: Going to build P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/sh are/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/p erl5 /usr/share/perl5 .) at Makefile.PL line 21. BEGIN failed--compilation aborted at Makefile.PL line 21. Warning: No success on command[/usr/bin/perl Makefile.PL INSTALLDIRS=site] Warning (usually harmless): 'YAML' not installed, will not store persistent stat e PYTHIAN/DBD-Oracle-1.74.tar.gz /usr/bin/perl Makefile.PL INSTALLDIRS=site -- NOT OK Running make test Make had some problems, won't test Running make install Make had some problems, won't install Could not read '/root/.cpan/build/DBD-Oracle-1.74-vNg5Jp/META.yml'. Falling back to other methods to determine prerequisites
DBIがインストールできたら、再度実行。 もし、以下のようなエラーがでるなら、DBIインストール時にYAMLが無かった可能性があります。 対策としては、PerlのYAMLモジュールをインストール後、DBIを再インストールして、 DBD::Oracleも再インストールするようにします。
# cpan DBD::Oracle ・・・ Trying to find an ORACLE_HOME Your LD_LIBRARY_PATH env var is set to '' The ORACLE_HOME environment variable is not set and I couldn't guess it. It must be set to hold the path to an Oracle installation directory on this machine (or a machine with a compatible architecture). See the appropriate README file for your OS for more information. ABORTED! Warning: No success on command[/usr/bin/perl Makefile.PL INSTALLDIRS=site] Warning (usually harmless): 'YAML' not installed, will not store persistent state PYTHIAN/DBD-Oracle-1.74.tar.gz /usr/bin/perl Makefile.PL INSTALLDIRS=site -- NOT OK Running make test Make had some problems, won't test Running make install Make had some problems, won't install Could not read '/root/.cpan/build/DBD-Oracle-1.74-ChViU8/META.yml'. Falling back to other methods to determine prerequisites
# cpan cpan> cpan> foce install DBI ・・・ ・・・ cpan> force install DBD::Oracle ・・・ ・・・
Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so'
以下のようなテストプログラムを作成します。
#!/usr/bin/perl use strict; use warnings; use DBD::Oracle;シンタックスチェックをしてみると以下のようなエラーが起こります。
$ perl -c test_dbd.pl Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Or acle: libclntsh.so.11.1: 共有オブジェクトファイルを開けません: そのようなファイ ルやディレクトリはありません at /usr/lib64/perl5/DynaLoader.pm line 200. at test_dbd.pl line 6 Compilation failed in require at test_dbd.pl line 6. BEGIN failed--compilation aborted at test_dbd.pl line 6.
原因は共有ライブラリの設定をしていなかったからです。 そこで、以下のように設定ファイルを作成します。
# vi /etc/ld.so.conf.d/oracle.conf
/u01/app/oracle/product/11.2.0/xe/lib以下のコマンドで作成した設定を読み込めば、エラーが無くなるはずです。
# ldconfig
Oracle用環境変数設定エラー
DBD::OracleでOracleにアクセスする場合、Oracle用環境変数が設定されていないと 以下のようなエラーになります。 この場合は、ORACLE_HOMEなどの環境変数が設定されていないか、設定が間違っている可能性があります。
スクリプト実行でのエラーメッセージ
$ perl test_dbd.pl DBI connect('xe','aji',...) failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Li nux) env var or PATH (Windows) and or NLS settings, permissions, etc. at test_d bd.pl line 19 Can't call method "prepare" on an undefined value at test_dbd.pl line 21.
CGIでエラーになった場合、以下のようなエラーがApacheのエラーログに記録されます。
[Fri Aug 29 15:11:29 2014] [error] [client 192.168.56.1] DBI connect('xe','aji', ...) failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH ( Windows) and or NLS settings, permissions, etc. at /var/www/cgi-bin/index.cgi li ne 20 [Fri Aug 29 15:11:29 2014] [error] [client 192.168.56.1] Can't call method "prep are" on an undefined value at /var/www/cgi-bin/index.cgi line 22.