Oracle understøtter ikke indlejrede transaktioner. Hvis en transaktion binder, binder den. Det er derfor, du generelt ikke ønsker at begå (eller rulle tilbage) en transaktion i en lagret procedure, hvilket gør det vanskeligt at genbruge proceduren andre steder, hvis din transaktionssemantik er forskellig.
Du kan dog erklære et lagringspunkt i begyndelsen af din procedure og rulle tilbage til det lagringspunkt i tilfælde af en fejl. Hvis du derefter fjerner commit, så er transaktionen udelukkende kontrolleret af applikationskoden ikke af databasekoden
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
I dette tilfælde ville min bias dog være ikke at have et savepoint i koden, ikke at have en rollback og ikke at fange undtagelsen, medmindre du gør noget nyttigt med det. Bare lav DML, lad eventuelle undtagelser blive kastet, og håndter dem i din ansøgning.