使用简单的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();
}
之前有人见过这个问题吗?
答案 0 :(得分:6)
检查您的Oracle客户端配置(包括,如消息所示,ORACLE_HOME),检查文件权限等.DBI本身不太可能与问题有关,而且我知道DBD :: Oracle的事实与11g库(至少11g InstantClient)兼容。
答案 1 :(得分:3)
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 PATH
和DYLD_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环境变量不正确。