Массовая вставка записей с использованием BULK COLLECT и FORALL
Я новичок в PL/SQL и извлекаю огромное количество записей из разных таблиц и хочу вставить в одну таблицу в PL/SQL, используя анонимный блок с BULK COLLECT и FORALL. Может ли кто-нибудь помочь мне решить, является ли следующий код правильным. Я сослался на множество ссылок
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 TABLE
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: операторы выбора более сложны в реальном коде, а исходные таблицы "ABC" и "DEF" состоят из миллионов записей. Пожалуйста, помогите мне в написании эффективного кода.
1 ответ
Оптимальным решением было бы переписать ваш PL/SQL-код в один оператор SQL INSERT INTO SELECT, например:
INSERT INTO def
SELECT * FROM abc
UNION ALL
SELECT * FROM bcd;
Примечание: если в обоих abc
а также bcd
таблицы, и вы хотите, чтобы в этой ситуации была вставлена только 1 запись, а затем используйте UNION
вместо UNION ALL
,