2011-03-09 127 views
1

PL/SQL循环是否在特定的时间间隔自动提交,还是我需要在循环之后提交?在PL/SQL中运行循环时,是否需要事后提交?

Oracle 10g和11g

FORALL i IN x.FIRST .. x.LAST 
    delete from table where 1=1; 

我现在有一个PL/SQL脚本进行批量收集,然后运行该FORALL遍历集合循环3种不同的。我目前正在每个循环完成后提交一个脚本中的commit语句。这是否需要?它是否会减慢执行速度,尤其是当该集合有数百万个条目时?

谢谢

回答

3

FORALL语句是标准的DML:它只是一批单独的语句。因此,您应该遵循标准规则来决定是否需要提交:只有在事务结束时才提交,当您达到一致的状态时,永远不会提交。

如果您有3个FORALL语句,没有理由提交3次,除非每个语句单独执行一个事务。

在任何情况下,如果您的作业在第一个FORALL语句后失败,如果您尚未提交尚未提交,重启将会容易得多。

4

您必须在FORALL后显式提交。毕竟,您正在使用FORALL执行高速DML,而且您应该知道,DML不会自动提交。另外,即使hough FORALL遍历一个集合的所有行,它也不是一个循环,而是一个声明。它既没有LOOP也没有END LOOP语句。

+2

虽然我同意你在答案中所说的一切,但我不认为它完全回答了这个问题。在FORALL语句后不需要*提交。您可以稍后再提交,并且您不应在交易结束前提交。 – 2011-03-10 12:37:31

+0

+1“FORALL不是一个循环” – 2011-05-26 03:33:20