首页 文章

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

提问于
浏览
5

我使用简单的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();
}

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

8 回答

  • 6

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

  • 3
    • 安装perl模块DBD::Oracle

    • use DBD::Oracle; 添加到perl脚本中 .

    这让我的问题消失了 .

  • 2

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

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

    添加以下指令解决问题:

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

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

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

    What solved it for me: 更改安装Oracle Instant Client的目录的权限,该权限也必须是LD_LIBRARY_PATH的值 . "other"无法访问该目录,只是所有者和组 . 这个命令完全不同:

    # 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.
    

    permissions 是关键词!

    希望这有助于其他人!

  • 0

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

  • 0

    以前的答案并没有解决这个问题,但他们确实指出了我正确的方向:启动的环境缺少 DYLD_LIBRARY_PATH for Oracle instantclient . 您可以致电查询: 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
    
  • 2

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

  • 0

    我也经历了同样的问题 . 在我的情况下,ORACLE_HOME环境变量不正确 .

相关问题