当文档包含特殊字符时,如何将dbms_xmldom.DOMDocument正确转换为CLOB

时间:2019-07-15 16:00:46

标签: xml oracle plsql

考虑以下SQLFiddle:http://sqlfiddle.com/#!4/888bc/1,它承载以下PL / SQL函数:

create or replace function GetSymbol return clob is
  v_domdocument dbms_xmldom.DOMDocument;
  v_root_node   dbms_xmldom.DOMNode;
  v_root_child  dbms_xmldom.DOMNode;
  v_text        dbms_xmldom.DOMNode;
  v_xmltype     xmltype;
begin
  v_domdocument := dbms_xmldom.newDOMDocument;
  dbms_xmldom.setVersion(v_domdocument, '1.0" encoding="UTF-8');
  dbms_xmldom.setCharset(v_domdocument, 'UTF-8');
  v_root_node  := dbms_xmldom.makeNode(v_domdocument);
  v_root_child := dbms_xmldom.appendChild(v_root_node,
                                          dbms_xmldom.makeNode(dbms_xmldom.createElement(v_domdocument, 'root')));
  v_text       := dbms_xmldom.appendChild(v_root_child,
                                          dbms_xmldom.makeNode(dbms_xmldom.createTextNode(v_domdocument, NCHR(8364)))); -- Euro symbol
  v_xmltype    := dbms_xmldom.getxmltype(v_domdocument);
  return v_xmltype.getClobVal;
end;

如果我执行以下SELECT语句:

select GetSymbol from dual;

...然后,SQLFiddle返回以下XML:

<?xml version="1.0" encoding="UTF-8"?> <root>€</root>

到目前为止,一切都很好。但是,如果我在Oracle 11g数据库上尝试此操作,则会突然得到:

<?xml version="1.0" encoding="UTF-8"?> <root>¿</root>

也就是说,在NVARCHAR2-> dbms_xmldom.DOMNode / dbms_xmldom.DOMDocument-> xmltype-> CLOB之间的转换过程中,欧元符号被“转换”为一个倒置的问号,如上所示。

关于正在发生的事情以及如何解决这个问题的任何想法?我的目标是返回正确显示欧元符号的XML。

0 个答案:

没有答案