1. インストール・設定
  2. プログラム
  3. CGI
  4. トラブル

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にアクセスするサンプルプログラムを作成します。

  • テストデータの準備

  • Oracleのテストデータは以下のページをもとに作成しておきます。

  • サンプルプログラム

  • 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

  • CentOSにおいて、yumでhttpdをインストールしてデフォルトのまま変更していない場合、httpd.confを以下の赤い部分のように変更します。

    /etc/httpd/conf/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サンプル

  • 以下のようなサンプルCGIを作成します。

    /var/www/cgi-bin/index.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 state
    CentOSの場合、yumでperl-YAMLをインストールすればOKです。
    # yum install perl-YAML
    DBIを入れ直します。
    # 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.