Oracle не поддържа вложени транзакции. Ако транзакцията се ангажира, тя се ангажира. Ето защо обикновено не искате да извършвате (или връщате назад) транзакция в съхранена процедура, което затруднява повторното използване на процедурата другаде, ако семантиката на транзакцията ви се различава.
Можете обаче да декларирате точка на запис в началото на вашата процедура и да се върнете обратно към тази точка на запис в случай на грешка. Ако след това премахнете комита, тогава транзакцията се контролира единствено от кода на приложението, а не от кода на базата данни
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
В този случай обаче моето пристрастие би било да нямам точка за запис в кода, да нямам връщане назад и да не хвана изключението, освен ако не правите нещо полезно с него. Просто направете DML, оставете всички изключения да бъдат изхвърлени и ги обработвайте във вашето приложение.