Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Re: DBI bind_param_inout trick

by mje (Curate)
on Sep 03, 2012 at 16:11 UTC ( #991463=note: print w/replies, xml ) Need Help??

in reply to DBI bind_param_inout trick

Just out of interest I tried this with DBD::ODBC after removing the "from dual" and changing the bind_param_inout calls to remove the ':' (which is not supported in DBD::ODBC - see note in DBD::ODBC). The output is worryingly different from DBD::Oracle:

DBD::Oracle output: abc 123 abc 456
DBD::ODBC output: 123 456

Replies are listed 'Best First'.
Re^2: DBI bind_param_inout trick
by mje (Curate) on Sep 03, 2012 at 16:58 UTC

    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.

        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!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://991463]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (5)
As of 2018-04-26 04:49 GMT
Find Nodes?
    Voting Booth?