Cố gắng sử dụng extractvalue()
hàm, không thoát khỏi các thực thể được mã hóa, thay vì extract()
. Đây là một ví dụ:
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)
Kết quả:
RES
--------------------
1->
2->
3->
4->
5->
Nhưng việc sử dụng extractvalue()
chức năng có thể bị giới hạn bởi thực tế là nó chỉ có thể trả về giá trị của một nút. Trong trường hợp trả về giá trị của nhiều nút, utl_i18n
gói và unescape_reference()
chức năng của gói đó có thể được sử dụng cho các thực thể được mã hóa unescape:
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;
Kết quả:
RES
--------------------
><
><
><
Có, như utl_i18n.unescape_reference()
hàm chỉ chấp nhận các giá trị của varchar2
kiểu dữ liệu và các kiểu có thể được chuyển đổi hoàn toàn thành varchar2
loại dữ liệu, tay của bạn bị ràng buộc khi xử lý " chuỗi lớn" ". Trong trường hợp này, bạn có thể chuyển sang dbms_xmlgen
gói và chuyển đổi ()
cụ thể là hàm có phiên bản quá tải có khả năng chấp nhận CLOB
S. Đây là một ví dụ:
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
Kết quả:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB