Oracle的提取函数是否破坏了XMLELEMENT中的NOENTITYESCAPING?
甲骨文11g。我发现如果我在XMLELEMENT函数中添加NOENTITYESCAPING,它会很好地关闭实体转义。然而,当我随后通过结果提取时,逃逸似乎又回来了Oracle的提取函数是否破坏了XMLELEMENT中的NOENTITYESCAPING?,xml,oracle,oracle11g,escaping,extract,Xml,Oracle,Oracle11g,Escaping,Extract,甲骨文11g。我发现如果我在XMLELEMENT函数中添加NOENTITYESCAPING,它会很好地关闭实体转义。然而,当我随后通过结果提取时,逃逸似乎又回来了 select xmlelement(NOENTITYESCAPING e,id,'->') from (select level as id from dual connect by level < 6) XMLELEMENT(NOENTITYESCAPINGE,I
select xmlelement(NOENTITYESCAPING e,id,'->')
from (select level as id
from dual
connect by level < 6)
XMLELEMENT(NOENTITYESCAPINGE,ID,'->')
---------------------------------------
<E>1-></E>
<E>2-></E>
<E>3-></E>
<E>4-></E>
<E>5-></E>
是否有任何修复/解决方法可以保持转义功能关闭?没有任何帮助。尝试使用extractvalue函数,该函数取消对编码实体的扫描,而不是提取。以下是一个例子:
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)
但是extractvalue函数的使用可能会受到限制,因为它只能返回一个节点的值。在返回多个节点的值的情况下,utl_i18n包和该包的unescape_引用函数可用于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;
结果:
RES
--------------------
1->
2->
3->
4->
5->
RES
--------------------
><
><
><
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB
谢谢你,尼古拉斯。我看到您更新了您的答案,因为我正要评论说,因为我正在使用XMLAGG来解决LISTAGG的4000个字符限制,而extractvalue不能解决这个问题。我已经尝试了您推荐的utl_i18n.unescape_引用,但是我认为这也达到了4000个字符的限制。下面是我当前的查询,它演示了问题:选择rtrimxmlaggxmlelement,id,'->'。提取'//text'按id排序。GetClobVal,','从选择级别作为id从双连接按级别<6@TrojanName我认为这也达到了4000个字符的极限是的。unescape_引用函数接受varchar2值。要处理大字符串,请使用dbms_xmlgen.convert函数。答案已更新。哇,惊人的答案!非常感谢你。甲骨文有很多做事的方法,有时可能太多了-谢谢,这对我非常有用,并且使用未记录的NOENTITYESCAPING拯救了我。oracle中的XML确实是一个大话题!
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
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB