2012-03-28 15 views
3

我目前有非utf-8數據庫,但我需要用utf-8編碼生成XMLType變量。我有一個解決方法,但似乎有在Oracle錯誤,請訪問以下鏈接: https://forums.oracle.com/forums/thread.jspa?messageID=10238641如何更改XMLTYPE變量的字符集?

...和Oracle支持的bug:7698684

該bug將導致隨機

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

首先我得到了帶有dbms_xmlgen包的XMLType。該XMLType使用DB字符集進行編碼。

爲了將其轉換爲UTF-8字符集我這樣做:

  • 我轉換的XMLType變量BLOB使用NLS_CHARSET_ID getBlobVal方法變量( 'UTF8')作爲參數
  • 我轉換BLOB使用XMLType構造函數方法將變量返回到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); 
+0

你在哪裏可以找到['XMLType.getBlobVal()']的定義(http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/t_xml.htm#i1010715)?在文檔中它沒有被列爲參數 – 2012-03-28 15:17:14

+0

至少它寫在這裏:http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb04cre.htm – 2012-03-28 15:40:27

+0

它似乎是無證的(可能是文檔錯誤),但你說得對。你正在運行什麼版本? – 2012-03-28 16:16:54

回答

0

我管理與轉換功能做到這一點。這是不可能的整個XML文檔轉換(即使它的CLOB值),但只有元素值

這是不工作(XMLType的構造失敗):

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

所以我不得不把轉換爲查詢字符串(這只是一個例子):

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

最後我做了一個函數讀取字典,並通過給定的表/視圖的所有列循環和產生的select語句字符串,其中所有列分別轉換爲UTF8。這個字符串然後可以作爲參數傳遞給dbms_xmlgen.newContext函數。