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

Oracle 从非常大的xml中删除属性

ASKTOM 2019-10-04
472

问题描述

我有一个大小为52kb的xml,需要从xml中删除名称空间,
以下是im使用的代码,当xml为3-4 kb但大小时,它可以正常工作
以下是抛出的错误是:
是19011。00000-“字符串缓冲区太小”
* 原因: 要求的字符串结果太大,无法返回
* 操作: 将结果作为lob代替

过程删除属性

V_DOM_DOC dbms_xmldom.DOMDocument;
V_root_elimment DBMS_XMLDOM.DOMELEMENT;
V_XMLTYPE XMLTYPE;
开始
从表1中选择xml_col进入V_XMLTYPE;
V_DOM_DOC := dbms_xmldom.newDOMDocument(V_XMLTYPE);
V_ROOT_ELIMENT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_DOM_DOC);
-删除确切的名称空间。
dbms_xmldom.removeAttribute( V_ROOT_ELIMENT,'xmlns' );

V_XMLTYPE := DBMS_XMLDOM.GETXMLTYPE(V_DOM_DOC);

更新表1设置XML_COL_UPDT = V_XMLTYPE;

更新表1
设置XML_COL_UPDT = 替换 (XML_COL_UPDT,'rlc:',null);

DBMS_OUTPUT.PUT_LINE ('XMLNS属性移除 ');

结束移除属性;

专家解答

这里与XML无关,这是您使用的 “替换”

SQL> create table t (  xml_col xmltype, xml_col_updt xmltype);

Table created.

SQL>
SQL> set serverout on
SQL> declare
  2    x clob;
  3  begin
  4    x := q'[]';
  5
  6    for i in 1 .. 1000 loop
  7      x := x || 'Smith';
  8    end loop;
  9    x := x || '';
 10    dbms_output.put_line(length(x));
 11    insert into t values (xmltype(x),null);
 12    commit;
 13  end;
 14  /
94155

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL>
SQL> declare
  2    v_dom_doc dbms_xmldom.domdocument;
  3    v_root_eliment dbms_xmldom.domelement;
  4    v_xmltype xmltype;
  5  begin
  6    select xml_col into v_xmltype from t;
  7    v_dom_doc := dbms_xmldom.newdomdocument(v_xmltype);
  8    v_root_eliment := dbms_xmldom.getdocumentelement(v_dom_doc);
  9
 10    dbms_xmldom.removeAttribute( v_root_eliment, 'xmlns' );
 11
 12    v_xmltype := dbms_xmldom.getxmltype(v_dom_doc);
 13
 14    update t set xml_col_updt = v_xmltype;
 15
 16  --  update t
 17  --  set xml_col_updt= replace(xml_col_updt, 'rlc:',null);
 18
 19  end;
 20  /

PL/SQL procedure successfully completed.



你可以用clob代替

SQL> declare
  2    v_dom_doc dbms_xmldom.domdocument;
  3    v_root_eliment dbms_xmldom.domelement;
  4    v_xmltype xmltype;
  5    c clob;
  6  begin
  7    select xml_col into v_xmltype from t;
  8    v_dom_doc := dbms_xmldom.newdomdocument(v_xmltype);
  9    v_root_eliment := dbms_xmldom.getdocumentelement(v_dom_doc);
 10
 11    dbms_xmldom.removeAttribute( v_root_eliment, 'xmlns' );
 12
 13    v_xmltype := dbms_xmldom.getxmltype(v_dom_doc);
 14
 15    update t set xml_col_updt = v_xmltype;
 16
 17    c := replace(v_xmltype.getclobval(), 'rlc:',null);
 18    update t
 19    set xml_col_updt= xmltype(c);
 20
 21  end;
 22  /

PL/SQL procedure successfully completed.



文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论