Ошибка нехватки памяти процесса при записи большого xml-файла с использованием oracle xmldb

Мы столкнулись с проблемой записи большого xml-файла с использованием средства xmldb Oracle 9i. Запрос генерирует около 3 миллионов строк, и оракул отвечает следующим сообщением об ошибке:

ERROR at line 1:
ORA-04030: out of process memory when trying to allocate 4012 bytes
(qmxtgCreateBuf,kghsseg: kolaslCreateCtx)
ORA-06512: at "....", line 1154
ORA-06512: at line 1
ERROR: 
ORA-00600: internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s],
[%s], [%s]

В журнале предупреждений:

Errors in file d:/db/admin/acc1/udump/acc1_ora_8112.trc:
ORA-00600: internal error code, arguments: [729], [104], [space leak], [], [], [], [], []

Мы пытались увеличить память процесса, но это практически не дало никакого эффекта.

Есть ли способ заставить оракул использовать меньше памяти для xml («ленивое проявление»/переключатель сквозной записи или что-то в этом роде?


person user3127003    schedule 22.12.2013    source источник
comment
Вы можете попробовать опубликовать этот вопрос на dba.stackexchange.com. Я говорю это, потому что это может быть проблема с конфигурацией.   -  person Robin Green    schedule 22.12.2013
comment
См. мой ответ на аналогичный вопрос.   -  person Luke Woodward    schedule 22.12.2013


Ответы (1)


Вам необходимо управлять памятью, потребляемой процессом, с помощью BULK операций и LIMITED PAGED запросов
Например:

DECLARE
  CURSOR c_customer IS
    SELECT CUSTOMER.id, CUSTOMER.name from CUSTOMER;
  TYPE customer_array_type IS TABLE OF c_customer%ROWTYPE INDEX BY BINARY_INTEGER;
  customer_array customer_array_type;
  fetch_size     NUMBER := 5000; -- scale the value to manage memory
BEGIN
  -- Open(create) XML file
  OPEN c_customer;
  loop
    FETCH c_customer BULK COLLECT
      INTO customer_array LIMIT fetch_size;
    FOR i IN 1 .. customer_array.COUNT LOOP
      null; -- Add XML nodes
    END LOOP;
    EXIT WHEN c_customer%NOTFOUND;
  END LOOP;
  CLOSE c_customer;
  -- Close(flush) XML file
End;

В некоторых случаях, когда размер файла превышает ограничения размера файла ОС, вам необходимо создать несколько файлов.

person Mohsen Heydari    schedule 22.12.2013