每次EXECUTE IMMEDIATE后都需要COMMIT吗?

Ang*_*ina 7 oracle stored-procedures executequery oracle11g sp-executesql

我在一个oracle过程中有多个EXECUTE IMMEDIATE命令.

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; 
Run Code Online (Sandbox Code Playgroud)

我是否需要所有这些COMMIT,或者只是在程序结束时?

Dav*_*dge 9

在业务交易结束时,您真正被迫提交的唯一时间是:

  1. 执行DDL时:DDL执行包含在一对隐式提交中.
  2. 直接路径插入后:在提交插入之前无法读取表.

作为评论,正确的提交点是业务交易完成时.否则,您需要自己编写一些代码来检测和修复已经使数据库处于逻辑上不一致状态的部分完成和提交的事务(例如,INVOICE记录存在而没有任何INVOICE_DETAIL记录).


use*_*062 5

每次 EXECUTE IMMEDIATE 后不需要提交。某些语句不需要提交;例如,如果您使用 TRUNCATE 截断表。截断已完成,无需提交。也没有回滚。您需要知道 COMMIT 和 ROLLBACK 是会话属性。当前事务中所有未提交的工作都被提交或回滚——不仅仅是由 EXECUTE IMMEDIATE 执行的语句。