Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

%ENV não funciona e não consigo usar a biblioteca compartilhada


O LD_LIBRARY_PATH a variável de ambiente deve ser definida antes seu programa inicia — antes de perl em si é carregado. Alterando em BEGIN{} afetará novos programas que você inicia, mas não afetará o carregamento de bibliotecas compartilhadas — neste caso (embora eu nunca tenha usado o DBD::Oracle) você está carregando um Oracle .so no programa já em execução, então é "tarde demais" para alterar o LD_LIBRARY_PATH . O vinculador dinâmico /lib/ld.so (ou mais) é iniciado antes de perl , então quando seu script for compilado e BEGIN{} roda, já está configurado.

Você poderia tente executar novamente seu script como seu próprio sucessor ou algo assim *, mas um script de shell curto quase certamente será a solução mais simples:
  #!/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]"

*- isso seria meio louco, mas 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;
  }