On Mon, 2003-03-10 at 12:36, Tim Bunce wrote:
> On Mon, Mar 10, 2003 at 08:37:45AM -0800, Michael Peppler wrote:
> > > >
> > > > > > Note that you *can't* get at the @@identity value if you insert data
> > > > > > using placeholders. This is because Sybase also localizes the
> > > > > > @@variables within each stored procedure, and when using placeholders
> > > > > > Sybase creates a temporary stored procedure for you on the fly.
>
> So the @@variables can't even be read by another stored procedure?
> If so, that seems remarkably unhelpful.
The idea is to be able to do nested procedure calls and not have a
called proc affect the @@variables in the caller (such as @@error,
@@identity, @@rowcount, etc). It makes sense in most situations, but
it's a problem here.
>
> Previously you said:
> > Off-hand I'm not sure how a last_insert_id() method would work for
> > DBD::Sybase, but there may be a way to build something that is at least
> > semi-reliable.
> So, any ideas?
>
> Taking a different tack... *if* @@identity is a sequence and AutoCommit
> is off then then "select max($column) from $table" would get it. No?
Yes, that would work.
However, the following won't:
$sth = $dbh->prepare('insert foo(...) values(?,...)');
$sth->execute('bar', ...);
$id_sth = $dbh->prepare('select max(id) from foo');
because now $id_sth resides on a different physical connection. You'd
have to finish() the original $sth, and then do the second prepare() to
get the max() value, which is of course rather annoying if you're doing
a bunch of inserts (though it's maybe unlikely that you really need the
last_id value if you're doing a batch of inserts).
Michael
--
Michael Peppler Data Migrations, Inc.
[EMAIL PROTECTED] http://www.mbay.net/~mpeppler
Sybase T-SQL/OpenClient/OpenServer/C/Perl developer available for short or
long term contract positions - http://www.mbay.net/~mpeppler/resume.html