Oracle
 sql >> Database >  >> RDS >> Oracle

%ENV non funziona e non posso utilizzare la libreria condivisa

Il LD_LIBRARY_PATH la variabile di ambiente deve essere impostata prima il tuo programma si avvia — prima di perl stesso è caricato. Modificandolo in BEGIN{} influenzerà i nuovi programmi che avvii, ma non influirà sul caricamento delle librerie condivise — in questo caso (anche se non ho mai usato il DBD::Oracle) stai caricando un Oracle .so nel programma già in esecuzione, quindi è "troppo tardi" per modificare LD_LIBRARY_PATH . Il linker dinamico /lib/ld.so (o giù di lì) viene avviato prima di perl , quindi quando lo script viene compilato e BEGIN{} funziona, è già configurato.

Potresti prova a rieseguire il tuo script come suo successore o qualcosa del genere*, ma un breve script di shell sarà quasi sicuramente la soluzione più semplice:

  #!/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]"

*- questo sarebbe un po' folle, ma 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;
  }