首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批量收集...for所有用法

问批量收集...for所有用法
EN

Stack Overflow用户
提问于 2013-06-13 20:24:58
回答 3查看 24.5K关注 0票数 0

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

一个提到过的here示例

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

代码语言:javascript
复制
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);

但是我不知道什么时候选择这种方法。我想我可以像下面这样写代码:

代码语言:javascript
复制
INSERT INTO target_products
SELECT * FROM SOURCE_PRODUCTS;

我认为,insert into select语句可以提高性能。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-13 20:57:39

如果您可以通过INSERT INTO SELECT子句实现您的需求,那么您甚至不需要使用forall和bulk collect语句。有一句话叫“如果你能用SQL做,就用SQL做”。

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

票数 5
EN

Stack Overflow用户

发布于 2013-06-13 20:50:54

好吧,你的问题的答案是“当你可能的时候!”。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-13 20:46:37

下面是一篇关于bulk collect和forall使用的很好的文章:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17087020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档