Oracle
 sql >> Base de données >  >> RDS >> Oracle

%ENV ne fonctionne pas et je ne peux pas utiliser la bibliothèque partagée

Le LD_LIBRARY_PATH la variable d'environnement doit être définie avant votre programme démarre — avant perl elle-même est chargée. Changez-le dans BEGIN{} affectera les nouveaux programmes que vous démarrez, mais cela n'affectera pas le chargement des bibliothèques partagées — dans ce cas (bien que je n'ai jamais utilisé le DBD::Oracle) vous chargez un Oracle .so dans le programme déjà en cours d'exécution, il est donc "trop ​​tard" pour modifier le LD_LIBRARY_PATH . L'éditeur de liens dynamique /lib/ld.so (ou presque) est lancé avant perl , donc au moment où votre script est compilé et BEGIN{} s'exécute, il est déjà configuré.

Vous pourriez essayez de ré-exécuter votre script comme son propre successeur ou quelque chose comme ça*, mais un petit script shell sera certainement la solution la plus simple :

  #!/bin/sh
  export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client64/lib
  export ORACLE_SID=prod
  exec /usr/local/bin/your-db-program "[email protected]"

*- ce serait un peu fou, mais TIMTOWTDI :

  eval { 
     use DBD::Oracle foo bar baz; …
  };
  if ([email protected] =~ /install_driver\(Oracle\) failed/) {
     $ENV{LD_LIBRARY_PATH} .= ':/usr/lib/oracle/10.2.0.3/client64/lib';
     $ENV{ORACLE_SID} = 'prod';
     warn "Restarting with LD_LIBRARY_PATH reset:\n\[email protected]\n";
     exec { $0 } $0 => @ARGV;
  }