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

时间:2013-06-13 12:24:58

标签: oracle plsql bulkinsert

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

提到here

的例子

在大多数不同网页的例子中;作者首先使用批量收集语句从表中获取数据。之后,他们使用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 个答案:

答案 0 :(得分:5)

如果您可以通过INSERT INTO SELECT子句实现您的要求,则甚至不需要使用forallbulk collect语句。有一种说法,“ 如果你能在SQL中做,那就用SQL ”。

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

答案 1 :(得分:1)

嗯,你的问题的答案是“你什么时候可能!”。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

每当我们将OP / SQL块提交到oracle服务器时,总是会执行SQL语句。通过SQL引擎和程序语句执行。通过程序声明执行者。这个程序语句执行器在PL / SQL引擎中可用,每当我们通过SQL使用大量加载时,PL / SQL语句总是oracle服务器通过这些引擎分别执行这些语句。这种类型的执行方法总是内容切换执行方法降低了应用程序的性能。为了解决这个问题,oracle使用集合引入了“批量绑定”进程,即在这种方法中,oracle服务器一次执行所有SQL语句。

  1. 选择... INTO ...子句
  2. 游标提取语句
  3. DML返回条款
  4. PL / SQL批量收集和批量绑定

    有关详细信息>>>>>>> http://www.oraappdata.com/2017/02/plsql-bulk-collect-and-bulk-bind.html