【问题标题】:Can't locate DBD/Oracle.pm in @INC在 @INC 中找不到 DBD/Oracle.pm
【发布时间】:2013-10-24 11:21:40
【问题描述】:

我正在尝试通过 DBI 连接到 Oracle,但无法正常工作。

我的设置:

# cat /proc/version 
Linux version 2.6.18-194.el5 (mockbuild@ca-build10.us.oracle.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Mon Mar 29 20:06:41 EDT 2010
# uname -i 
i386
# perl -v 
This is perl, v5.8.8 built for i386-linux-thread-multi 
<...>
# echo $ORACLE_HOME
/usr/lib/oracle/12.1/client

我正在尝试使用此脚本进行连接:

#!/usr/bin/perl
# dbi.pl
use warnings;
use strict;
use DBI;

$ENV{ORACLE_HOME}="/usr/lib/oracle/12.1";
$ENV{LD_LIBRARY_PATH}="/usr/lib/oracle/12.1/client/lib";
$ENV{NLS_LANG}="american_america.CL8MSWIN1251";

my $user='user';
my $pw='pw';
my $host='servername';
my $port='1521';
my $SID = 'SID';
my $source = "dbi:Oracle:$host;sid=$SID;port=$port";

my $dbh=DBI->connect($source,$user,$pw,{PrintError=>0,AutoCommit=>0,RaiseError=>1}) or die "Oracle:$DBI::errstr\n";

当我尝试执行它时,我收到了一个错误:

#  ./dbi.pl
install_driver(Oracle) failed: Can't locate DBD/Oracle.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at (eval 3) 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, Proxy, Sponge, mysql.
 at ./dbi.pl line 21

我尝试重新安装 DBD-Oracle:

root@hostname:/tmp/DBD-Oracle-1.66# perl Makefile.PL
Using DBI 1.52 (for perl 5.008008 on i386-linux-thread-multi) installed in /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/DBI/

Configuring DBD::Oracle for perl 5.008008 on linux (i386-linux-thread-multi)

Remember to actually *READ* the README file! Especially if you have any problems.

Installing on a linux, Ver#2.6
Using Oracle in /usr/lib/oracle/12.1/client
DEFINE _SQLPLUS_RELEASE = "1201000100" (CHAR)
Oracle version 12.1.0.1 (12.1)

        Unable to locate an oracle.mk or other suitable *.mk
        file in your Oracle installation.  (I looked in
        /usr/lib/oracle/12.1/client/rdbms/demo/demo_xe.mk /usr/lib/oracle/12.1/client/rdbms/demo/demo_rdbms32.mk /usr/lib/oracle/12.1/client/rdbms/demo/demo_rdbms.mk /usr/lib/oracle/12.1/client/rdbms/lib/ins_rdbms.mk /usr/share/oracle/12.1/client/demo.mk under /usr/lib/oracle/12.1/client)

        The oracle.mk (or demo_rdbms.mk) file is part of the Oracle
        RDBMS product.  You need to build DBD::Oracle on a
        system which has one of these Oracle components installed.
        (Other *.mk files such as the env_*.mk files will not work.)
        Alternatively you can use Oracle Instant Client.

        In the unlikely event that a suitable *.mk file is installed
        somewhere non-standard you can specify where it is using the -m option:
                perl Makefile.PL -m /path/to/your.mk

        See the appropriate README file for your OS for more information and some alternatives.

     at Makefile.PL line 1187.
root@hostname:/tmp/DBD-Oracle-1.66#  ls /usr/lib/oracle/12.1/client/
total 8.0K
drwxr-xr-x 2 root root 4.0K Sep 24 13:23 bin/
drwxr-xr-x 2 root root 4.0K Sep 24 13:23 lib/
root@hostname:/tmp/DBD-Oracle-1.66#  

所以,我没有这个“rdbms”目录,因为我安装了 Instantclient。有没有什么方法可以在不安装数据库的情况下让它工作?

【问题讨论】:

  • 我不确定它是否能解决这个特定问题,但总的来说,我建议使用像 cpanm 这样的工具来安装 CPAN 模块,因为它会为您处理依赖项。安装后,像这样运行:cpanm DBD::Oracle
  • 确保在构建DBD::Oracle 时设置所有相同的环境变量,就像在脚本中设置的那样。将它们设置在 shell 中是明智的。
  • @ThisSuitIsBlackNot:虽然 cpanm 擅长安装 CPAN 依赖项,但 DBD::Oracle 依赖于正确安装和配置 Perl 外部的库/驱动程序。不幸的是,我在 Linux 上这样做已经有几年了。
  • 无论如何,我决定改用 php(尽管我从未使用过它)。 oci_connect 工作正常

标签: linux oracle perl dbi dbd


【解决方案1】:

就我而言,这解决了问题:

     perl -MCPAN -e shell
      get DBD::Oracle
      quit

     cd ~/.cpan/build/DBD-Oracle***
     export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
     export ORACLE_HOME=/usr/lib/oracle/11.2/client64/
     perl Makefile.PL
     make
        make install

【讨论】:

    【解决方案2】:

    最近完整的 oracle 数据库安装并未安装 DBD::Oracle 所需的所有位。很抱歉,我不记得您需要安装的可选位的名称。但是,另一种选择(也是更简单的一种)是下载 Oracle 即时客户端“basic”、“sdk”和“sqlplus”,将它们解压缩到某个位置,然后将 LD_LIBRARY_PATH 指向那里。它还使您独立于当前的 Oracle 数据库安装,这意味着如果您的 dba 升级它(或其中的一部分),您无需考虑重建 DBD::Oracle。

    顺便说一句,在你的 perl 脚本中设置你的 LD_LIBRARY_PATH 是行不通的——太晚了。

    【讨论】:

    • 嗨! “太晚了”是什么意思?那么应该在哪里指定呢?
    • 您需要在运行 perl 脚本之前进行设置。
    • @Alexander 将其设置在“包装”外壳脚本中将起作用。更好的是,只需将其放入您的登录脚本中即可。
    • 小提示:在 Windows 上,目录需要在 PATH 中。不直接适用于 OP,但值得记录...
    【解决方案3】:

    您好,您是否设置了LD_LIBRARY_PATH?根据docs,Makefile.PL 现在应该可以与即时客户端一起使用,但这是我看到你没有遵循的唯一选项(或者至少表明你已经遵​​循了)。

    【讨论】:

    • 是的,它在.bash_profile中:export ORACLE_HOME=/usr/lib/oracle/12.1/clientexport LD_LIBRARY_PATH=$ORACLE_HOME/lib
    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2021-03-03
    • 2018-01-11
    • 2020-07-15
    • 2018-11-08
    • 2021-11-17
    相关资源
    最近更新 更多