On 18/11/2010 20:15, Steve Baldwin wrote:
Hi,
I ran across an issue recently that appears to have existed for quite some
time.
Consider the following script ...
#!/usr/bin/perl -w
use strict;
use warnings;
use DBI;
sub main {
my $dbh = DBI->connect(
'dbi:Oracle:',
'usr/p...@conn',
'',
{ PrintError => 0, AutoCommit => 0, RaiseError => 1 },
);
my $sql =<<'END_SQL';
SELECT 1 srt, 'AA' txt
FROM dual
UNION
SELECT 2, 'BBB'
FROM dual
UNION
SELECT 3, 'CCCC'
FROM dual
ORDER
BY 1
END_SQL
my $sth = $dbh->prepare($sql);
$sth->execute;
my ($srt, $txt);
$sth->bind_columns(\($srt, $txt));
while ($sth->fetch) {
print "[$srt][$txt] len=" . (length($txt)) . "\n";
}
$dbh->disconnect;
return 0;
}
exit main();
Running it produces the following output :
au-stb-101-144:dev stbaldwin$ ./sb2.plx
[1][AA] len=2
[2][BBB] len=2
[3][CCCC] len=2
As you can see, even though the data in $txt looks correct, perl thinks the
internal length of the variable is whatever it was after fetching the first
row. This screws up things like sprintf.
I'm pretty sure this behaviour is a DBD::Oracle thing rather than a DBI
thing. I tried an equivalent script with DBD::SQLite and DBD::mysql and
they both returned the length correctly (imo).
This behaviour exists in 1.23 and 1.26. I haven't tested any other
versions.
Thanks,
Steve
I vaguely remember hitting this issue myself some time ago. Perhaps a
search of dbi-users or dbi-dev will find something. I'll try and dig out
a reference tomorrow.
Martin