Coba gunakan extractvalue()
fungsi, yang melepaskan entitas yang disandikan, alih-alih extract()
. Ini contohnya:
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)
Hasil:
RES
--------------------
1->
2->
3->
4->
5->
Tetapi penggunaan extractvalue()
fungsi mungkin dibatasi oleh fakta bahwa ia dapat mengembalikan nilai hanya satu node. Dalam kasus mengembalikan nilai dari beberapa node, utl_i18n
paket, dan unescape_reference()
fungsi paket itu dapat digunakan untuk melepaskan entitas yang disandikan:
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;
Hasil:
RES
--------------------
><
><
><
Ya, sebagai utl_i18n.unescape_reference()
fungsi hanya menerima nilai varchar2
tipe data dan tipe yang dapat secara implisit dikonversi ke varchar2
tipe data, tangan Anda terikat saat memproses "string . besar ". Dalam situasi ini Anda dapat beralih ke dbms_xmlgen
paket dan convert()
fungsi khususnya, yang memiliki versi kelebihan beban yang mampu menerima CLOB
s. Berikut ini contohnya:
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
Hasil:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB