暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle xmlquery在XML中更新超过2426个节点

askTom 2017-02-28
342

问题描述

嗨,

我有一个场景来更新一个XML中的2500多个节点。

当我尝试更新超过2426个节点时,我得到一个错误,如下所示。

ORA-19112: 评估过程中引发的错误:
XVM-00004: 内部错误 “代码缓冲区溢出”。


实时SQL链接中给出了用于更新2426节点的PLSQL块。
https://livesql.oracle.com/apex/livesql/file/content_EM3I5LRDTVANV3XRO2GR7RAFM.html

尝试更新2427 (或更多) 节点时,相同的PLSQL块会出现上述错误。

这是oracle SQL中XQUERY将支持的最大限制吗?

提前谢谢。

专家解答

这似乎是一个限制,尽管我在任何地方都找不到此文档...

但这与您在修改表达式中列出的节点数有关。不是文档中的节点!

所以我不得不问:

为什么要明确列出XQuery表达式中的所有节点?您可以使用通配符来匹配节点。所以在你的例子中,你可以用以下方式替换整个循环废话构建v_clob_upd_sql:

declare default element namespace "http://www.mywrb.com/test/mys";  (: :)  
  copy $tmp := $inxml modify (
    (for $i in $tmp/datapacket/data/sec/row/* return replace value of node $i with xs:integer($i + 1))
  ) 
  return $tmp
复制


这使您能够使用2426多个节点更新文档:

DECLARE 
  v_data_xml CLOB; 
  v_clob_upd_sql VARCHAR2(1000); 
  v_bool BOOLEAN := false; 
  LV_OUT_XML XMLTYPE; 
  lv_number_of_nodes number := 10000; 
BEGIN 
 
 -- Variable holding the data XML  
  v_data_xml := q'[    
                        
                       
                       
                  ]'; 
  FOR I IN 1..lv_number_of_nodes 
  LOOP 
    dbms_lob.append(v_data_xml,''||i||''); 
  END LOOP; 
  DBMS_LOb.APPEND(v_data_xml,''); 
   
  -- XMLQUERY to update all the nodes in the data XML  
  v_clob_upd_sql := 'declare default element namespace "http://www.mywrb.com/test/mys";  (: :)  
  copy $tmp := $inxml modify (
    (for $i in $tmp/datapacket/data/sec/row/* return replace value of node $i with xs:integer($i + 1))
  ) 
  return $tmp';
   
  SELECT 
    xmlquery( v_clob_upd_sql passing xmltype(v_data_xml) AS "inxml" returning content) 
  INTO lv_out_xml 
  FROM dual; 
  dbms_output.put_line(substr(lv_out_xml.getClobVal(), 1, 400));
END;
/



  
    
      
        2
      
      
        3
      
      
        4
      
      
        5
      
      
        6
      
      
        7
      
       
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论