PEPPLER.ORG
Michael Peppler
Sybase Consulting
Menu
Home
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
Freeware
Sybperl
Sybase::Simple
DBD::Sybase
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
FAQs
Sybase on Linux FAQ
Sybperl FAQ
Personal
Michael Peppler's resume

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)