|
|
sybperl-l Archive
Up Prev Next
From: persicom at acedsl dot com
Subject: Re: Getting warning "no statement executing" Why?
Date: Oct 3 2002 3:29PM
Quoting Michael Peppler :
> Short answer (I have to sit down and really read your message to see if
> it really applies).
>
> The piece of C code that you highlight does have a bug - the warning is
> triggered for some perfectly valid requests. I think I have a fix that
> is pending and should get applied RSN.
>
> Michael
Ok. In the meantime, I will patch my code with local WARN trap to ignore the
warning and just check for the end data result.
Thanks
> On Thu, 2002-10-03 at 07:27, Matthew.Persico@Lazard.com wrote:
> > I am occasionally (not reproducible) getting this error:
> >
> > no statement executing at /am/clrpt/lib/site_perl/5.6.1/Portia/Utils.pm
> line
> > 435.
> >
> > I get this statement about two or three times and then the next execution
> just
> > hangs. The process has to be terminated. A section of the relevant code
> is
> > listed below. Line 435 is commented for your perusal.
> >
> > ***
> > ** Question #1: Can anyone explain under what circumstances this can
> happen?
> > ***
> >
> > You will notice that the prepare and execute are error-checked (using eval
> and
> > $@ analysis) and that I am checking the return value from the
> fetchrow_hashref
> > call.
> >
> > ***
> > ** Question #2: Is there anything else I should be doing
> error-checking-wise
> > ** that I am not currently doing?
> > **
> >
> > I think this warning is coming from dbdimp.c (DBD::Sybase 0.94):
> >
> > 2399 /* Check that execute() was executed sucessfully. This also
> implies */
> > 2400 /* that describe() executed sucessfuly so the memory buffers
> */
> > 2401 /* are allocated and bound.
> */
> > 2402 if ( !DBIc_is(imp_sth, DBIcf_ACTIVE) || !imp_sth->exec_done ) {
> > 2403 warn("no statement executing");
> > 2404 return Nullav;
> > 2405 }
> >
> > Now, I can amend my code at line 435 to bark loudly if I get no results
> from the
> > fetchrow_hashref calling by checking that
> > scalar(@retVal) > 0, but what I'd RATHER do is make that warning be a
> fatal,
> > since no rows fetched is an OK result that can be handled by the caller of
> this
> > routine. That leads to question #3:
> >
> > ***
> > ** Question #3: How can I trap this in my code?
> > ***
> >
> > I am in perl 5.6.1 so I could try this:
> >
> > a) Turn up the warnings:
> >
> > {
> > ## Lexically scoped use pragma limited to these braces
> > use warnings FATAL => qw/all/;
> > while ($rh_row = $sth->fetchrow_hashref()) { ##### Line 435
> > my %rowCopy = %{$rh_row};
> > push @retVal, \%rowCopy;
> > }
> > }
> >
> > But I do not think this will work because the warning that is used in
> > DBD::Sybase is not part of the 'use warnings' hierarchy. (Maybe, we might
> want
> > to patch DBD::Sybase to register its warnings. See "Reporting Warnings from
> a
> > Module" in perldoc perllexwarn).
> >
> > Failing that, there's this old standby:
> >
> > b) Use a local WARN handler:
> >
> > eval {
> > local $SIG{__WARN__} =
> > sub {
> > die $_[0] if $_[0] =~ /no statement executing/;
> > warn $_[0];
> > }
> > while ($rh_row = $sth->fetchrow_hashref()) { ##### Line 435
> > my %rowCopy = %{$rh_row};
> > push @retVal, \%rowCopy;
> > }
> > };
> > if($@ || $sth->err()) {
> > if($@ =~ /no statement executing/) {
> > ## do something specific to this error
> > } else {
> > ## do generic error handling
> > }
> > }
> >
> > I think I need to do option b. Any other suggestions for trapping and/or
> > diagnosis of the underlying problem?
> >
> > Thanks.
> > --
> > Matthew Persico
> > Vice President
> > Lazard
> > 30 Rockefeller Plaza
> > New York, NY 10020, USA
> > Phone Number: 212 632 8255
> > Fax Number: 212 332 5904
> > Email: matthew.persico@lazard.com
> >
> > ***
> > ** Code fragment:
> > **
> >
> > ###
> > ## $ldbh, the database handle, is passed into this routine
> >
> > ## The sql is dynamically built, but the basis for the sql is:
> > ## select pmf_id = id
> > ## ,symbol = symbol
> > ## ,portfolio = portfolio
> > ## ,account_no = pmf_string_06
> > ## ,fiscal_begin = convert(varchar,fiscal_begin,101)
> > ## ,acct_period_end = acct_period_end
> > ## ,live_on_portia = convert(varchar,pmf_date_03,101)
> > ## ,live_on_portia_plus = convert(varchar,pmf_date_04,101)
> > ## from pmf
> > ## where system_stat = 0
> > ## and symbol = '%s'
> > ## order by pmf_id desc
> >
> > my $sth = undef;
> > eval {
> > $sth = $ldbh->prepare($sql);
> > };
> > if($@ || $ldbh->err()) {
> > confess LogTextForDie("Some big string here");
> > }
> > $sth->{private_AMG_DBI_data} = {
> > DBMS => $ldbh->{private_AMG_DBI_data}->{DBMS},
> > handleType => "statement",
> > sql => $sql
> > };
> >
> > ####
> > ## Execute query
> > eval {
> > $sth->execute();
> > };
> >
> > if($@ || !$sth || $ldbh->err()) {
> > confess LogTextForDie("Some big string here");
> > }
> >
> > ####
> > ## Get results
> > my @retVal = ();
> > my $rh_row = undef;
> > while ($rh_row = $sth->fetchrow_hashref()) { ##### Line 435
> > my %rowCopy = %{$rh_row};
> > push @retVal, \%rowCopy;
> > }
> >
> > ## Clean up statement handle
> > $sth->finish();
> >
> >
> >
> --
> Michael Peppler / mpeppler@peppler.org / http://www.mbay.net/~mpeppler
> mpeppler@zetatools.com / ZetaTools, Inc / http://www.zetatools.com
> ZetaTools: Call perl functions as Sybase stored procedures!
>
-------------------------------------------------
This mail sent through AceDSL WebMail (http://webmail.acedsl.com)
|