我在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;
有人有什么想法吗?感谢
答案 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的大小可以是千兆字节,因此它们并没有完全实现到内存中。一旦提交发生,它就是指向不再存在的东西的指针。