1つのOracleプロシージャ内に複数のEXECUTEIMMEDIATEコマンドがあります。
EXECUTE IMMEDIATE 'DELETE FROM tbl1';
EXECUTE IMMEDIATE 'INSERT INTO tbl1...';
COMMIT;
EXECUTE IMMEDIATE 'DELETE FROM tbl3';
EXECUTE IMMEDIATE 'INSERT INTO tbl3 ...';
COMMIT;
EXECUTE IMMEDIATE 'DELETE FROM tbl4';
EXECUTE IMMEDIATE 'INSERT INTO tbl4 ...';
COMMIT;
これらすべてのCOMMITが必要ですか、それとも手順の最後に必要ですか?
あなたが本当にコミットすることを余儀なくされているのは、ビジネストランザクションの終わりに他のthasnだけです:
馬鹿げたコメントとして、コミットする正しいポイントは、ビジネストランザクションが完了したときです。それ以外の場合は、データベースを離れた部分的に完了してコミットされたトランザクションが論理的に矛盾した状態であることを検出して修正するためのコードを自分で作成する必要があります(たとえば、INVOICEレコードがINVOICE_DETAILレコードなしで存在します)。
すべてのEXECUTEIMMEDIATEの後にコミットは必要ありません。特定のステートメントはコミットを必要としません。たとえば、TRUNCATEを使用してテーブルを切り捨てる場合です。切り捨てが行われ、コミットする必要はありません。ロールバックもありません。 COMMITとROLLBACKがセッション属性であることを知っておく必要があります。 EXECUTE IMMEDIATEによって実行されたステートメントだけでなく、現在のトランザクション内のコミットされていないすべての作業がコミットまたはロールバックされます。