Zkuste použít extractvalue()
funkce, která ruší kódované entity namísto extract()
. Zde je příklad:
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)
Výsledek:
RES
--------------------
1->
2->
3->
4->
5->
Ale použití extractvalue()
Funkce může být omezena tím, že může vrátit hodnotu pouze jednoho uzlu. V případě vrácení hodnot více uzlů utl_i18n
balíček a unescape_reference()
funkci tohoto balíčku lze použít k odstranění kódovaných entit:
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;
Výsledek:
RES
--------------------
><
><
><
Ano, jako utl_i18n.unescape_reference()
funkce přijímá pouze hodnoty varchar2
datový typ a typy, které lze implicitně převést na varchar2
datového typu, máte svázané ruce, pokud jde o zpracování velkých „řetězců ". V této situaci se můžete obrátit na dbms_xmlgen
balíček a convert()
zejména funkce, která má přetíženou verzi schopnou přijmout CLOB
s. Zde je příklad:
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
Výsledek:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB