Быстрое копирование больших таблиц. Oracle DB.

Данный скрипт копирует данные из таблиц с большим объемом записей. Преимущество, что копирование идет порциями с промежуточным комитом. Набор полей курсора должен совпадать с набором полей таблицы назначения.

DECLARE
  -- ОБЪЯВЛЯЕМ КУРСОР
  CURSOR CUR IS
  SELECT * FROM <ТАБЛИЦА ИСТОЧНИК>;
  -- ПОЛЬЗОВАТЕЛЬСКИЙ ТИП НА ОСНОВАНИИ РЕЗУЛЬТИРУЮЩЕГО НАБОРА КУРСОРА
  TYPE T_FETCH_TABLE IS TABLE OF CUR%ROWTYPE;
  -- ОБЪЯВЛЯЕМ КОЛЛЕКЦИЮ С ПОЛЬЗОВАТЕЛЬСКИМ ТИПОМ
  L_ARRAY T_FETCH_TABLE;
BEGIN
   -- ОТКРЫВАЕМ КУРСОР И В ЦИКЛЕ ЕГО ОБРАБАТЫВАЕМ
   OPEN CUR;
   LOOP
      -- ОТ КУРСОРА ОТКУСЫВАЕМ ПО 1000 ЗАПИСЕЙ
      FETCH CUR BULK COLLECT
      INTO L_ARRAY LIMIT 1000;
      -- ЕСЛИ НЕОБРАБОТАННЫЕ ЗАПИСИ ЗАКОНЧИЛИСЬ, ТО ЗАВЕРШАЕМ ЦИКЛ
      EXIT WHEN L_ARRAY.COUNT = 0;
      -- БЫСТРАЯ ВСТАВКА ЗАПИСЕЙ В ТАБЛИЦУ
      FORALL I IN 1 .. L_ARRAY.COUNT
        INSERT INTO <ТАБЛИЦА НАЗНАЧЕНИЯ> VALUES L_ARRAY(I);
        COMMIT;
      END LOOP;  
   CLOSE CUR;
EXCEPTION
WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('ОШИБКА!' || CHR(13) || CHR(10) || ' -> ' || SQLERRM);
END;
07:41
28
Нет комментариев. Ваш будет первым!
Загрузка...