当我尝试连接到Oracle 11g时,为什么Perl的DBI会抱怨“失败:错误OCIEnNN创建”?

时间:2010-05-26 15:23:47

标签: perl oracle dbi

使用简单的Perl脚本连接到Oracle 11g数据库时出现以下错误:

 failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var  or PATH (Windows) and or NLS settings, permissions, etc. at

脚本如下:

#!/usr/local/bin/perl

use strict;
use DBI;

if ($#ARGV < 3) {
print "Usage: perl testDbAccess.pl dataBaseUser dataBasePassword SID dataBasePort\n";
exit 0;
}
my ($user, $pwd, $sid, $port) = @ARGV;

my $host = `hostname`;
my $dbh;
my $sth;
my $dbname = "dbi:Oracle:HOST=$host;SID=$sid;PORT=$port";

openDbConnection();
closeDbConnection();

sub openDbConnection() {
        $dbh = DBI->connect ($dbname, $user ,$pwd , { RaiseError => 1}) || die "Database connection not made: $DBI::errstr";
}

sub closeDbConnection() {
        #$sth->finish();
        $dbh->disconnect();
}

之前有人见过这个问题吗?

9 个答案:

答案 0 :(得分:6)

检查您的Oracle客户端配置(包括,如消息所示,ORACLE_HOME),检查文件权限等.DBI本身不太可能与问题有关,而且我知道DBD :: Oracle的事实与11g库(至少11g InstantClient)兼容。

答案 1 :(得分:3)

  • 安装perl模块DBD::Oracle
  • use DBD::Oracle;添加到您的perl脚本中。

这使我的问题消失了。

答案 2 :(得分:2)

Afther将Oracle表单10.2.0.4升级到10.2.0.5我的Perl-CGI无法正常工作,Apache的error.log文件出错了:

  

DBI connect('DB','user',...)失败:ERROR OCIEnvNlsCreate。校验   ORACLE_HOME(Linux)env var或PATH(Windows)和/或NLS设置,   权限等...   OCIEnvNlsCreate。检查ORACLE_HOME(Linux)env var或PATH(Windows)   和/或NLS设置,权限等!在......

添加以下指令解决问题:

my $ORACLE_HOME = "/usw/app/oracle/product/10.2";
$ENV{ORACLE_HOME}=$ORACLE_HOME;

答案 3 :(得分:2)

很抱歉让这个帖子再次活跃起来,但我一直试图解决这个问题好几个星期。我没有找到最终为我解决的问题。

环境:RedHat 6.5,Oracle Instant Client 12.1,Apache 2.2

为我解决了什么: 更改安装Oracle Instant Client的目录的权限,该权限也必须是LD_LIBRARY_PATH的值。 “其他”,只是所有者和组无法访问该目录。这个命令完全不同:

# chmod o+rx INSTANTCLIENT-DIRECTORY

我一直在尝试创建ORACLE_HOME和LD_LIBRARY_PATH的所有可能组合。 (甚至“未设置”ORACLE_HOME;我找到了可以解决问题的建议,因为Instant Client只需要LD_LIBRARY_PATH和!NOT!ORACLE_HOME。)没有任何帮助,直到...... 它让我在错误信息中进一步查看:

    failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var
    or PATH (Windows) and or NLS settings, permissions, etc.

权限是关键词!

希望这有助于其他人!

答案 4 :(得分:1)

CentOS 8 等的 2021 年更新:-

如果您使用 systemctl,您的环境或 Apache 设置中的任何内容都不能将环境变量传递给 DBI!

您需要编辑 /usr/lib/systemd/system/httpd.service 文件并在 [Service] 部分后添加如下适当的行:

[Service]
Environment=ORACLE_HOME=/opt/oracle/product/19c/dbhome_1

然后照常重启apache:-

/bin/systemctl restart httpd.service

(如果对您有帮助,请投票:此网页是 systemctl “security” 重生的这个老问题的排名第一的谷歌结果)

答案 5 :(得分:0)

检查#!/usr/bin/perl(脚本的第一行)是否也是您想要使用的perl版本!

答案 6 :(得分:0)

以前的答案并没有解决这个问题,但他们确实指出了我正确的方向:启动的环境缺少Oracle即时客户端的DYLD_LIBRARY_PATH。您可以致电:launchctl export

进行检查

OS X 10.10中的

launchctl getenv variable_name

我对.bash_profile的输出进行了比较,发现instanclient的路径不在launchctl PATHDYLD_LIBRARY_PATH中 - 一旦我添加了以下内容就可以了:

launchctl setenv PATH /path/to/instantclient
launchctl setenv DYLD_LIBRARY_PATH /path/to/instantclient

答案 7 :(得分:0)

用于指定Oracle库的环境变量可能因系统而异。在大多数系统上,使用LD_LIBRARY_PATH但它也可能是LIBPATH(特别是在AIX上),DYLD_LIBRARY_PATH或其他系统。

答案 8 :(得分:0)

我也遇到了同样的问题。在我的情况下,ORACLE_HOME环境变量不正确。