使用BULK COLLECT和FORALL批量插入记录

时间:2019-02-08 20:49:05

标签: oracle plsql forall bulk-collect

我是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”由数百万条记录组成。 因此,请帮助我编写高效的代码。

1 个答案:

答案 0 :(得分:0)

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

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

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