Oracle
 sql >> Datenbank >  >> RDS >> Oracle

%ENV funktioniert nicht und ich kann die gemeinsam genutzte Bibliothek nicht verwenden

Der LD_LIBRARY_PATH Umgebungsvariable muss vorher gesetzt werden Ihr Programm startet – vor perl selbst wird geladen. Ändern Sie es in BEGIN{} wirkt sich auf neue Programme aus die Sie starten, aber es wirkt sich nicht auf das Laden von gemeinsam genutzten Bibliotheken aus – in diesem Fall (obwohl ich nie DBD::Oracle verwendet habe) laden Sie eine Oracle .so in das bereits laufende Programm, also ist es „zu spät“, den LD_LIBRARY_PATH zu ändern . Der dynamische Linker /lib/ld.so (oder so) wird vor perl gestartet , also zu dem Zeitpunkt, zu dem Ihr Skript kompiliert ist und BEGIN{} läuft, ist bereits eingerichtet.

Sie könnten Versuchen Sie, Ihr Skript als eigenen Nachfolger oder so etwas erneut auszuführen*, aber ein kurzes Shell-Skript ist mit ziemlicher Sicherheit die einfachste Lösung:

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

*- das wäre irgendwie verrückt, aber 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;
  }