Spróbuj użyć extractvalue()
funkcja, która usuwa kodowane jednostki, zamiast extract()
. Oto przykład:
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)
Wynik:
RES
--------------------
1->
2->
3->
4->
5->
Ale użycie extractvalue()
funkcja może być ograniczona tym, że może zwrócić wartość tylko jednego węzła. W przypadku zwracania wartości wielu węzłów utl_i18n
pakiet i unescape_reference()
funkcja tego pakietu może być użyta do odszyfrowania zakodowanych jednostek:
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;
Wynik:
RES
--------------------
><
><
><
Tak, jako utl_i18n.unescape_reference()
funkcja akceptuje tylko wartości varchar2
typ danych i typy, które można niejawnie przekonwertować na varchar2
typ danych, masz związane ręce, jeśli chodzi o przetwarzanie dużych „ciągów ". W tej sytuacji możesz przejść do dbms_xmlgen
pakiet i convert()
w szczególności funkcja, która ma przeładowaną wersję zdolną do akceptowania CLOB
s. Oto przykład:
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
Wynik:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB