【问题标题】:Bulk insertion of records using BULK COLLECT and FORALL使用 BULK COLLECT 和 FORALL 批量插入记录
【发布时间】:2019-02-08 20:49:04
【问题描述】:

我是 PL/SQL 的初学者,我从不同的表中获取大量记录,并希望使用带有 BULK COLLECT 和 FORALL 的匿名块插入到 PL/SQL 中的单个表中。任何人都可以帮助我确定以下代码是否正确。我参考了很多链接

http://uksanjay.blogspot.com/2012/08/difference-between-bulk-collect-and.html?m=1

How do I use bulk collect and insert in Pl/SQl

有两个表 'ABC' 和 'BCD' 从中提取记录并插入到目标表 'DEF'

ABC 表(A、B、C 是列名)

A   B  C
1   X  Z1 
2   Y  Z2

BCD 表

A   B  C
1   X  Z1 
2   Y  Z2

在目标表“DEF”中,我必须插入两个表记录。

代码如下:

DECLARE
TYPE FETCH_ARRAY IS TABLE OF A_CUR%ROWTYPE;   
A_ARRAY FETCH_ARRAY;
CURSOR A_CUR IS
    SELECT * FROM ABC
    UNION ALL 
    SELECT * FROM BCD;
BEGIN   
OPEN A_CUR;
LOOP                      
    FETCH A_CUR BULK COLLECT INTO A_ARRAY LIMIT 1000; 
        FORALL i IN 1..A_ARRAY.COUNT
        INSERT INTO DEF VALUES A_ARRAY(i); 

    EXIT WHEN A_CUR%NOTFOUND

END LOOP;
CLOSE A_CUR;
COMMIT;
END;

PS:实际代码中select语句比较复杂,源表'ABC'和'DEF'包含百万条记录。 请帮助我编写高效的代码。

【问题讨论】:

  • your follow-up question 来看,您已经解决了这个问题并继续解决您真正的问题:跨数据库链接使用批量操作。
  • 这可以写成单个insert...select 语句。这样会更有效率,也更简单。
  • 你的大写锁定也开启了。

标签: oracle plsql forall bulk-collect


【解决方案1】:

最佳解决方案是将您的 PL/SQL 代码重写为单个 SQL INSERT INTO SELECT 语句,如下所示:

INSERT INTO def
    SELECT * FROM abc
    UNION ALL
    SELECT * FROM bcd;

注意:如果 abcbcd 表中存在一些相同的记录,并且您希望在这种情况下只插入 1 条记录,则使用 UNION 而不是 UNION ALL

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多