Re: DBD::ODBC and issues getting LongTruncOk / LongReadLen to take effect

Ron Savage <[email protected]> Fri, 16 Nov 2018 11:11:33 +1100
Newsgroups gmane.comp.lang.perl.modules.dbi.general
Message-ID <[email protected]>
Hi Dan

Does it make any difference if you put LongReadLen and LongTruncOK next 
to RaiseError in the attrs?

On 16/11/18 10:54, Daniel Kasak wrote:
> Hi Martin. Sorry for the very long delay. We had abandoned the ODBC 
> driver in favour of the native DBD::DB2, and I've been working on this 
> project outside my normal work hours anyway, so got bogged down in other 
> issues ...
> 
> I've uploaded the trace to: https://tesla.duckdns.org/downloads/trace.log
> The script I'm using to generate this is: 
> https://tesla.duckdns.org/downloads/db2_syscat_columns.pl
> 
> It dies on the 1st call of $sth->fetchrow_hashref():
>   DBD::ODBC::st fetchrow_hashref failed: st_fetch/SQLFetch (long 
> truncated DBI attribute LongTruncOk not set and/or LongReadLen too 
> small) (SQL-HY000) at db2_syscat_columns.pl 
> <http://db2_syscat_columns.pl> line 36.
> 
> Thanks for your time ...
> 
> Dan
> 
> On Thu, Apr 5, 2018 at 9:50 PM Martin J. Evans via dbi-users 
> <[email protected] <mailto:[email protected]>> wrote:
> 
>     On 05/04/18 12:24, Daniel Kasak wrote:
>      > Hi all.
>      >
>      > I'm writing a database utility that has to access IBM's "DashDB"
>     and other DB2-variants. I have their latest ODBC driver, and I have
>     simple queries working. However queries against their system catalog
>     are not working - queries appear to be returning *empty* recordsets.
>     After some laborious debugging, I can see that when I call
>     $sth->fetchrow_array, DBI::errstr is set to:
>      >
>      > st_fetch/SQLFetch (long truncated DBI attribute LongTruncOk not
>     set and/or LongReadLen too small) (SQL-HY000)
>      >
>      > I've dealt with this before. So when constructing my $dbh, I do:
>      >
>      > $self->{dbh}->{LongReadLen} = 65535 * 1024 # 64MB - yes I know
>     it's big
>      > $self->{dbh}->{LongTruncOK} = 1;
>      >
>      > This usually fixes things - or at least has for SQL Server and
>     Netezza. For DB2 connections however, it appears to have no effect.
>      >
>      > I've turned on ODBC tracing immediately prior to calling
>     $sth->prepare ... $sth->execute ... $sth->fetchrow_array:
>      > https://paste.pound-python.org/show/hS6ur7dwGRsQubr29HFT/
>      >
>      > This one was from the query:
>      > select * from SYSCAT.COLUMNS
>      >
>      > Does anyone know why LongTruncOk / LongReadLen are not being
>     honored here?
>      >
>      > I'm using unixODBC-2.3.6, DBD::ODBC from git, and the latest
>     available DB2 ODBC driver.
>      >
>      > Please help! Thanks :)
>      >
>      > Dan
> 
>     There are some very long columns in that result-set but I can't tell
>     from the unixodbc log alone what has happened.
>     Can you reduce your perl to the simplest test you can and rerun with
> 
>     DBI_TRACE=15=trace.log perl mycode.pl <http://mycode.pl>
> 
>     and show me the trace.log file.
> 
>     Martin
> 

-- 
Ron Savage - savage.net.au