在 PL/SQL 中运行 forall 循环时,是不是需要事后提交?
Posted
技术标签:
【中文标题】在 PL/SQL 中运行 forall 循环时,是不是需要事后提交?【英文标题】:When running a forall loop in PL/SQL, is it necessary to commit afterwards?在 PL/SQL 中运行 forall 循环时,是否需要事后提交? 【发布时间】:2011-03-09 22:15:30 【问题描述】:PL/SQL forall 循环是否以特定间隔自动提交,还是我需要在循环后提交?
Oracle 10g 和 11g
FORALL i IN x.FIRST .. x.LAST
delete from table where 1=1;
我目前有一个执行批量收集的 pl/sql 脚本,然后运行 3 个不同的 forall 循环来迭代收集。我目前在每个 forall 循环完成后提交,脚本中有一个提交语句。需要这个吗?它是否会减慢执行速度,尤其是当集合有几百万个条目时?
谢谢
【问题讨论】:
【参考方案1】:FORALL 语句是标准的 DML:它只是一组单独的语句。因此,您应该遵循标准规则来决定是否需要提交:只有在事务结束时达到一致状态时才提交,以前从来没有。
如果您有 3 个 FORALL 语句,则没有理由提交 3 次,除非单独执行的每个语句都是一个事务。
无论如何,如果您的作业在第一个 FORALL 语句之后失败,如果您还没有提交,重新启动会容易得多。
【讨论】:
【参考方案2】:您必须在 FORALL 之后显式提交。毕竟,您正在使用 FORALL 执行高速 DML,并且您(应该)知道,DML 不会自动提交。
此外,即使 FORALL 遍历集合的所有行,它也不是循环,而是语句。它既没有 LOOP 也没有 END LOOP 语句。
【讨论】:
虽然我同意你在回答中所说的一切,但我认为它并不能完全回答这个问题。在 FORALL 语句之后提交不是必要。您可以稍后提交,并且您不应该在事务结束之前提交。以上是关于在 PL/SQL 中运行 forall 循环时,是不是需要事后提交?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL 如何输出在 FORALL 语句中进行了多少次插入
在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?