2010-05-26 14 views
5

sto ottenendo il seguente errore durante la connessione a un database Oracle 11g utilizzando un semplice script Perl:Perché il DBI di Perl si lamenta di "errore: ERRORE OCIEnvNlsCreate" quando provo a connettermi a Oracle 11g?

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

Lo script è il seguente:

#!/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(); 
} 

Chiunque visto questo problema prima?

+0

John, quando lo risolvi, ricorda di tornare qui e "accettare" la tua risposta preferita. Se devi modificare qualcosa per il tuo ambiente, puoi anche pubblicare la soluzione * that * e accettarla, quindi "up-vote" le risposte che ti hanno aiutato ad arrivarci. Questo andrà a ritirare correttamente la domanda per gli archivi SO. – Prune

risposta

6

Controllare la configurazione del client Oracle (incluso, come dice il messaggio, ORACLE_HOME), controllare le autorizzazioni dei file, ecc. È improbabile che DBI di per sé abbia qualcosa a che fare con il problema, e so per certo che DBD :: Oracle è compatibile con le librerie 11g (almeno il 11g InstantClient).

+2

[Estese informazioni per la risoluzione dei problemi] (http://search.cpan.org/dist/DBD-Oracle/) - inizia con i file 'README' e' README.help.txt'. – daxim

+0

Se imposto ORACLE_HOME sull'istanza 10g, è in grado di connettersi al database 11g, tuttavia se imposto ORACLE_HOME sull'istanza 11g viene visualizzato l'errore ... – John

+0

OK in modo che ORACLE_HOME venga modificato, se vi sono riferimenti ai file binari 10g nel tuo PATH stai resettando anche quelli alle loro controparti 11g? –

3
  • Installare il modulo Perl DBD::Oracle
  • Aggiungere use DBD::Oracle; nello script perl.

Questo ha reso il problema andare via per me.

2

Afther aggiornamento modulo Oracle 10.2.0.4 a 10.2.0.5 mia Perl-CGI non funziona, il file error.log di Apache è stato l'errore:

DBI connect('DB','user',...) failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc. at ... OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc.! at ...

aggiungendo la seguente direttiva risolvere il problema:

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

Controlla che #!/usr/bin/perl (prima riga del tuo script) sia la versione perl giusta che desideri utilizzare anche tu!

0

Le risposte precedenti non risolvono questo problema, ma mi hanno indirizzato nella giusta direzione: l'ambiente avviato mancava dello DYLD_LIBRARY_PATH per il client istantaneo Oracle. È possibile controllare chiamando: launchctl export

o

launchctl getenv variable_name in OS X 10.10

ho confrontato l'uscita dal mio .bash_profile e ha scoperto che il percorso di instanclient non era in launchctl PATH e DYLD_LIBRARY_PATH - Una volta ho li ha aggiunti con il seguente ha funzionato:

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

Mi dispiace per aver riportato questo thread di nuovo vivo, ma ho cercato di risolvere questo problema per settimane. Da nessuna parte ho trovato quello che finalmente lo ha risolto per me.

Ambiente: RedHat 6.5, Oracle Instant client 12.1, Apache 2.2

Che risolto per me: Cambiare i permessi della directory in cui è installato Oracle Instant Client, che deve essere anche il valore di. LD_LIBRARY_PATH. La directory non era accessibile a "altro", solo proprietario e gruppo. Questo comando ha fatto tutta la differenza:

# chmod o+rx INSTANTCLIENT-DIRECTORY 

avevo cercato di creare ogni possibile combinazione di ORACLE_HOME e LD_LIBRARY_PATH.(Anche "unsetting" ORACLE_HOME; ho trovato suggerimenti per risolvere il problema, dal momento che Instant Client aveva bisogno solo di LD_LIBRARY_PATH e! NOT! ORACLE_HOME.) Nulla ha aiutato, fino a ... mi ha colpito per cercare ulteriormente nel messaggio di errore:

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

autorizzazioni essere la parola chiave!

Spero che questo aiuti qualcun altro!

+0

Si prega di aggiungere ulteriori spiegazioni per chiarire la soluzione. Alcuni dei nostri cittadini non parlano correntemente l'inglese, così che lasciare la risposta implicita potrebbe non portarli a una soluzione. – Prune

+0

Grazie! Aggiunto un po 'più di testo alle soluzioni reali. Ero così desideroso di condividere questo quando ho trovato il problema. Quindi probabilmente non ero troppo educativo =) Sentiti libero di cambiarlo ulteriormente se pensi che manchino le informazioni. – Joakim

+0

Per me la soluzione era parte di ciò che hai scritto qui: avevo solo bisogno di impostare LD_LIBRARY_PATH sul percorso della directory del client istantaneo. –

0

La variabile di ambiente utilizzata per specificare le librerie Oracle può essere diversa da un sistema all'altro. Sulla maggior parte dei sistemi, utilizzare LD_LIBRARY_PATH ma potrebbe anche essere LIBPATH (in particolare su AIX), DYLD_LIBRARY_PATH o forse altri.

0

Anche io ho affrontato lo stesso problema. Nel mio caso, la variabile d'ambiente ORACLE_HOME non era corretta.

Problemi correlati