Re: Stupid Oracle question

[email protected] ("Martin J. Evans")
Newsgroups perl.dbi.users
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.