0

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

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

如何在 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'由百万条记录组成。所以请帮助我编写有效的代码。

4

1 回答 1

0

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

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

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

于 2019-02-11T08:52:44.803 回答