14

我在一个 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; 

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

4

2 回答 2

9

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

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

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

于 2013-12-06T20:55:45.003 回答
6

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

于 2014-06-18T10:26:32.713 回答