Thanks for the info. I'll take a look. Tim.
On Fri, Oct 17, 2003 at 08:36:09AM +1000, Steve Baldwin wrote: > I'm not sure whether this is a DBD::Oracle bug or a bug in the Oracle > client libs, but it only seems to manifest in Perl scripts running on > machines with Oracle client 9.2. The problem is when you have bind > variables that are being bound using bind_param_inout, but those > variables never get values assigned to them, they get filled with > garbage. > > Here is a simple script that exhibits the problem ... > > #!/usr/bin/perl -w > use strict ; > use DBI ; > my $dbh = DBI->connect('dbi:Oracle:', $ENV{'ORACLE_USER'}, '') ; > > my $sth = $dbh->prepare (q( > BEGIN > -- :p1 := :p1 ; > -- :p2 := :p2 ; > IF :p2 != :p3 THEN > :p1 := 'AAA' ; > :p2 := 'Z' ; > END IF ; > END ; > )) ; > > my ($p1, $p2, $p3) = ('Hello', 'Y', 'Y') ; > $sth->bind_param_inout(':p1', \$p1, 30) ; > $sth->bind_param_inout(':p2', \$p2, 1) ; > $sth->bind_param_inout(':p3', \$p3, 1) ; > > print "Before p1=[$p1] p2=[$p2] p3=[$p3]\n" ; > $sth->execute ; > print "After p1=[$p1] p2=[$p2] p3=[$p3]\n" ; > > END { > if (defined $dbh) { > $dbh->disconnect ; > } > } > > Here's an example of running it : > > [perldev]$ perl sbtest.pl > Before p1=[Hello] p2=[Y] p3=[Y] > After p1=[HelloPÛ o·W<a0t%or&] [EMAIL PROTECTED]&oPÛ o·S<aPv$oà] > p3=[Y] > > As you can imagine, the behaviour of the script after this is somewhat > unpredictable. It can play havoc with Apache (and took some tracking > down let me tell you !!). > > Fortunately there is a relatively simple workaround. As you can see in > my script above, there are two lines commented out in the anonymous > PL/SQL block. If I uncomment them, everything works just fine. So, if > at the start of the anonymous block you assign each bind variable to > itself, you will never see the problem. > > Note that I have only been able to reproduce this problem under the > following circumstances : > > You are executing an anonymous PL/SQL block > Your Oracle client version is 9.2 > Bind variable(s) are being bound with bind_param_inout > Logic in the PL/SQL block prevents the bind variable from being assigned > a value > > There may be other circumstances under which this occurs, but this is as > far as I could test. > > Hope this helps someone. > > Steve