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