2010-06-30 2 views
2

Oracle에 GLOBAL TEMPORARY 테이블이 있습니다. 그것은 ON COMMIT DELETE ROWS를 사용합니다. 테이블의 열 중 하나가 XMLType 열입니다. 나는 GLOBAL TEMP 테이블을 꽤 많이 사용했다 ... 성공했다.Oracle 임시 테이블 액세스 오류

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

--This 코드 (함수에 위치) barfs : 그러나, TEMP 테이블에 대해 함수를 XMLType을의 columne를 도입하고 실행 한 후이 오류 메시지가 표시됩니다. 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; 

--This 코드는 물론, 나는 XML 열을 필요로 XMLType 열 을 제거한 후 작동하는 컬렉션 개체이며, 이것은 을 사용하여 수행 할 수있는 XML C 럼 어떤 일을 가진 별도의 임시 테이블을 구문 분석합니다 .... 내가

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; 

누구는 어떤 아이디어가 원인에 관해서는 그냥 궁금했다? 감사합니다.

답변

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; 
/

독립을 선택 작품 잘.

ORA-14453과 비슷한 "ORA-08103 : object is longer exists"로 PL/SQL 오류가 발생합니다. v_xml은 부분적으로/주로 LOB에 대한 포인터입니다. LOB는 크기가 기가 바이트 일 수 있으므로 메모리로 완전히 구체화되지는 않습니다. 일단 커밋이 발생하면 더 이상 존재하지 않는 것에 대한 포인터가됩니다.

+0

대단한 재미입니다. 예, XMLType 열을 제외하고 이전의 임시 테이블은 괜찮 았습니다. 그러나이 문제가 발생한 XMLType이 발생했습니다. 위의 코드를 일부 포함합니다. – MikeTWebb