![](/img/trans.png)
[英]Execute a shell script (shell script which uses perl and other shell scripts) in Linux from java
[英]Perl script cannot connect to Oracle from linux shell with error and code
我需要一些帮助来确定我从 perl 文件到数据库的连接问题。
当代码从 web(浏览器到 /file.pl url)运行时,代码运行良好。
在 shell 上下文(腻子)中,当我运行脚本“perl /file.pl”时,出现此错误:
[date] file.pl: DBI connect('address','username', 'password') failed:
ERROR OCIEnvNlsCreate (check OR ACLE_HOME and NLS settings etc.) at file.pl line 61
第 61 行内容如下:
$dbh = DBI->connect(A, B, C );
更多详细信息:当另一个用户(可能具有更多权限)运行该文件时,它适用于他(在 shell 中)。
#!/usr/bin/perl -w
require 'include.pl';
require 'bencfg.pl';
use lib '/www/modules/'; #rqd
use DBI;
use DBD::Oracle;
print "Content-type: text/html; charset=UTF-8\n\n";
print "Test Run of connection...\n\n<br>";
print "ORA_HOME: '$ENV{ORACLE_HOME}'\n<br>"; #ORA_HOME: '/opt/oracle/10g/'
#connect to DB
$dbh = DBI->connect(A, B C) || die "Database connection not made: $DBI::errstr";
if($dbh){
print "OK\n<br>";
$dbh->disconnect;
}
else{
print "failed: $DBI::errstr\n";
}
我知道 DBI->connect 工作的变量。 那不是问题。 我相信它的权限,但我不知道如何修复它。
一些附加信息: ORA_HOME: '/opt/oracle/10g'
NLS_SESSION_PARAMETERS
PARAMETER VALUE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT MM/DD/YYYY HH24:MI:SS
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
每次我在连接到 10g 时遇到这个问题,我都必须确保设置了 NLS_LANG 环境变量:
## for utf8 data
$ENV{NLS_LANG} = 'american_america.al32utf8';
## for ios-8859-1 data
$ENV{NLS_LANG} = 'american_america.we8iso8859p1';
另外,将 ORA_NLS 设置为 nls 文件的路径
$ENV{ORA_NLS} = -d "$ENV{ORACLE_HOME}/ocommon/nls/admin/data" ? "$ENV{ORACLE_HOME}/ocommon/nls/admin/data" :
-d "$ENV{ORACLE_HOME}/nls/admin/data" ? "$ENV{ORACLE_HOME}/nls/admin/data" :
-d "$ENV{ORACLE_HOME}/nls/data" ? "$ENV{ORACLE_HOME}/nls/data"
$ENV{ ORA_NLS32 } = $ENV{ORACLE_NLS};
回复: More details: ... When another user... runs the file, it works for him
尝试转储该用户的环境设置,
env|grep NLS
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.