我在一个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,或者只是在程序结束时?
答案 0 :(得分:9)
在商业交易结束时,您真正被迫提交的唯一时间是:
作为评论,正确的提交点是业务交易完成时。否则,您需要自己编写一些代码来检测和修复部分完成和提交的事务,这些事务使数据库处于逻辑上不一致的状态(例如,INVOICE记录存在而没有任何INVOICE_DETAIL记录)。
答案 1 :(得分:4)
每次EXECUTE IMMEDIATE后都不需要提交。某些陈述不需要提交;例如,如果使用TRUNCATE截断表。截断已完成,无需提交。也没有ROLLBACK。您需要知道COMMIT和ROLLBACK是会话属性。当前事务中的所有未提交的工作都将被提交或回滚 - 而不仅仅是由EXECUTE IMMEDIATE执行的语句。