每次EXECUTE IMMEDIATE后都需要COMMIT吗?

时间:2013-12-06 20:34:33

标签: oracle stored-procedures oracle11g sp-executesql executequery

我在一个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,或者只是在程序结束时?

2 个答案:

答案 0 :(得分:9)

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

  1. 执行DDL时:DDL执行包含在一对隐式提交中。
  2. 直接路径插入后:在提交插入之前无法读取表。
  3. 作为评论,正确的提交点是业务交易完成时。否则,您需要自己编写一些代码来检测和修复部分完成和提交的事务,这些事务使数据库处于逻辑上不一致的状态(例如,INVOICE记录存在而没有任何INVOICE_DETAIL记录)。

答案 1 :(得分:4)

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