Tim Bunce wrote:
> > 
> > Teradata supports named placeholders. The syntax is
> > :NAME, ie, SELECT * FROM TABLE WHERE COL1 = :col1;
> 
> So it matches Oracle syntax. Does DBD::Teradata allow
> $sth->bind_param(":col1", $foo);
> like DBD::Oracle? If not, could it?

No, it currently doesn't, but Yes, it (fairly easily) could. 
I've been considering it for some time, but (like so many
things) time/resources didn't permit.

> 
> > BTW: I don't see anything in DBI 1.38 that checks for
> > numeric parameter ID in bind_param() (tho bind_param_array() does),
> > so is it safe to assume individual drivers *could* just implement such 
> > (non-portable) support on their own
> 
> Yes. DBD::Oracle always has.
> 
> > (excluding array-binding support, and the "default"
> > binding via execute()/execute_array()). Which also raises the issue of how
> > the default bindings would map to named PHs (perhaps a simple arrayref
> > of the names supplied as an attribute ?)
> 
> No. The only thing I'd be happy with is what DBD::Oracle does.
> Use implicit placeholder names for the value so
> 
> $sth->execute($foo, $bar);
> 
> is the same as
> 
> $sth->bind_param(":p1", $foo)
> $sth->bind_param(":p2", $bar)
> $sth->execute();
> 


Explicit binding in this case is OK by me...is there any collision here with
the on-going row-wise vs. column-wise array binding thread ?

> Interestingly, the way it does that is to translate 'normal'
> placeholders into :p1, :p2 etc when the SQL is prepared.
> Then bind_param(1, ...) is treated as bind_param(":p1",...)
> which then means the Driver.xst for execute() "just works".
> 
> Tim.

Which is effectively what DBD::Teradata does, ie, the 1st named PH
occurance becomes PH 1, the 2nd becomes 2, etc. Actually, DBD::Teradata
currently doesn't pay much attention to what the app binds in that case, as there's
an explicit USING clause required to declare the order/type of the named
PHs. Formal support of named PHs would permit the DBD to generate the
USING clause internally if it was missing.

Jim Cromie wrote:
>
> Does this preclude the following ? (as I proposed in 1st message of thread)
> 
>     $sth->execute( { ":p1" => $foo, ":p2" => $bar } );
> 
> such an argument looks to be non-interfering with current usage,
> and would be an error w.o named placeholders in the statement's SQL.
> Multiple hashrefs could supply values for all the bindings, with later ones
> supplying defaults not previously given.
> 
>

Alas, since execute() currently doesn't support an attribute hash,
might it break some existing drivers ? I can certainly sympathize with
the desire for brevity, but I fear the existing function i/f isn't readily backward
compatible with your particular usage (at least in a portable manner)...
interestingly, execute_array() could be made compatible, since it does have an 
attribute hash.

Dean Arnold
Presicient Corp.
www.presicient.com

Reply via email to