Hello,
We connect to an iSeries AS400 using DBI and DBD::ODBC on a RHEL6 64-bit
web server. Since upgrading to a 64-bit server, we've had trouble with
outer joins that return NULLs (when there is no corresponding record on the
joined table).
select a.PRSK01, b.PSTA15
from TESTHA.POLMAST a
left join TESTHA.P15POLDP b
on a.POLC01 = b.PPOL16
where POLC01 = 3950136
This statement generates a "long truncated DBI attribute LongTruncOk not
set and/or LongReadLen too small)" error. A DBI trace shows that the
datalen of column #2 is being set to 429467295 (0xffffffff) instead of -1:
bind_columns fbh=ba55a0 fields=2
Bind 1: type = CHAR(1), buf=c35940, buflen=4
Bind 2: type = CHAR(1), buf=c35944, buflen=3
bind_columns=0
SQLFetch=0
fetch num_fields=2
fetch col#1 PRSK01 datalen=1 displ=4
'2'(1)
fetch col#2 PSTA15 datalen=4294967295 displ=3
!!dbd_error2(err_rc=-999, what=st_fetch/SQLFetch (long truncated DBI
attribute LongTruncOk not set and/or LongReadLen too small),
handles=(bdfef0,be0600,c4e040)
!SQLError(bdfef0,be0600,c4e040) = (HY000, 1, st_fetch/SQLFetch (long
truncated DBI attribute LongTruncOk not set and/or LongReadLen too small))
I can work around the error in ODBC::DBD by setting the datalen to -1 in
dbdimp.c, but I'm hoping there is a better solution.
if (DBIc_TRACE(imp_sth, DBD_TRACING, 0, 4))
PerlIO_printf(
DBIc_LOGPIO(imp_dbh),
" fetch col#%d %s datalen=%ld displ=%lu\n",
i+1, fbh->ColName, (long)fbh->datalen,
(unsigned long)fbh->ColDisplaySize);
if (fbh->datalen == 0xffffffff) {
fbh->datalen = -1;
}
if (fbh->datalen == SQL_NULL_DATA) { /* NULL value */
SvOK_off(sv);
continue;
}
This error does not occur using isql, which is part of unixOBDC.
Any hints to how I can better fix this issue?
Thanks,
Keith Carangelo
--
http://www.kcaran.com