Oracle临时表访问错误

时间:2010-06-30 13:29:55

标签: oracle

我在Oracle中有一个GLOBAL TEMPORARY表。它使用ON COMMIT DELETE ROWS。表中的一列是XMLType列。我已经使用了GLOBAL TEMP表...成功了。但是,在引入XMLType columne并对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列,并且可以使用a来完成此任务 使用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 个答案:

答案 0 :(得分:2)

听起来您在提交事务后尝试使用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的指针。请记住,LOB的大小可以是千兆字节,因此它们并没有完全实现到内存中。一旦提交发生,它就是指向不再存在的东西的指针。