http://www.perlmonks.org?node_id=991478


in reply to Re: DBI bind_param_inout trick
in thread DBI bind_param_inout trick

Looks like a bug in DBD::ODBC. Parameters are bound initially in ODBC at bind time and if they change at execute time they have to be rebound ODBC-wise. The following code is what tests whether a parameter needs to be rebound:

if (SvTYPE(phs->sv) != phs->sv_type /* has the type changed? */ || (SvOK(phs->sv) && !SvPOK(phs->sv)) /* is there still a string? * +/ || SvPVX(phs->sv) != phs->sv_buf /* has the string buffer moved? */ ) { if (!rebind_param(sth, imp_sth, imp_dbh, phs)) croak("Can't rebind placeholder %s", phs->name); }

Trouble is I didn't write that code which attempts to rebind the parameter ODBC-wise and although I understand the first and last test in the if condition the comment next to "(SvOK(phs->sv) && !SvPOK(phs->sv))" does not seem to agree with the code. I wonder what the original author meant. It also does not cater for a parameter being undef then a string.

Replies are listed 'Best First'.
Re^3: DBI bind_param_inout trick
by mje (Curate) on Sep 05, 2012 at 09:22 UTC
      Awesome! I expected this to not be supported in some DBDs, but if it fleshes out bugs where it is supposed to be supported, then it's done more than originally intended!

        Thanks for the example runrig. The problem was fairly specific in that it only went wrong it you called bind_param_inout with undef values initially then changed them to strings shorter than 28 characters. However, it was certainly a bug and I was a little surprised no one has hit it before.