|
|
sybperl-l Archive
Up Prev Next
From: Michael Peppler <mpeppler at peppler dot org>
Subject: Re: Getting warning "no statement executing" Why?
Date: Oct 3 2002 2:45PM
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
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!
|