Ошибка доступа к временной таблице Oracle - PullRequest
2 голосов
/ 30 июня 2010

У меня есть глобальная временная таблица в Oracle.Он использует ON COMMIT DELETE ROWS.Одним из столбцов в таблице является столбец XMLType.Я использовал таблицы GLOBAL TEMP довольно ... с успехом.Однако после введения столбца XMLType и запуска функции для таблицы TEMP я получаю следующее сообщение об ошибке:

ORA-14453: attempt to use a LOB of a temporary table

- этот код (который находится в функции) barfs.THE_TABLE - это временная таблица, содержащая столбец XMLType, а THE_ROWS - это объект коллекции

   DECLARE v_table            a_collection_table;


   SELECT mcs2.THE_ROWS (  
                  xml, f1, f2 )
   BULK COLLECT INTO v_table
     FROM (SELECT *
             FROM THE_TABLE) a;


   -- Executing a commit flushes the records
   -- for the temp table for this session
   COMMIT;
   --
   RETURN v_table;

. Этот код работает после удаления столбца XMLType. Мне нужен столбец XML, и я могу выполнить это с помощью отдельноговременная таблица со столбцом XML и выполнение какой-то работы для ее анализа .... Мне просто было любопытно узнать причину

   DECLARE v_table           a_collection_table;

   SELECT mcs2.THE_ROWS (  
                  f1, f2 )
   BULK COLLECT INTO v_table
     FROM (SELECT *
             FROM THE_TABLE) a;


   -- Executing a commit flushes the records
   -- for the temp table for this session
   COMMIT;
   --
   RETURN v_table;

У кого-нибудь есть идеи?Спасибо

1 Ответ

2 голосов
/ 01 июля 2010

Похоже, вы пытаетесь использовать данные XML после совершения транзакции. Может помочь более полный пример (структура таблицы, вставка и выполнение).

Но как пример:

create global temporary table test_tt (id number, x xmltype) on commit delete rows;

insert into test_tt values (1,
'<?xml version="1.0"?> <ROWSET>  <ROW>   <DUMMY>X</DUMMY>  </ROW> </ROWSET>');

select extract(x,'/ROWSET/ROW/DUMMY') from test_tt;

commit;
declare
  v_xml xmltype;
begin
  insert into test_tt values (1,
    '<?xml version="1.0"?> <ROWSET>  <ROW>   <DUMMY>X</DUMMY>  </ROW> </ROWSET>');
  select x into v_xml from test_tt;
  commit;
  insert into test_tt values (2,v_xml);
end;
/

Автономный выбор работает нормально.

Ошибки PL / SQL из-за «ORA-08103: объект больше не существует», что аналогично ORA-14453. V_xml является частично / главным образом указателем на LOB. Помните, что размер больших объектов может быть гигабайтом, поэтому они не полностью материализуются в память. Когда происходит фиксация, это указатель на то, что больше не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...