Well, I’ve identified my solution, but I’m not entirely certain why it’s working.
Setting the environment variables in a shell script wrapper around my perl script works. Despite %ENV being identical, when set within the perl script, I get the error, when set in the .sh wrapper it works.
It appears to be that called modules via ‘use MODULE;’ do NOT share the environment of the calling perl script?
These are my test scripts:
test.sh script
#!/bin/sh
ORACLE_HOME=/usr/lib/oracle/11.2/client64
LD_LIBRARY_PATH=$ORACLE_HOME/lib
ORACLE_SID=PHMWEB
export ORACLE_HOME LD_LIBRARY_PATH ORACLE_SID
echo "testing connection"
/home/allwebfiles/perl/kfs/
test.pl
echo "Done testing connection"
test.pl script
#!/usr/bin/perl -w
$ENV{"ORACLE_HOME"}="/usr/lib/oracle/11.2/client64";
$ENV{"ORACLE_SID"}="phmweb";
$ENV{"LD_LIBRARY_PATH"}="/usr/lib/oracle/11.2/client64/lib";
use DBI;
my $login = 'scott';
my $dbpass = 'tiger';
my $dbhost='
pharmacopeia.pharmacy.arizona.edu;sid=phmweb’<< substitute your own host here
print "Environment:\n";
foreach my $e (keys %ENV){
print "env var $e = $ENV{$e} \n";
}
print "\n";
print"DB test: sysdate = ";
my $dbh = DBI->connect( "dbi:Oracle:host=$dbhost", $login, $dbpass,
{ RaiseError => 1 } );
my $csr= $dbh->prepare("select sysdate from dual");
$csr->execute();
my ($out) = $csr->fetchrow();
print "$out\n";
$csr->finish();
$dbh->disconnect;
I tested this first by commenting out the $ENV{}=‘’; lines in the perl script, leaving the ones in test.sh intact:
[root@merthiolate ~]# env -i /home/allwebfiles/perl/kfs/test.sh
testing connection
Environment:
env var ORACLE_HOME = /usr/lib/oracle/11.2/client64
env var SHLVL = 1
env var LD_LIBRARY_PATH = /usr/lib/oracle/11.2/client64/lib
env var PWD = /root
env var _ = /home/allwebfiles/perl/kfs/
test.pl
env var ORACLE_SID = PHMWEB
DB test: sysdate = 19-FEB-14
Done testing connection
Then I commented out the first four lines of test.sh and uncommented the lines in
test.pl
env -i /home/allwebfiles/perl/kfs/lddtest.sh
testing connection
Environment:
env var ORACLE_HOME = /usr/lib/oracle/11.2/client64
env var LD_LIBRARY_PATH = /usr/lib/oracle/11.2/client64/lib
env var SHLVL = 1
env var PWD = /root
env var _ = /home/allwebfiles/perl/kfs/
test.pl
env var ORACLE_SID = phmweb
install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libocci.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.
at (eval 3) line 3
Compilation failed in require at (eval 3) line 3.
Perhaps a required shared library or dll isn't installed where expected
at /home/allwebfiles/perl/kfs/
test.pl line 18
DB test: sysdate = Done testing connection
It appears that DBI is NOT inheriting the environment when it’s called via ‘use DBI’ even though it’s called after I explicitly set them within the perl script.