Oracleはネストされたトランザクションをサポートしていません。トランザクションがコミットすると、コミットします。そのため、通常、ストアドプロシージャでトランザクションをコミット(またはロールバック)したくないため、トランザクションのセマンティクスが異なる場合、他の場所でプロシージャを再利用することは困難です。
ただし、プロシージャの最初にセーブポイントを宣言し、エラーが発生した場合はそのセーブポイントにロールバックすることができます。その後、コミットを削除すると、トランザクションはデータベースコードではなく、アプリケーションコードによってのみ制御されます
begin
savepoint beginning_of_proc;
insert/update/delete...
exception
when OTHERS then
rollback to beginning_of_proc;
raise;
end;
ただし、この場合、私のバイアスは、コードにセーブポイントを持たないこと、ロールバックを持たないこと、そして例外をキャッチしないことです。 DMLを実行し、例外がスローされるようにして、アプリケーションでそれらを処理するだけです。