Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle的提取函数是否破坏了XMLELEMENT中的NOENTITYESCAPING?_Xml_Oracle_Oracle11g_Escaping_Extract - Fatal编程技术网

Oracle的提取函数是否破坏了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

甲骨文11g。我发现如果我在XMLELEMENT函数中添加NOENTITYESCAPING,它会很好地关闭实体转义。然而,当我随后通过结果提取时,逃逸似乎又回来了

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