end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

perl DBD::Oracle によるoracle dbへの接続

急遽、oracleデータベースの必要に駆られ...
DBD::Oracleをインストール / CentOS・Red Hat Linux実践テクニック - サンプルコードによるPerl入門
↑こちらを参考にさせて頂きながら、colinux環境へ↓こちらをインストール。
DBD::Oracle - search.cpan.org
ありがとうございました。 > perlcodesample さん

oracleクライアントツール群のinstall

Instant Client for Linux x86 のダウンロード
まず、3つのrpmパッケージをinstall

$ su -
# rpm -ivh oracle-instantclient12.1-basic-12.1.0.1.0-1.i386.rpm
# rpm -ivh oracle-instantclient12.1-devel-12.1.0.1.0-1.i386.rpm
# rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.1.0-1.i386.rpm

oracleクライアントツール用の環境変数設定

/etc/profile.d/oracle.sh を作成し、ORACLE_HOME , C_INCLUDE_PATH , LD_LIBRARY_PATH を登録

$ su -
# vi /etc/profile.d/oracle.sh
export ORACLE_HOME='/usr/lib/oracle/12.1/client'
export C_INCLUDE_PATH='/usr/include/oracle/12.1/client'
export LD_LIBRARY_PATH='/usr/lib/oracle/12.1/client/lib'

※ /etc/ld.so.conf の設定は未実施...なくても動作したので

/etc/hosts にlocalhost(クライアント, 自分)を登録

$ su -
# vi /etc/hosts
127.0.0.1 localhost colinux

DBD::Oracle のinstall

以下の通り

$ wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.66.tar.gz
$ tar -zxcvf DBD-Oracle-1.66.tar.gz
$ cd DBD-Oracle-1.66
$ /usr/local/bin/perl Makefile.PL
$ make
$ make test
$ su
# make install

サンプルコード

#!/usr/local/bin/perl
use strict;
use utf8;
use DBI;	#DBD::Oracle
use Data::Dumper;

my $DB_CONF =
    {host=>	'XXX.XXX.XXX.XXX',
     port=>	'1521',
     db_name=>	'ないしょ',
     db_user=>	'ないしょ',
     db_pass=>	'ないしょ',
     db_opt=>  {AutoCommit=> 0},
    };
my $DBH;

# $ENV{'ORACLE_HOME'} =   '/usr/lib/oracle/12.1/client';
# $ENV{'LD_LIBRARY_PATH'}='/usr/lib/oracle/12.1/client/lib';
# $ENV{'C_INCLUDE_PATH'}= '/usr/include/oracle/12.1/client';
# $ENV{'nls_lang'}="JA16SJISTILDE";
# $ENV{'nls_lang'}="JA16SJIS";


main();

sub main {
    $DBH = connect_db();
    chk_sql_1();
    chk_sql_2();
    $DBH->disconnect();
}

sub chk_sql_1 {
    my $sql =<<EOF;
select * from XXXXXX_y where C_XXXXXX=?
EOF
    my $sth = $DBH->prepare($sql);
    $sth->execute('XXXXXX');
    while( my $row = $sth->fetchrow_hashref){
        print STDERR Dumper($row);
    }
}

sub chk_sql_2 {
    my $sql =<<EOF;
select * from XXXXXX where C_XXXXXX=?
EOF
    my $sth = $DBH->prepare($sql);
    $sth->execute('7AP4UM');
    while( my $row = $sth->fetchrow_hashref){
        print STDERR Dumper($row);
    }
}

sub connect_db {

    my $db = join(';',
		  "dbi:Oracle:host=$DB_CONF->{host}",
		  "sid=$DB_CONF->{db_name}",
		  "port=$DB_CONF->{port}");
    my $db_uid_passwd = "$DB_CONF->{db_user}/$DB_CONF->{db_pass}";
    my $DBH = DBI->connect($db, $db_uid_passwd, "");
    return $DBH;
}