Массовая вставка записей с использованием BULK COLLECT и FORALL - PullRequest
0 голосов
/ 08 февраля 2019

Я новичок в 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 ARE COLUMN NAMES)

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 Ответ

0 голосов
/ 11 февраля 2019

Оптимальным решением было бы переписать ваш код PL / SQL в один оператор SQL INSERT INTO SELECT , например:

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

Примечание: если существуют какие-то одинаковые записив таблицах abc и bcd, и вы хотите, чтобы в этой ситуации была вставлена ​​только 1 запись, затем используйте UNION вместо UNION ALL.

...