On Thu, Feb 22, 2007 at 09:12:14AM +0000, Martin Evans wrote:
> Tim Bunce wrote:
> >On Wed, Feb 21, 2007 at 04:25:54PM +0000, Martin J. Evans wrote:
> >>Hi,
> >>
> >>I have DBIx::Log4perl which is currently connected to a DBD::Oracle. In 
> >>DBIx::Log4perl::st::execute I want to call DBD::Oracle's dbms_get_line 
> >>which is usually (from applications) called like this:
> >>
> >>@lines = $dbh->func('dbms_output_get');
> >>
> >>As I'm in st::execute I have a $sth and can get hold of a $dbh.
> >
> >I'd expect this to work:
> >
> >  $dbh = $sth->FETCH('Database');
> >  @lines = $dbh->func('dbms_output_get');
> 
> Thanks Tim, but that does not appear to work. In my 
> DBIx::Log4perl::execute method I now have (simplified):
> 
> sub execute {
>     my ($sth, @args) = @_;
> 
>     my $ret = $sth->SUPER::execute(@args);
> 
>     my $dbh = $sth->FETCH('Database');
>     my @d = $dbh->func('dbms_output_get');
> 
>     return $ret;
> }
> 
> and I still get
> 
> Deep recursion on subroutine "DBD::Oracle::db::dbms_output_get"
>
> dbms_output_get does create a new statement, prepare and execute it and 
> it appears when execute is called it ends up back in my 
> DBIx::Log4perl::execute method. I don't understand why this happens :-(

Ah. Of course. Why would you except it not to happen? ;-)

dbms_output_get calls execute() on a statement handle created from your
subclassed dbh handle. So your DBIx::Log4perl::st::execute will be
called when dbms_output_get calls the execute method.

You need to either use a separate non-DBIx::Log4perl dbh for the
dbms_output_get call, or try something more hackish like

    my @d = $dbh->func('dbms_output_get')
        unless $sth->{Statement} =~ /^begin dbms_output.get_line/;

Tim.

Reply via email to