2011-06-08 88 views
0

我需要一些幫助來確定從perl文件到數據庫的連接問題。Perl腳本無法從linux shell連接到Oracle,出現錯誤和代碼

代碼在從網絡(瀏覽器到/file.pl網址)運行時運行並正常運行。

在外殼上下文(膩子),當我運行該腳本 「的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->連接工作的變量。那不是問題。我相信它的權限,但我不知道如何解決它。

一些額外的信息: ORA_HOME: '/選擇/ 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 
+0

如果你做一個谷歌搜索'OCIEnvNlsCreate'你會獲得大量的點擊。你有沒有研究過這些解決方案? – 2011-06-08 16:46:05

+0

你有沒有想過這個想法? – mrk 2011-06-30 23:09:02

+0

是的。這裏的問題是一個糟糕的安裝/設置。我的用戶名無法連接並從unix命令行運行sql。一旦解決,其他問題就會落實。 – brbdc 2011-07-08 14:44:20

回答

0

每次我有這個問題與連接到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設置,

env|grep NLS 
+0

在shell中我的'env | grep NLS'是NLS_LANG = AMERICAN – brbdc 2011-06-08 17:42:39

+0

@brbdc嗯,我不是Oracle專家,所以我不能完全告訴你AMERICAN是否爲NLS_LANG的有效設置。這裏有幾個網址閱讀有關NLS_LANG http://orafaq.com/wiki/NLS_LANG http://www.dba-oracle.com/t_nls_lang.htm或者,谷歌「oracle set nls_lang」 – mrk 2011-06-08 17:48:45

+0

我檢查了4個其他用戶名在Unix中。它爲其中3個工作。我們都有相同的NLS_LANG變量。它必須是我們不知道的一些unix許可。當我們弄清楚時我會發布。 – brbdc 2011-06-08 18:02:22