On Fri, Jan 03, 2003 at 07:57:01AM -0800, Michael Peppler wrote:
> On Fri, 2003-01-03 at 02:42, Tim Bunce wrote:
> > On Fri, Jan 03, 2003 at 05:01:53AM +0200, Boris Penchev wrote:
> > > Dear All,
> > >
> > > 1. Yes, I know that if you have prepare you can make a lot of execute of it, and
>that i can make this query in start of my program
> > > or in one module.
> > > 2. I think that is a good idea to declare $id and $name in while loop, because I
>use it only in this loop
> > > 3. I recommend you to use finish() method
> >
> > I recommend you don't unless you know that the code will not read
> > all the rows that would be selected.
>
> Unfortunately when using DBD::Sybase the following code breaks, even if
> there is only one row to fetch for the first iteration:
>
> $sth = $dbh->prepare("select ... from ... where id = ?");
> $sth->execute(1);
> $row = $sth->fetch;
> $sth->execute(2); # dies here.
>
> The reason is that the Sybase client libraries (and DBD::Sybase) can
> only tell that *all* the results have been fetched once fetch() returns
> an empty/undef array.
Sure. That's true for most drivers. The 'Active' flag ($sth->{Active})
stays true until fetch() returns an empty/undef array, at which point
the driver should turn off the Active flag.
> Adding a $sth->finish before the second execute() call fixes the
> problem, of course.
The DBD::Sybase execute() method should effectively call finish() if
the statement handle is 'Active' when execute is called. That's one
of the main reasons the flag exists at all.
Tim.