Not quite. It knows if the perl scalar value has numeric and/or string representations cached (the SvPOK and SvINOK flags).
Getting those back would be enough to handle the quoting issue. I can pass '0' as a value from perl into an sth and SOME sort of conversion is done on the way in that allows the database to deal with it as a number. I can also pass in 0 + 0 and have it stringified for insertion into a varchar2. This is a huge benefit in data handling but makes dealing with error messages a pain because the support people don't want to paste-and-quote-ify each of the placeholder values by hand if I spew out sql with placeholders and some values in my error message.
I don't see how anything keyed by NAME could help with anything related to placeholders.
For placeholders the ParamValues attribute exists already and I've also previously talked about adding a ParamAttribs attribute.
I can look up the names from the query. Last time I brought this up hashed results seemed to be the answer. For my part an array of database-requires-stringy would be ideal.
Plus, the paramvalues comes as a hash, not an array (though a vector of placeholders properly quoted would make error message reporting simpler):
"ShowErrorStatement" (boolean, inherited) ...
If "$h->{ParamValues}" returns a hash reference of parameter (placeholder) values then those are format- ted and appended to the end of the Statement text in the error message.
DBI::looks_like_number() would be better, for some definition of better.
Problem is numeric char sequences. I may have to store "0" in a varchar.
my $sql = "insert into table( blah blah blah ) values ( ?, ?, ? )";
my $insert = $dbh->prepare( $sql );
...
eval { $insert->execute( @_ ) };
if( $@ ) { # oops. support folk don't want to paste values into # the '?' by hand. trick now is to convert the '?' # into properly quoted values so that they can # cut+paste the result directly into their database # interface for testing why the query had problems.
my @needsquotz = $insert->SvTypes;
my $revised = $sql;
for my $value ( @_ ) { $field = qq{'$field'} if shift @needsquotz;
$revised = s/\?/$field/;
croak <<"END"; Roadkill: unable to execute insert:
$revised;
Due to:
$@
END }
}
All this does is replace '?' with properly quoted values.
The ONLY reason this is really necessary is handling digit-strings, which "look" numeric but are stored as numbers. This is a serious problem in the financial industry, as they habitually store monitary amounts as strings to avoid rounding issues. Sybase -- the database in place where I ran across this issue -- does not gracefully handle converting a naked 0 to "0" for insertion into a stringy field (usually a varchar2).
Given a decent way of getting the stringy behavior (and a flag of SvPOK vs. SvINOK would work) I could easly write DBIx::PlaceHolderFill to convert sql + the arguments into a pasteable representation of the data.
enjoi
-- Steven Lembark 85-09 90th Street Workhorse Computing Woodhaven, NY 11421 [EMAIL PROTECTED] 1 888 359 3508