批量收集...用于所有用途

use*_*687 0 oracle plsql bulkinsert

我想了解用法和批量收集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);
Run Code Online (Sandbox Code Playgroud)

但是我不知道何时选择这种方法。我想我可以编写如下代码:

INSERT INTO target_products
SELECT * FROM SOURCE_PRODUCTS;
Run Code Online (Sandbox Code Playgroud)

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

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

Erk*_*lat 5

如果可以通过INSERT INTO SELECT子句实现要求,则甚至不需要使用foralland bulk collect语句。俗话说:“ 如果可以用SQL做到,那就用SQL做到 ”。

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