0

我想了解批量收集forall语句的用法和需求。

这里提到的一个例子

在不同网页的大多数示例中;作者首先使用批量收集语句从表中获取数据。之后,他们使用该forall语句将其插入到目标表中。

DECLARE
TYPE prod_tab IS TABLE OF products%ROWTYPE;
products_tab   prod_tab := prod_tab();
 BEGIN
-- Populate a collection - 100000 rows
SELECT * BULK COLLECT INTO products_tab FROM source_products;

FORALL i in products_tab.first .. products_tab.last
 INSERT INTO target_products VALUES products_tab(i);

但我不明白什么时候选择这种方法。我想我可以编写如下代码:

INSERT INTO target_products
SELECT * FROM SOURCE_PRODUCTS;

而且我认为,插入到 select 语句中可以提高性能。

那么为什么我们需要选择批量收集forall语句呢?对于错误记录或任何其他优势?

4

3 回答 3

5

如果你可以通过一个INSERT INTO SELECT子句来实现你的需求,你甚至不需要使用forallandbulk collect语句。有句话说,“如果你能用 SQL 做,就用 SQL 做”。

但在某些情况下,您可能需要逐行处理数据,这可能会迫使您编写循环代码。这实际上很糟糕,这意味着您在该循环中的操作将作为单个语句执行。但是,如果您使用forallPL/SQL 引擎,PL/SQL 引擎将以基于集合的方式运行您的循环,这会给您带来真正的性能提升。

于 2013-06-13T12:57:39.253 回答
1

好吧,您的问题的答案是“只要有可能!”。

您的问题的问题是,在您描述的场景中,您甚至不需要 plsql。

forall适用于需要在将检索到的数据插入目标表之前使用 plsql 执行某些操作的情况。在这种情况下,您将在 plsql 集合中有大量数据,您希望将这些数据批量插入到目标表中。这就是forall用途,它比插入循环更有效。

于 2013-06-13T12:50:54.160 回答
0

这是一篇关于使用批量收集和 forall 的好文章:

http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

于 2013-06-13T12:46:37.283 回答