Oracle
 sql >> Database >  >> RDS >> Oracle

La funzione EXTRACT di Oracle interrompe il NOENTITYESCAPING in XMLELEMENT?

Prova a usare extractvalue() funzione, che esegue l'escape delle entità codificate, invece di extract() . Ecco un esempio:

clear screen;
column res format a20;

-- depending on a situation, NOENTITYESCAPING might be dropped

select extractvalue(
                     xmlelement(NOENTITYESCAPING e,id,'->')
                    , '//text()'
                    ) as res
  from (select level as id 
          from dual 
       connect by level < 6)

Risultato:

RES                
--------------------
1->                  
2->                  
3->                  
4->                  
5->    

Ma l'uso di extractvalue() la funzione può essere limitata dal fatto che può restituire il valore di un solo nodo. In un caso di restituzione di valori di più nodi, utl_i18n pacchetto e unescape_reference() la funzione di quel pacchetto può essere utilizzata per annullare l'escape delle entità codificate:

clear screen;
column res format a20;

select utl_i18n.unescape_reference(xmlelement(root
                                             , xmlelement(node1, '>')
                                             , xmlelement(node2, '<')
                                             ).extract('//text()').getstringval()
                                   ) as res
 from dual
connect by level <= 3;

Risultato:

RES                
--------------------
><                   
><                   
>< 

Sì, come utl_i18n.unescape_reference() la funzione accetta solo valori di varchar2 tipo di dati e tipi che possono essere convertiti in modo implicito in varchar2 tipo di dati, hai le mani legate quando si tratta di elaborare "stringhe di grandi dimensioni ". In questa situazione puoi passare a dbms_xmlgen pacchetto e convert() funzione in particolare, che ha una versione sovraccarica in grado di accettare CLOB S. Ecco un esempio:

select dbms_xmlgen.convert(
                           xmlagg(xmlelement(root
                                             , xmlelement(node1, '>')
                                             , xmlelement(node2, '<')
                                             )
                                  ).extract('//text()').getclobval()
                          , 1) as res
 from dual
connect by level <= 3000;   -- 1 (second parameter of the convert() function)
                            -- instructs function to decode entities  

Risultato:

RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB