|
折腾了两天,终于在HP-UX上装好了Oracle Instant Client 和Perl 的 DBD::Oracle,现在记录安装过程和注意点如下。 0) 安装环境 我的OS和Perl的环境是: # uname -a HP-UX SVSAF006 B.11.23 U ia64 2789703618 unlimited-user license # perl -version This is perl, v5.8.3 built for IA64.ARCHREV_0-thread-multi 。。。。。。 Binary build 809 provided by ActiveState Corp. http://www.ActiveState.com ActiveState is a division of Sophos. 。。。。。。 1) 安装Oracle Instant Client 我的Perl程序要访问Oracle DB,所以先要装Oracle客户端,我装的是版本是instantclinet 10.2.0.2 for hpux ia64, 需要basic,sdk,sqlplus三个包,如下: instantclient-basic-hpux-ia64-64-10.2.0.2-20060428.zip instantclient-sdk-hpux-ia64-64-10.2.0.2-20060428.zip instantclient-sqlplus-hpux-ia64-64-10.2.0.2-20060428.zip
Down下来的Zip包在Unix上的解压方法,参看 各种UNIX版本下的ZIP压缩解压缩工具PKZIP(http://www.loveunix.cn/html/11/t-68911.html) 按上述方法准备好PKZIP后,执行“pkzip25 -extract xxx.zip”即可解压Zip文件。
解压basic,sqlplus后拷贝到/opt/oracle/lib下,sdk解压后拷贝到/opt/oracle/sdk,为了方便,建议拷贝sqlplus命令到/usr/bin/下。
配置Oracle客户端 1.1) 设置环境变量LD_LIBRARY_PATH 和 ORACLE_HOME # export LD_LIBRARY_PATH=/opt/oracle/lib # export ORACLE_HOME=/opt/oracle
1.2)编辑tnsnames文件 编辑listener.ora sqlnet.ora tnsnames.ora 三个文件,放到$ORACLE_HOME/network/admin/下,三文件的内容如下, 注意修改红色部分连到自己环境的Oracle DB。 # ls $ORACLE_HOME/network/admin listener.ora sqlnet.ora tnsnames.ora # cd $ORACLE_HOME/network/admin # cat tnsnames.ora YOURDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ip of oracle server)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = yourdbservice) ) )
EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )
# cat listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /opt/oracle) (PROGRAM = extproc) ) )
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =ip of client)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
# cat sqlnet.ora SQLNET.AUTHENTICATION_SERVICES = (NTS)
1.3)测试数据库连接 # sqlplus [url=mailto:yourdbusername/yourdbpassword@YOURDB]yourdbusername/yourdbpassword@YOURDB SQL*Plus: Release 10.2.0.2.0 - Production on Thu Dec 20 16:46:04 2007 Copyright (c) 1982, 2005, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production With the Partitioning, OLAP and Data Mining options SQL> select sysdate from dual; SYSDATE --------- 20-DEC-07
SQL> quit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production 至此,Oracle客户端搞定!
2) 重新编译安装Perl 我的缺省的Perl是5.8.3,就这个版本的Perl,我试了N个版本的DBD::Oracle都无法装上去,折腾了1天半,实在无奈, 只好如链接 http://search.cpan.org/~pythian/DBD-Oracle-1.19/README.hpux.txt 所说,重新编译Perl。 我用的是5.8.8, 在这里下载: http://www.perl.org/ 编译很简单,Down下来解压到perl-5.8.8,执行下述命令即可(如果不是HP UX IA64, Configure行应有所不同,请参看Perl的Readme)。 #cd perl-5.8.8 #sh ./Configure -A prepend:libswanted='cl pthread ' -Duse64bitall -des #make #make test #make install
make test时有2个失败,不过好像没影响。装好后注意将 /usr/bin/perl连接到新版的Perl。
3) 安装DBI DBI是Perl的数据库访问统一接口,类似于Java的JDBC。DBI安装很简单,下载解压DBI,我用的是最新的1.601,从Cpan上下(http://www.cpan.org/)。 #cd DBI-1.601 #perl Makefile.PL #make #make test #make install
4) 编译安装DBD::Oracle 4.1 修改DBD-Oracle-1.19下的Makefile.PL文件 由于我用的是Oracle Instant Client,缺省情况下,DBD Oracle找不到编译所需的Oracle的头文件,必须修改代码告诉它。查找Makefile.PL中的“h_dirs”行,注释掉(如下#行)。将my $inc行改成红色部分,即告诉它到哪去找oracle的.h文件,我们的.h文件放在$ORACLE_HOME/sdk下。 # my @h_dirs = find_headers(); if ($client_version_full =~ /^8.0.6/ && $os eq 'hpux') { $linkwith_msg = "-lextp -l$lib."; $opts{LIBS} = [ "-L$OH/$libdir -lextp -l$lib $syslibs" ]; # push @h_dirs, "$OH/network/public"; } else { $linkwith_msg = "-l$lib."; $opts{LIBS} = [ "-L$OH/$libdir -l$lib $syslibs" ]; } # my $inc = join " ", map { "-I$_" } @h_dirs; my $inc = "-I/opt/oracle/sdk";
4.2 编译安装 由于make test 时要连接数据库,因此先设好两个数据库连接的User变量: #export ORACLE_USERID=yourdbusername/yourdbpassword #export [url=mailto:ORACLE_SID=@YOURDB]ORACLE_SID=@YOURDB
下载解压DBD::Oracle,我用的是最新的1.19,从Cpan上下(http://www.cpan.org/)。 #cd DBD-Oracle-1.19 #perl Makefile.PL -l #make #make test #make install
注意perl Makefile.PL -l 行的 -l 参数。make test时有很多错,不过好像没关系,Perl程序能正常使用Oracle。
5) 测试Perl程序连Oracle 执行下列代码测试数据库访问。
#!/usr/bin/perl -w # use DBI; &Main(); sub Main{ &selectData(); } sub RFTDB_Connect { my $conn = dbi:Oracle:host=ip of Oracel server ;sid=your database name; my $connUser="yourdbusername"; my $connPass="youdbpassword"; if(!$RFT_Parser_Common_DBConnection ){ eval{ $RFT_Parser_Common_DBConnection = DBI->connect($conn,$connUser,$connPass) or die $DBI::errstr; }; if($@ ){ print "Error: $@ \n"; exit(1); } } return $RFT_Parser_Common_DBConnection; } sub RFTDB_Disconnect { if($RFT_Parser_Common_DBConnection ){ $RFT_Parser_Common_DBConnection->disconnect(); $RFT_Parser_Common_DBConnection =0; }else{ print "DB is not opened, does nonthing."; } } sub selectData{ my $hDB=""; my $recs=""; $hDB = RFTDB_Connect(); eval{ my $sql = "select sysdate from dual"; my $sth = ($hDB->prepare($sql) or die "ERROR DB Access" . $DBI::errstr ); $sth->execute() or die "ERROR DB Access" . $sth->errstr ; $recs = ($sth->fetchall_arrayref or die "ERROR DB Access" . $sth->errstr ); my ($i,$j); foreach $i (0...$#$recs){ foreach $j (0...$#{$recs->[$i]}){ print "$recs->[$i][$j]\t"; } print "\n"; } $sth->finish; RFTDB_Disconnect(); print "SQL excute OK:\n$sql\n"; }; if($@){ print "ERROR: $@\n"; RFTDB_Disconnect(); exit(1); } }
|
一共有 0 条评论