Oracle nie obsługuje transakcji zagnieżdżonych. Jeśli transakcja zostanie zatwierdzona, zostanie zatwierdzona. Dlatego generalnie nie chcesz zatwierdzać (lub wycofywać) transakcji w procedurze składowanej, co utrudnia ponowne użycie procedury w innym miejscu, jeśli semantyka transakcji jest inna.
Możesz jednak zadeklarować punkt zapisu na początku procedury i wycofać się do tego punktu zapisu w przypadku błędu. Jeśli następnie usuniesz zatwierdzenie, transakcja jest kontrolowana wyłącznie przez kod aplikacji, a nie przez kod bazy danych
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
Jednak w tym przypadku moim nastawieniem byłoby nie mieć punktu zapisu w kodzie, nie mieć wycofywania i nie przechwytywać wyjątku, chyba że robisz z nim coś użytecznego. Po prostu wykonaj DML, pozwól wyrzucić wszelkie wyjątki i obsługuj je w swojej aplikacji.