我想了解批量收集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
语句?对于错误记录或任何其他优势?
答案 0 :(得分:5)
如果您可以通过INSERT INTO SELECT
子句实现您的要求,则甚至不需要使用forall
和bulk 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语句。
PL / SQL批量收集和批量绑定
有关详细信息>>>>>>> http://www.oraappdata.com/2017/02/plsql-bulk-collect-and-bulk-bind.html