Массовая вставка записей с использованием 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,

Другие вопросы по тегам