我想了解批量收集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;我认为,insert into select语句可以提高性能。
那么为什么我们需要选择批量收集forall语句呢?用于错误日志记录或任何其他优点?
发布于 2013-06-13 20:57:39
如果您可以通过INSERT INTO SELECT子句实现您的需求,那么您甚至不需要使用forall和bulk collect语句。有一句话叫“如果你能用SQL做,就用SQL做”。
但在某些情况下,您可能需要逐行处理数据,这可能会迫使您编写循环。这实际上很可怕,这意味着您在该循环中的操作将在over上作为单个语句执行。但是如果您使用forall,PL/SQL引擎将以基于集合的方式运行您的循环,这将给您带来真正良好的性能提升。
发布于 2013-06-13 20:50:54
好吧,你的问题的答案是“当你可能的时候!”。
你问题的问题是,在你描述的场景中,你甚至不需要plsql。
forall适用于在将检索到的数据插入到目标表之前,需要使用plsql对其执行某些操作的情况。在这种情况下,您将在plsql集合中有大量数据,您希望将这些数据批量插入到目标表中。这就是forall的用途,它比在循环中插入要高效得多。
发布于 2013-06-13 20:46:37
下面是一篇关于bulk collect和forall使用的很好的文章:
http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html
https://stackoverflow.com/questions/17087020
复制相似问题