On Tue, Mar 11, 2003 at 01:30:30PM -0800, Michael Peppler wrote:
> 
> It looks like it pays to question things.
> 
> The following works, although I was sure it wouldn't:
> 
> my ($sth, $sth2);
> 
> $sth = $dbh->prepare("insert dbi_insert(c, i) values(?,?)");
> for(my $i = 0; $i < 2; $i++) {
>     $sth->execute("foo", 1);
>     $sth2 = $dbh->prepare("select max(id) from dbi_insert");
>     $sth2->execute;
>     while(my $d = $sth2->fetch) {
>       print "identity = @$d\n";
>     }
> }
> 
> Both $sth and $sth2 are on the same connection, and $sth *can* be reused
> after $sth2 is done.
> 
> Which means that fetching the values will be a little easier (although
> there are locking issues, of course!)

Right.

So this will work reliably for DBD::Sybase:

    sub last_insert_id {
        my ($dbh, $table, $field) = @_;
        $_ = $dbh->quote_identifier($_) foreach ($table, $field);
        return $dbh->selectrow_array("select max($field) from $table");
    }

*if* AutoCommit is off. If AutoCommit is on then there's a risk
that the returned value will be incorrect if some other process has
performed an insert after yours. Right?

> Thanks for prodding me on this Tim!

A pleasure :)

Tim.

Reply via email to