2011-09-01 235 views
1

我完全不熟悉Oracle的XDB,特別是使用它來從數據庫表中生成XML輸出,並且正在從9i(Oracle9i企業版版本9.2.0.5 .0 - 生產)到11g(Oracle數據庫11g企業版版本11.2.0.2.0 - 64位生產)。下面是這說明我有這個問題一個小的測試案例:在Oracle XDB中轉義控制字符

select xmlelement("test", test) from (select 'a' test from dual); 

這工作,給我:

<test>a</test> 

但是在11g中,如果我換「一」爲無效字符,例如作爲U + 0013,我得到以下錯誤:

ORA-31061: XDB error: special char to escaped char conversion failed. 

在9i中同樣的事情也會獲得成功,並沒有錯誤。

很明顯,理想的答案是有一些驗證,以防止控制字符進入我想要轉換成XML的簡單字符數據,但不幸的是,這超出了我所做的範圍。

這是其他人經歷過的事情嗎?如果是這樣,是否可以對我的XML生成腳本進行簡單的更改,還是需要進行其他類型的清理?或者只是在罕見的情況下手動修復問題(這對我的需求來說是完全合理的選擇)。

非常感謝。

回答

3

U + 0013不是XML的有效Unicode碼點。見例如Valid characters in XML。所以11g正確地引發了一個異常。

SQL> select xmlelement("test", unistr('a\0013b')) from dual; 
ERROR: 
ORA-31061: XDB error: special char to escaped char conversion failed. 

no rows selected 

SQL> select xmlelement("test", unistr('a\00aeb')) from dual; 

XMLELEMENT("TEST",UNISTR('A\00AEB')) 
-------------------------------------------------------------------------------- 
<test>a®b</test> 

SQL> 

不知道爲什麼,這將在9i中通(我沒有說用),但是這可能僅僅是因爲Oracle的實現已演變爲更符合標準的和/或標準已經演變。

您的修復是正確的。

0

只是爲了對任何感興趣的人進行跟進。據我所知,9i剛剛通過無效字符,產生無效的XML。 11g會拋出一個錯誤,這可能是更正確的行爲,即使它在我的情況下很煩人。

我發現的唯一合理的解決方案是修復內容的來源。

2

儘管總是在源固定數據是最好的解決方案,我也發現這是有用的情況下,我不能在源控制數據:

select xmlelement("test", test) from (select regexp_replace(unistr('a\0013b'), '[[:cntrl:]]', '') test from dual);

重要部分是regexp_replace(your_field,'[[:cntrl ::]]','')從數據中刪除控制字符。