Oracle ne prend pas en charge les transactions imbriquées. Si une transaction est validée, elle est validée. C'est pourquoi vous ne souhaitez généralement pas valider (ou annuler) une transaction dans une procédure stockée, ce qui rend difficile la réutilisation de la procédure ailleurs si la sémantique de votre transaction diffère.
Vous pouvez cependant déclarer un point de sauvegarde au début de votre procédure et revenir à ce point de sauvegarde en cas d'erreur. Si vous supprimez ensuite le commit, la transaction est uniquement contrôlée par le code de l'application et non par le code de la base de données
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
Dans ce cas, cependant, mon parti pris serait de ne pas avoir de point de sauvegarde dans le code, de ne pas avoir de restauration et de ne pas intercepter l'exception à moins que vous ne fassiez quelque chose d'utile avec. Faites simplement le DML, laissez toutes les exceptions être levées et gérez-les dans votre application.