Oracle stöder inte kapslade transaktioner. Om en transaktion binder, binder den. Det är därför du i allmänhet inte vill utföra (eller återställa) en transaktion i en lagrad procedur, vilket gör det svårt att återanvända proceduren någon annanstans om din transaktionssemantik skiljer sig.
Du kan dock deklarera en räddningspunkt i början av din procedur och återgå till den räddningspunkten i händelse av ett fel. Om du sedan tar bort commit så kontrolleras transaktionen enbart av applikationskoden inte av databaskoden
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
I det här fallet skulle min fördom vara att inte ha en räddningspunkt i koden, att inte ha en återställning och att inte fånga undantaget om du inte gör något användbart med det. Gör bara DML, låt eventuella undantag kastas och hantera dem i din ansökan.