Re: Potential problem with DBD::Oracle

[email protected] ("Martin J. Evans")
Newsgroups perl.dbi.users
Organization Easysoft Limited
Message-ID <[email protected]>
On 13/01/11 17:21, Martin J. Evans wrote:
> On 18/11/10 20:24, Martin J. Evans wrote:
>> 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/pwd@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
>>
> 
> I suddenly remembered what is probably causing this as I hit a similar problem in DBD::ODBC. It was failing to set magic on the sv for the bound column. This should probably be reported in the rt system for DBD::Oracle. I don't have time right now to look into it and will probably forget again unless it is rt'ed.
> 
> Martin

Appollogies, it appears John already got a patch to fix this and it has already been committed.

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.