前言

接手前辈的项目,没有接触、安装、使用过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的方法

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

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

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

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

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

安装DBI 

perl DBI官网: https://dbi.perl.org/ ,在官网中可以跳转到下载路径 https://metacpan.org/release/DBI

配置方法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了。报错解决了~~

关于问题

use查找引用的模块 和 DBI激活对应的DBD 都是通过 @INC下的路径去查找的,之所以说DBI激活对应的DBD也是通过@INC的依据:我发现DBI有个available_drivers方法,perl DBI手册上有写到 "该方法通过@INC中的目录搜索所有的DBD::*模块返回一个所有可用驱动器的列表。默认情况下,如果某些驱动器被先前目录中其他相同名字的驱动器覆盖,将会返回一个警告,可以通过设置$quiet为true屏蔽",这启发了我,再根据DBI的源码,我发现了实际的代码 grep { -d "$_/auto/DBD/$driver" } @INC。我懒的仔细看源码,$_具体指哪些就没深究,有兴趣的可以仔细研究一下,DBI源码是用perl写的。设置@INC的方法在链接 查看Perl模块安装路径中可以找到,我就不列举了。

linux centos环境下,perl使用DBD::Oracle遇到报错Can't locate DBD/Oracle.pm in @INC 的解决办法的更多相关文章

  1. Linux/CentOS环境下如何安装和配置PhantomJS工作环境

    PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...

  2. 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法

    非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...

  3. linux安装软件报错: Can't locate ExtUtils/Embed.pm in @INC...

    安装snmp服务, 中间报错: Can't locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/l ...

  4. 执行perl xttdriver.pl报错Can't locate Getopt/Long.pm in @INC

    环境:AIX 6.1 + Oracle 10.2.0.4 现象:在做xtts测试时,源环境使用Oracle自带的perl执行xttdriver.pl报错如下: $ $ORACLE_HOME/perl/ ...

  5. linux(centos)环境下安装rabbitMq

    1.由于rabbitMq是用Erlang语言写的,因此要先安装Erlang环境 下载Erlang :http://www.rabbitmq.com/releases/erlang/erlang-19. ...

  6. 如何在linux centos 环境下运行.exe文件

    linux是不能运行window下的可执行文件的,必须借助于wine.百度了以下wine如下:   Wine (“Wine Is Not an Emulator” 的递归缩写)是一个能够在多种 POS ...

  7. windows环境下使用MySQL导入数据乱码报错的解决办法

    Linux及Mac系统下使用source xxx.sql 可直接导入测试数据(注意必须先切换到当前xxx.sql的目录下), 但在Windows环境下导入会出现乱码报错的情况, 主要是因为编码的问题, ...

  8. Linux(CentOS6.5)下编译安装PHP5.6.22时报错”configure: error: ZLIB extension requires gzgets in zlib”的解决方式(确定已经编译安装Zlib,并已经指定Zlib路径)

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢!   今天在CentOS6.5下编译安装PHP时,一直报错 confi ...

  9. Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法[转]

    --安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined--------------------- ...

随机推荐

  1. centos7.2下部署 python3

    安装Python3 1.环境准备 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...

  2. jenkins启动

    1.已安装JDK,因为jenkins是一款基于java的持续集成工具 2.已配置tomcat,并安装maven 3.下载一个jenkins的war包,放在tomcat/webapps目录下 4.cmd ...

  3. 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置

    浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...

  4. Java 实现TCP/IP协议的收发数据(服务端)

    功能如下: 注: 只有服务端,没有客户端,测试时采用第三方软件作为客户端的. 收发数据目前能正常收发数据,只是中文的会变成乱码显示. 采用Thread类实现一个收发数据的线程. 服务端代码: impo ...

  5. CentOS7离线安装mysql5.7

    下载mysql5.7,系统选择redhat,版本选择RHEL7,下载RPM Bundle后得到一个tar文件.这里得到文件mysql-5.7.25-1.el7.x86_64.rpm-bundle.ta ...

  6. Spring Boot系列(二) Spring Boot 之 REST

    Rest (Representational Stat Transer) 是一种软件架构风格. 基础理论 架构特性 性能 可伸缩 简化的统一接口 按需修改 组件通信透明 可移植 可靠性 架构约束 C/ ...

  7. 【Android手机测试】linux内存管理 -- 一个进程占多少内存?四种计算方法:VSS/RSS/PSS/USS

    在Linux里面,一个进程占用的内存有不同种说法,可以是VSS/RSS/PSS/USS四种形式,这四种形式首字母分别是Virtual/Resident/Proportional/Unique的意思. ...

  8. Spring Cloud 2-Hystrix DashBoard仪表盘(五)

    Spring Cloud  Hystrix DashBoard  1.监控系统配置 pom.xml application.yml Application.java 2.被监控服务配置 pom.xml ...

  9. 初学python之路-day08前期总结

    # 1# 计算机原理:控制器 运算器 存储器 input设备 output设备 IO流# 三大核心:CPU 内存 硬盘 # 内存分布:栈区 与 堆区# 如二进制与十进制的转换,如1111转成十进制为1 ...

  10. Javascript执行上下文和执行栈

    什么是执行上下文? 执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript中运行任何的代码都是在执行上下文. 什么是执行栈? 执行栈,在其他编程语言中也被叫做 ...