在 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 语句

使用 PL/SQL 使用 forall 语法批量插入

Oracle PL/SQL 如何输出在 FORALL 语句中进行了多少次插入

在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?

如何在 PL/SQL 中使用 BULK COLLECT 和 FORALL 替换 CURSOR FOR LOOP?

在 PL/SQL Oracle 中将 FOR 语句转换为 FORALL