Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103682818
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-30 15:52:55

折腾了两天,终于在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.

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(

按上述方法准备好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天半,实在无奈,
只好如链接
所说,重新编译Perl。
我用的是5.8.8, 在这里下载:

编译很简单,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上下(
)。
#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上下(
)。
#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
执行下列代码测试数据库访问。

Copy code


#!/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);
}
}

原文:http://arronxiao.blog.ccidnet.com/blog-htm-itemid-224668-do-showone-type-blog-uid-11600.html

阅读(552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~