Prøv at bruge extractvalue()
funktion, som frigør kodede enheder i stedet for extract()
. Her er et eksempel:
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)
Resultat:
RES
--------------------
1->
2->
3->
4->
5->
Men brugen af extractvalue()
funktion kan være begrænset af det faktum, at den kan returnere værdien af kun én node. I tilfælde af at returnere værdier af flere noder, er utl_i18n
pakke og unescape_reference()
funktionen af denne pakke kan bruges til at unescape kodede entiteter:
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;
Resultat:
RES
--------------------
><
><
><
Ja, som utl_i18n.unescape_reference()
Funktionen accepterer kun værdier af varchar2
datatype og typer, der implicit kan konverteres til varchar2
datatype, er dine hænder bundet, når det kommer til at behandle store "strenge ". I denne situation kan du henvende dig til dbms_xmlgen
pakke og konverter()
funktion især, som har en overbelastet version, der er i stand til at acceptere CLOB
s. Her er et eksempel:
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
Resultat:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB