2010-06-30 9 views
2

J'ai une table TEMPORAIRE GLOBALE dans Oracle. Il utilise ON COMMIT DELETE ROWS. L'une des colonnes de la table est une colonne XMLType. J'ai utilisé les tables GLOBAL TEMP un peu ... avec succès. Cependant, après l'introduction du Columne de XMLType et l'exécution d'une fonction sur la table TEMP je reçois ce message d'erreur:Erreur d'accès à une table temporaire Oracle

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

Code --Ce (qui est situé dans une fonction) vomit. THE_TABLE est la table temporaire contenant la colonne XMLType et THE_ROWS est un objet de collection

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; 

Code --Ce fonctionne après avoir enlevé la colonne XMLType bien sûr, j'ai besoin de la colonne XML, et peut parvenir grâce à une table temporaire séparée avec une colonne XML et de faire un travail pour analyser dehors .... J'étais curieux à la cause

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; 

tout le monde a des idées? Merci

Répondre

2

Il semble que vous essayiez d'utiliser les données XML après la validation de la transaction. Un exemple plus complet (structure de la table, insertion et exécution) peut aider.

Mais comme exemple:

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

Les travaux de sélection autonomes fin.

Les erreurs PL/SQL avec "ORA-08103: objet n'existe plus", similaire à l'ORA-14453. Le v_xml est en partie/principalement un pointeur vers le LOB. Souvenez-vous que les LOB peuvent avoir une taille de gigbytes, donc elles ne sont pas entièrement matérialisées dans la mémoire. Une fois la validation effectuée, c'est un pointeur vers quelque chose qui n'existe plus.

+0

C'est un super hlep. Ouais, les tables temporaires dans le passé avec la colonne XMLType retourné très bien. Mais avec le XMLType, ce problème est survenu. Je vais inclure du code ci-dessus. – MikeTWebb

Questions connexes