Oracle tidak mendukung transaksi bersarang. Jika transaksi berkomitmen, itu berkomitmen. Itulah mengapa Anda biasanya tidak ingin melakukan (atau mengembalikan) transaksi dalam prosedur tersimpan, yang menyulitkan untuk menggunakan kembali prosedur di tempat lain jika semantik transaksi Anda berbeda.
Anda dapat, bagaimanapun, mendeklarasikan savepoint di awal prosedur Anda dan kembalikan ke savepoint itu jika terjadi kesalahan. Jika Anda kemudian menghapus komit, maka transaksi hanya dikendalikan oleh kode aplikasi bukan oleh kode database
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
Namun, dalam hal ini, bias saya adalah tidak memiliki savepoint dalam kode, tidak memiliki rollback, dan tidak menangkap pengecualian kecuali Anda melakukan sesuatu yang berguna dengannya. Lakukan saja DML, biarkan pengecualian apa pun dilemparkan, dan tangani di aplikasi Anda.