免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2114 | 回复: 0
打印 上一主题 下一主题

如何在Solaris8下使用DBI连接Oracle数据库? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-22 02:16 |只看该作者 |倒序浏览
Solaris8之后已经带有Perl,但其自带的Perl版本有一定的局限性,无法编译并使用DBI模块。以下是从Perl连接Oracle的几个基本步骤,在Solaris8上测试通过,贴出来与大家讨论。

首先,卸载Solaris本身带的Perl。Solaris8的安装包是SUNWpl5u (Perl 5.005_03),版本太低,不支持新的DBI模块1.42,但老一些的版本可以支持,比如说1.32。最主要的问题是,Solaris缺省的Perl是用Sun的CC编译器编译的,加入DBI模块时,它要寻找CC编译器,如果系统中没有Sun的CC的话,编译就不能继续。Sun的CC编译器是比较昂贵的,对于我们常用gcc的来说,使用Sun自带的Perl很难扩展其功能。我们可以安装一个gcc编译的Perl克服这一问题。

* 查询是否系统中带有Solaris的Perl,用:
* pkginfo | grep –i perl

* 删除Solaris的Perl, 用:
* pkgrm SUNWpl5u

可能系统中还存在另两个Perl文档的安装包,也可以一并删除。如果不想删除自带的Perl包的话,可以备份/usr/bin/perl文件,比如说备份为:

* mv /usr/bin/perl /usr/bin/perl.sun

然后进行gcc Perl的安装。这样要恢复回来,只要重新命名这一文件就可以了。

其次,安装编译Perl。可以从网上下载Perl的源码,然后使用缺省configure就可以了。如果系统中没有gcc的话,可以用Sun的"Software Companion CD"里安装,安装后路径位于/opt/sfw下,也可以从http://www.sunfreeware.com上下载相应的版本。可以把Perl安装在单独的目录之下,这样便于以后的升级和管理,比如说/opt/SMCperl下。也可以从sunfreeware站点上直接下载编译后的Perl,当前的版本是5.8.3,安装后位于/usr/local/bin下。为避免不打乱原来程序的连接关系,把perl文件链接到/usr/bin下。

* ln –sf /opt/SMCperl/bin/perl /usr/bin/perl

接下来就可以安装DBI模块了。这一模块可以从http://dbi.perl.org上下载。安装过程跟一般的模块相同,perl Makefile.PL; make;make install。DBI模块提供了跟数据库的接口,但要与某一数据库连接,带必须安装相应的DBD模块。每一特定的数据库都有其特定的DBD模块(驱动),对Oracle来说,这一模块可以从以下站点上下载(http://search.cpan.org/~timb/DBD-Oracle-1.15)。

如果使用64位的数据库的话,直接编译DBD-Oracle的源码会有问题,因为缺省的make文件会指向的Oracle的64位库文件。gcc要求所有的库文件位数相同才可以进行编译。另外,较低版本的gcc并不支持编译64位的二进制文件。我用的是9i的64bit,gcc是2.95的,用了“-m64”后仍然有错误。以下是错误信息:

* ld: fatal: file /u01/oracle/product/9.2.0/lib//libclntsh.so: wrong ELF class: ELFCLASS64

如果出现这一错误的话,可以编辑DBD:Oracle的Makefile,然后把所有指向”9.2.0/lib”的都改为” 9.2.0/lib32”。重新编译就可以了。

最后,可以测试一下连接了。以下是一段测试代码。

* orahost是数据库的主机名。
* dbuser是连接数据库的用户名。
* dbpass是用户的密码。

*****************************************************
#!/usr/bin/perl -w

use DBI;

my $dbh = DBI->;connect('DBI:Oracle:host=orahost;sid=SIDNAME;port=1521','dbuser','dbpass');
my $sql = qq{ select table_name from user_tables };
my $sth = $dbh->;prepare( $sql );
$sth->;execute();

while (my ($table_name) = $sth->;fetchrow_array()) {
        print $table_name, "\n";
}

$sth->;finish();
$dbh->;disconnect();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP