Oracle non supporta le transazioni nidificate. Se una transazione viene eseguita, viene eseguita. Ecco perché in genere non si desidera eseguire il commit (o il rollback) di una transazione in una procedura memorizzata, il che rende difficile riutilizzare la procedura altrove se la semantica della transazione è diversa.
Tuttavia, puoi dichiarare un punto di salvataggio all'inizio della procedura e tornare a quel punto di salvataggio in caso di errore. Se quindi rimuovi il commit, la transazione è controllata esclusivamente dal codice dell'applicazione e non dal codice del database
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
In questo caso, tuttavia, il mio pregiudizio sarebbe non avere un punto di salvataggio nel codice, non avere un rollback e non catturare l'eccezione a meno che tu non stia facendo qualcosa di utile con esso. Basta eseguire il DML, lasciare che vengano generate eventuali eccezioni e gestirle nella tua applicazione.