Did you look at the new ParamValues attribute? Yes, many drivers probably do not support it yet, but that's what it's for. (Also, DBD::ODBC does support it and I believe that even if DBD::Oracle doesn't yet support it a small lift of the same/similar code from DBD::ODBC to DBD::Oracle should work...
Regards, Jeff > > Hello, > > In an attempt to add some custom logging into DBI calls, I have > over-ridden > the execute method of DBI with a custom execute method. The > project I have > includes writing out the SQL statement that is at fault if execute blows > up. This needs to be transparent to the user, and must work with all > existing DBI code that has been writen. > > My approach is simple. Override execute, add some error logging if $@ > returns back anything from an eval calling the real DBI execute. > One piece > is missing though. > > While printing out the statement from $pkg->{'STATEMENT'}, the > placeholders > used (?) ends up coming in literally. This is fine and I wouldn't mind > substituting the values passed for the bindings, but I cannot get to the > values. Let me clear that up.. > > If the user calls execute, binding the params within the execute, > I can get > them. They are passed to my execute statement and I can grab > them from @_, > but if the params are passed using bind_param, I cannot get them, save for > overriding the bind_param statement as well (somthing I would rather not > do). > > To make a long story short, I would like to know if there is any way to > access the values passed in a bind_param method call. > > Here is the over-ridden execute method, this works except for the > parameter > part. > > Thanks in advance. > > -Mark > > sub execute { > my $pkg = shift; > my $statement = $pkg->{'Statement'}; > > # if RaiseError or PrintError are set to 1 (lets hope), lets make sure > # we don't print the DBI error until we are ready to do so. > { > open TRAP, ">/dev/null"; > local *STDERR = *TRAP; > eval { $pkg->SUPER::execute(@_); }; > close TRAP; > } > > my @params = @_; > my $params = (@params) ? \@params : ( > my $tmp_p = $pkg->FETCH('driver_params') ? $tmp_p : [] ) ; > > my $num_of_parms = $pkg->{'NUM_OF_PARAMS'}; > > print "Number of Parameters: $num_of_parms\n"; > print "Parms = @$params\n"; > print "Executing Statement -> \n"; > print "\n".&$pretty_print($statement)."\n"; > > if ($@) { > warn "Could not execute statment -> \n"; > warn "\n".&$pretty_print($statement)."\n"; > die "$@\n"; # Yes this is intentional, die no matter what. > } > } > > > >