Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 如何更改XMLTYPE变量的字符集?_Oracle_Plsql_Blob_Xmltype - Fatal编程技术网

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

Oracle 如何更改XMLTYPE变量的字符集?,oracle,plsql,blob,xmltype,Oracle,Plsql,Blob,Xmltype,我目前使用的是非utf-8DB,但我需要使用utf-8编码生成XMLType变量。我有一个解决办法,但Oracle中似乎存在缺陷,请参阅以下链接: …和Oracle支持错误:7698684 该错误会导致随机错误 ORA-1482: unsupported character set ORA-6512: at "SYS.XMLTYPE", line 107 首先,我使用dbms_xmlgen包获得XMLType。该XMLType使用DB字符集编码 要将其转换为utf-8字符集,我执行以下操作:

我目前使用的是非utf-8DB,但我需要使用utf-8编码生成XMLType变量。我有一个解决办法,但Oracle中似乎存在缺陷,请参阅以下链接:

…和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')作为参数
  • 我使用XMLType构造函数方法将BLOB变量转换回XMLType,使用BLOB变量作为第一个参数和NLS_CHARSET_ID ('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);

我用convert函数实现了这一点,它不可能转换整个xml文档(甚至是它的clob值),只能转换元素值

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

因此,我必须将convert转换为查询字符串(这只是一个示例):


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

在它的文档中,您在哪里找到了?的定义没有被列为有参数,至少写在这里:它似乎没有文档(可能是文档错误),但你是对的。你运行的是什么版本?顺便说一下,我现在不会写答案,因为我没有时间查找引用,但我很确定XMLType是抽象的,没有字符集(就像日期没有格式一样)。将XMLType转换为可读/可导出格式时,将选择字符集。11g R2(不记得详细版本,但可以明天检查).XMLType保留自己的字符集信息。我非常确定这一点,因为我通过11g本机web服务返回XMLType变量,如果我进行utf-8编码,那么它将使用utf-8公开web服务!否则它将通过使用DB字符集编码的web服务返回xml。
l_xml := XMLType(convert(l_xml.getClobVal, 'UTF8'));
select dbms_xmlgen.getXMLType(
  q'{select convert('ä', 'UTF8') myValue from dual}')
from dual