码迷,mamicode.com
首页 > 数据库 > 详细

linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBDOracle.pm in @INC 的解决办法

时间:2017-11-17 23:31:55      阅读:658      评论:0      收藏:0      [点我收藏+]

标签:target   记录   linux环境配置   archive   句柄   free   问题解决   应该   bin   

前言

接手前辈的项目,没有接触、安装、使用过perl和DBD::Oracle,也没有相关的文档记录,茫茫然不知所措~~。一开始发现这个问题,就想着迅速解决,就直接在google上搜报错信息,搜索的过程中发现 如果不搞清楚前因后果我连解决方案都‘看不见’‘看不懂’。 所以还是要补充这方面的知识,再思考解决方案。以下内容就是我一边学习一边解决问题的过程,如果不足,请各位大佬指出。
 

报错

技术分享图片

install_driver(Oracle) failed: Can‘t locate DBD/Oracle.pm in @INC (@INC contains:/home/as_user/PMS/Data-Update /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 12) line 3. Perhaps the DBD::Oracle perl module hasn‘t been fully installed, or perhaps the capitalisation of ‘Oracle‘ isn‘t right. Available drivers: DBM, ExampleP, File, Gofer, Pg, Proxy, SQLite, Sponge, mysql. at /home/as_user/PMS/Data-Update/SolexaDown.pl line 19

 

DBI相关知识

参考:菜鸟教程DBI相关

技术分享图片

技术分享图片

在perl中使用DBI的方法

1 #!/usr/bin/perl 
2 use DBI;                        #perl引入DBI模块
3 my $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $passwd);     #DBI根据输入的驱动程序对象的句柄调用对应的数据模块,返回一个数据库对象的句柄

 

这个时候我的脑海里出现了两个问题

1.代码中使用use,那use怎么知道DBI所在的目录,在哪里设置了,和@INC有什么关系???

2.DBI如何激活DBD::Oracle,寻找的路径是什么,在哪里,怎么设置,和@INC有什么关系???

上述问题可能会在配置DBD::Oracle中找到答案,所以我就先查询学习了配置过程

 

配置方法DBD::Oracle

参考:Linux环境配置DBD::Oracle模块

要点

1. DBD::Oracle模块不是Oracle官方开发的,由Pythian Group公司开发,网址为https://metacpan.org/pod/DBD::Oracle,下载该模块的地址https://metacpan.org/release/MJEVANS/DBD-Oracle-1.75_2 。当然可以去CPAN(Comprehensive Perl Archive Network,Perl模块聚集库https://www.cpan.org/)下载

2. 先装DBI,再装DBD模块,在安装DBD::Oracle中,如果装在没有Oracle Database的主机上,则需要安装Oracle Instant Client来进行远程数据库连接

3.在安装教程中,指出要配置Orcale_HOME目录,我们可以在根目录下输入vi .bashrc命令,即可看到Oracle_HOME的配置信息

在安装DBD::Oracle过程中,设置Oracle_HOME变量这一步似乎与我的问题2有关,但和问题1一点关系都没有,这时候就怀疑perl中有设置相应的参数,仔细查看执行脚本的开头,发现有使用到FindBin,想着不了解那就去学习一下。幸运的是,在学习的过程中解决了我的疑惑和报错。

perl的FindBin模块(一定要看参考的网址,很有帮助)

要点1:

参考:Perl使用FindBin模块解决脚本中的路径问题

假定脚本路径在/home/as_user/PMS/testt.pl,在目录/home/as_user/PMS下运行该脚本

技术分享图片

即$bin表示路径/home/as_user/PMS,$Script表示testt.pl

 

要点2:

参考:理解use_require_do使用方法

use 是在默认的@INC里面去寻找对应的模块,一旦模块不在@INC中,那么use是不能引入的。同时use引入的名称不需要后缀名,默认同时也只能找.PM文件

 

要点3:

参考:查看Perl模块安装路径

@INC是perl的一个特殊列表标量,存储着当前版本的Perl模块的路径。编译脚本时,Perl会根据@INC存储的路径去查询用户所调用的模块,可以用命令‘perl -V’来查看具体模块的目录,也同样可以用BEGIN代码块对@INC进行操作。其中.表示脚本的当前目录。

技术分享图片

 

总结

在学习了‘配置DBD::Oracle方法’ 以及‘perl的FindBin模块’的相关知识后,再回到报错,报错说在@INC路径下Can‘t locate DBD/Oracle.pm,既然找不到,那么我们要在执行脚本中设置DBD/Oracle.pm的路径。设置的方法是使用 FindBin模块。

举个例子:执行脚本SolexaDown.pl的目录为 /home/as_user/PMS/Data-Update,在这个目录下的/lib目录下存在 DBD/Oracle.pm,即存在路径 /home/as_user/PMS/Data-Update/DBD/Oracle.pm。那么我在olexaDown.pl脚本的开头,应该写上

use FindBin $Bin;
use lib "$Bin/lib";

这样一来,perl执行SolexaDown.pl脚本时就能找到DBD/Oracle.pm了。问题解决了~~

linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBDOracle.pm in @INC 的解决办法

标签:target   记录   linux环境配置   archive   句柄   free   问题解决   应该   bin   

原文地址:http://www.cnblogs.com/achigwwblog/p/7853814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!