John Scoles wrote:
>
> Well here comes #4
>
>
> It can be found at the usual place
>
> http://svn.perl.org/modules/dbd-oracle/trunk/DBD-Oracle-1.24-RC4.tar
>
>
> This time round I added a little patch from Charles Jardine fro objects
> and some fixes for warnings
>
> I have changed the ora_ncs_buff_mtpl default value back to 4 so it
> doesn't muck anyone up and have made it so it reports better and have
> updated the Pod to reflect this
>
> Hopefully this will get most of them this time round
>
> Cheers
>
> and thanks for all the testing
>
> John S
>
>
John,
I have a vague recollection someone mentioned lobs and freeing them
during this RC round but I cannot locate that email now - if someone did
it may be relevant to this issue. Anyway, I am getting a new error
"DBD::Oracle::st DESTROY failed: ORA-22922: nonexistent LOB value (DBD
ERROR: OCILobFreeTemporary) [for Statement "BEGIN p_mje(?); END;"]."
but as yet I cannot be certain this was not there before as our code
base for the application has changed. Code demonstrating the problem is
below and I will a) try and check this with a stock 1.23 and b) see if I
can locate the problem.
# $Id: fork.pl 3727 2010-01-22 10:47:27Z martin $
# Perl script which demonstrates ORA-22922 error in DBD::Oracle 1.24 RC4
#
use strict;
use warnings;
use DBI;
use Proc::Fork;
use Data::Dumper;
use DBD::Oracle qw(:ora_types);
my $ph = DBI->connect(
"dbi:Oracle:host=betoracle.easysoft.local;sid=devel",
"bet", "b3t");
print "ph InactiveDestroy = $ph->{InactiveDestroy}\n";
eval {
local $ph->{PrintError} = 0;
$ph->do(q/drop table mje/);
$ph->do(q/drop procedure p_mje/);
};
$ph->do(q/create table mje (a clob)/);
$ph->do(<<SQL);
create procedure p_mje(a clob) AS
BEGIN
INSERT INTO mje values(a);
END;
SQL
my $clob = 'x' x 50000;
my $st = $ph->prepare(q/BEGIN p_mje(?); END;/);
$st->bind_param(1, $clob, {ora_type => ORA_CLOB});
$st->execute;
run_fork {
child {
# my $ch = $ph->clone;
$ph->{InactiveDestroy} = 1;
# $ph = undef;
exit 0;
}
parent {
waitpid $_[0], 0;
}
};
NOTE, it is not sufficient to simply set InactiveDestroy, you seem to
need to do the fork.
Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com