Bruce Johnson wrote: > > On May 6, 2010, at 11:34 AM, John Scoles wrote: > >> Bruce Johnson wrote: >> >> Depends if you have |AutoCommit| on or not and if you DB and DBD >> friver can do a rollback. > > > I've explicitly turned autocommit off, so I can roll back transactions > if an error occurs.
You do not /need/ to do that. You can leave AutoCommit turned on and when you want to start a txn you issue a begin_work then a commit/rollback. With some DBDs if you disable AutoCommit you'd need to commit everything including selects which can be a bit annoying. So in general with DBD::Oracle you can: connect # AutoCommit is on by default # set RaiseError => 1 eval { $dbh->begin_work # do something in the txn }; if ($@) { $dbh->rollback or die "Failed to rollback - perhaps add DBI->err here"; } else { $dbh->commit or die "Failed to commit"; } Please note - the above is simplified - I don't personally do that and generally use Try::Tiny to avoid issues with $...@. > In the old Oraperl syntax it's: > > if ($ora_errstr){ > print "$ora_errstr occurred with $statement"; > &ora_rollback($dbh); > } > &ora_commit($dbh); > > I'm redoing some old scripts to use DBI instead, so I'm guessing the > equivalent DBI code is: > > if ($ora_errstr){ > print "$ora_errstr occurred with $statement"; > $dbh->rollback(); > } > $dbh->commit(); > Didn't use Oraperl so difficult to say - my example should work though without having to examine any errors so long as RaiseError is enabled on the connection handle. Martin