web-dev-qa-db-ja.com

EXECUTE IMMEDIATEのたびにCOMMITが必要ですか?

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が必要ですか、それとも手順の最後に必要ですか?

7
Angelina

あなたが本当にコミットすることを余儀なくされているのは、ビジネストランザクションの終わりに他のthasnだけです:

  1. DDLを実行する場合:DDLの実行は、暗黙のコミットのペアでラップされます。
  2. ダイレクトパス挿入後:挿入がコミットされるまでテーブルを読み取ることはできません。

馬鹿げたコメントとして、コミットする正しいポイントは、ビジネストランザクションが完了したときです。それ以外の場合は、データベースを離れた部分的に完了してコミットされたトランザクションが論理的に矛盾した状態であることを検出して修正するためのコードを自分で作成する必要があります(たとえば、INVOICEレコードがINVOICE_DETAILレコードなしで存在します)。

9
David Aldridge

すべてのEXECUTEIMMEDIATEの後にコミットは必要ありません。特定のステートメントはコミットを必要としません。たとえば、TRUNCATEを使用してテーブルを切り捨てる場合です。切り捨てが行われ、コミットする必要はありません。ロールバックもありません。 COMMITとROLLBACKがセッション属性であることを知っておく必要があります。 EXECUTE IMMEDIATEによって実行されたステートメントだけでなく、現在のトランザクション内のコミットされていないすべての作業がコミットまたはロールバックされます。

4
user3752062