我是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”由数百万条记录组成。 因此,请帮助我编写高效的代码。
答案 0 :(得分:0)
最佳解决方案是将PL / SQL代码重写为单个SQL INSERT INTO SELECT 语句,如下所示:
INSERT INTO def
SELECT * FROM abc
UNION ALL
SELECT * FROM bcd;
注意:如果abc
和bcd
表中都存在一些相同的记录,并且您只希望在这种情况下插入1条记录,则使用UNION
而不是{{1} }。