Hello!

I've developed a perl script that works with Oracle via DBI and
DBD::Oracle.

This perl script illustrates a strange problem while fetching
LONGs and LONG RAWs.

Please look at this code:

###################################################
...
...
my $dbh;
my $ret_val = oracle_connect($dbh, "ORANGE", "krivenok", "krivenok",
undef, undef);
die ($ret_val) if defined $ret_val;

my $buffer_size_for_long = 16 * 1024 * 1024 - 48;
$dbh->{LongReadLen} = $buffer_size_for_long;
my $sth = $dbh->prepare("SELECT longdata FROM lob_example WHERE
lob_id
= 1");
if(defined $sth)
{
  print "All right!!!\n"
}

else
{
  print "Error : '$DBI::errstr'\n";

}

oracle_disconnect($dbh);
###################################################

This script always fails with error:

ORA-01062: unable to allocate memory for define buffer (DBD ERROR:
OCIDefineByPos)

for buffer size >= 16 * 1024 * 1024 - 48
and always works fine for buffer size < 16 * 1024 * 1024 - 48.

I've executed the script on another server and got the following
result:
Works for buffer size < 4 * 1024 * 1024 - 12
Fails for  buffer size >= 4 * 1024 * 1024 - 12

So, my questions are:
1) What is define buffer?
2) How can I change its size?
3) What is the maximum size of the buffer?

P.S.
Yes I know that LONG and LONG RAW types are deprecated.
We will migrate to using CLOBs and BLOBs in perspective.
However, we can't migrate now :(

My system:
Linux develop 2.6.14-gentoo-r2 #1 SMP PREEMPT Wed Mar 21 18:43:52 MSK
2007 i686 Intel(R) Pentium(R) 4 CPU 2.80GHz GenuineIntel GNU/Linux

My database:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

Oracle client version:
10.2.0.3.0

DBI version:
1.58

DBD::Oracle version:
1.19

Reply via email to