2010-05-26 12 views
5

estoy recibiendo el siguiente error al conectarse a una base de datos Oracle 11g utilizando un simple script en Perl:¿Por qué la DBI de Perl se queja de "error: ERROR OCIEnvNlsCreate" cuando intento conectarme con Oracle 11g?

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

El guión es el siguiente:

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

Alguien ha visto este problema antes?

+0

John, cuando lo solucione, recuerde volver aquí y "aceptar" su respuesta favorita. Si tiene que modificar algo para su entorno, incluso puede publicar * esa * solución y aceptarla, y luego "votar" las respuestas que le ayudaron a llegar allí. Esto retirará correctamente la pregunta para los archivos SO. – Prune

Respuesta

6

Compruebe la configuración de su cliente Oracle (incluido, como dice el mensaje, ORACLE_HOME), verifique los permisos del archivo, etc. Es poco probable que DBI per se tenga algo que ver con el problema, y ​​sé con certeza que DBD :: Oracle es compatible con las bibliotecas 11g (al menos, el 11g InstantClient).

+2

[Información exhaustiva de solución de problemas] (http://search.cpan.org/dist/DBD-Oracle/) - comience con los archivos 'README' y' README.help.txt'. – daxim

+0

Si configuro ORACLE_HOME en la instancia 10g, puedo conectarme a la base de datos 11g; sin embargo, si configuro ORACLE_HOME en la instancia 11g, aparece el error ... – John

+0

OK, por lo que ORACLE_HOME se modifica, si hay referencias a los binarios 10g en tu PATH, ¿estás restableciendo esos también a sus contrapartes 11g también? –

3
  • instalar el módulo Perl DBD::Oracle
  • Añadir use DBD::Oracle; dentro del script de Perl.

Esto hizo que el problema se fuera para mí.

2

Afther actualización de forma Oracle 10.2.0.4 a 10.2.0.5 mi Perl-CGI no funciona, el archivo error.log de Apache fue el error:

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

añadir la siguiente directiva a resolver el problema:

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

Compruebe #!/usr/bin/perl (primera línea de su secuencia de comandos) es la versión perl derecha que desea utilizar también!

0

Las respuestas anteriores no resuelven este problema, pero me señalaron en la dirección correcta: al entorno de lanzamiento le faltaba el DYLD_LIBRARY_PATH para Oracle instantclient. Puede comprobar llamando a: launchctl export

o

launchctl getenv variable_name en OS X 10.10

comparé la salida de mi .bash_profile y encontré que el camino hacia instanclient no estaba en launchctl PATH y DYLD_LIBRARY_PATH - Una vez los agregó con lo siguiente funcionó:

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

Lo siento por traer de nuevo este hilo a la vida, pero he estado tratando de resolver este problema durante semanas. En ninguna parte encontré eso que finalmente lo resolvió para mí.

Medio Ambiente: RedHat 6.5, Oracle Instant Client 12.1, Apache 2.2

Lo resuelto por mí: Cambiar los permisos del directorio en el que está instalado Oracle Instant Client, que también debe ser el valor de. LD_LIBRARY_PATH. El directorio no era accesible para "otro", solo propietario y grupo. Este comando hace toda la diferencia:

# chmod o+rx INSTANTCLIENT-DIRECTORY 

que había estado tratando de crear todas las combinaciones posibles de ORACLE_HOME y LD_LIBRARY_PATH.(Incluso "desarmando" a ORACLE_HOME; encontré sugerencias que resolverían el problema, ya que Instant Client solo necesitaba LD_LIBRARY_PATH y! NOT! ORACLE_HOME). Nada me ayudó, hasta que ... me dí cuenta de que busqué más información en el mensaje de error:

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

permisos siendo la palabra clave!

Espero que esto ayude a alguien más!

+0

Agregue un poco más de explicación para aclarar la solución. Algunos de nuestros ciudadanos no dominan el inglés, por lo que dejar la respuesta implícita puede no llevarlos a una solución. – Prune

+0

¡Gracias! Se agregó más texto a las soluciones reales. Estaba tan ansioso por compartir esto cuando encontré el problema. Así que probablemente no fui demasiado educado =) Siéntete libre de cambiarlo más si crees que falta información. – Joakim

+0

Para mí, la solución fue parte de lo que escribió aquí: solo necesitaba establecer LD_LIBRARY_PATH en la ruta al directorio de cliente instantáneo. –

0

La variable de entorno utilizada para especificar las bibliotecas de Oracle puede ser diferente de un sistema a otro. En la mayoría de los sistemas, use LD_LIBRARY_PATH pero también puede ser LIBPATH (especialmente en AIX), DYLD_LIBRARY_PATH, o tal vez otros.

0

Yo también tuve el mismo problema. En mi caso, la variable de entorno ORACLE_HOME era incorrecta.

Cuestiones relacionadas