如何更改XMLTYPE变量的字符集?

时间:2012-03-28 11:57:05

标签: oracle plsql blob xmltype

我目前正在使用非utf-8数据库,但我需要使用utf-8编码生成XMLType变量。我有一个解决方法但是Oracle中似乎存在错误,请参阅以下链接: https://forums.oracle.com/forums/thread.jspa?messageID=10238641

...和Oracle支持错误:7698684

该错误导致随机

ORA-1482: unsupported character set
ORA-6512: at "SYS.XMLTYPE", line 107

首先,我使用dbms_xmlgen包获取XMLType。该XMLType使用DB字符集进行编码。

要将其转换为utf-8字符集我喜欢这样:

  • 我使用NLS_CHARSET_ID使用getBlobVal方法将XMLType变量转换为BLOB变量 ('UTF8')作为参数
  • 我使用BLOD变量作为第一个参数和NLS_CHARSET_ID,使用XMLType构造函数方法将BLOB变量转换回XMLType ('UTF8')作为第二个参数。 这会导致随机错误:(

有人知道任何替代解决方案吗?

  l_xml   := dbms_xmlgen.getXMLType(l_ctx);
  l_xml_b := l_xml.getBlobVal(C_UTF8_CHARSET_ID);
  l_xml   := XMLType(l_xml_b, C_UTF8_CHARSET_ID);

1 个答案:

答案 0 :(得分:0)

我设法用转换功能做到了这一点。无法转换整个xml文档(甚至是它的clob值),只能转换元素值。

这不起作用(XMLType构造函数失败):

l_xml := XMLType(convert(l_xml.getClobVal, 'UTF8'));

所以我不得不将convert转换为查询字符串(这只是一个例子):

select dbms_xmlgen.getXMLType(
  q'{select convert('ä', 'UTF8') myValue from dual}')
from dual

最后,我创建了一个函数,它读取字典并循环遍历给定表/视图的所有列,并生成select语句字符串,其中所有列都单独转换为UTF8。然后可以将此字符串作为参数传递给dbms_xmlgen.newContext函数。