【发布时间】: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