Как вставить данные в таблицу типа PL / SQL, а не в таблицу PL / SQL? - PullRequest
3 голосов
/ 10 февраля 2012

У меня есть таблица TDATAMAP, которая содержит около 10 миллионов записей, я хочу извлечь все записи в переменную табличного типа PL / SQL, сопоставить ее с некоторыми критериями и, наконец, вставить все необходимые записи в промежуточную таблицу.Пожалуйста, скажите мне, если это возможно сделать, используя переменную типа таблицы PL / SQL и BULK INSERT / COLLECT.Я также обеспокоен производительностью кода.

Ответы [ 2 ]

8 голосов
/ 10 февраля 2012

"Я хочу извлечь все записи в переменную табличного типа PL / SQL, сопоставить ее с некоторыми критериями и, наконец, вставить все необходимые записи в промежуточную таблицу."

Это может быть неправильный подход.SQL является основанным на множестве языком программирования.Он имеет функции, которые позволяют нам идентифицировать и работать только с тем набором записей, который мы хотим.

Таким образом, вместо трехэтапного процесса - извлечения, фильтрации, вставки - отмечайте радость множеств:

insert into your_staging_table 
select whatver
from your_10m_table
where something = your_matching_criteria;

Будут сценарии, когда этого недостаточно.Но это подход для начала.

7 голосов
/ 10 февраля 2012

Вы можете, но, вероятно, не должны загружать в память 10 миллионов записей одновременно - при условии, что памяти достаточно для хранения этого количества. Обычно BULK COLLECT используется с предложением LIMIT для обработки конечного числа строк одновременно, например, 1000

Из документации :

Предложение BULK COLLECT позволяет извлекать целые столбцы из результата. набор или весь набор результатов одновременно. В следующем примере извлекает столбцы из курсора в коллекцию:

DECLARE
   TYPE NameList IS TABLE OF emp.ename%TYPE;
   names NameList;
   CURSOR c1 IS SELECT ename FROM emp WHERE job = 'CLERK';
BEGIN
   OPEN c1;
   FETCH c1 BULK COLLECT INTO names;
   ...
   CLOSE c1;
END;

В следующем примере используется предложение LIMIT. С каждой итерацией в цикле оператор FETCH извлекает 100 строк (или меньше) в индекс таблица acct_ids. Предыдущие значения перезаписываются.

DECLARE
   TYPE NumList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
   CURSOR c1 IS SELECT acct_id FROM accounts;
   acct_ids NumList;
   rows NATURAL := 100;  -- set limit
BEGIN
   OPEN c1;
   LOOP
      /* The following statement fetches 100 rows (or less). */
      FETCH c1 BULK COLLECT INTO acct_ids LIMIT rows;
      EXIT WHEN c1%NOTFOUND;
      ...
   END LOOP;
   CLOSE c1;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...