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.


-- 
Bruce Johnson
University of Arizona
College of Pharmacy
Information Technology Group

Institutions do not have opinions, merely customs


Reply via email to