2013-10-28 38 views
0

我嘗試了一點clobs和varchar2。問題是我們在數據庫表中有很多XML,我想盡可能快地下載XML。由於我需要使用C#DevArt組件,因此我嘗試了各種方法,發現clobs(它們涉及到每行數據庫的一次往返)比varchar2慢很多。ORA-06502與clob的varchar2轉換

因此,我現在正在兩步下載數據。首先儘可能多的varchar2(4000字節的限制),然後其他一切作爲clob。

現在棘手的部分。我想出了以下查詢,找出哪些我可以檢索爲VARCHAR2:

select c.xml.getstringval() from customers c where 
length(t.xml.getclobval()) = length(dbms_lob.substr(c.xml.getclobval(), 4000, 1)) 

查詢所基於的假設是長度返回字符爲CLOB的數量和SUBSTR與返回的字符串一定數量的字節。它不適用於長度,因爲那樣我就會遇到諸如àéoderè等多字節字符的問題。但是現在我又有一個很奇怪的行爲。上面的查詢適用於大部分行,但對於其中一些行仍然會拋出一個ORA-06502。但如果我將限制改爲3992,它總是有效? (作爲信息,我們還將圖片的縮略圖存儲爲xml中的Base64編碼字符串)。

現在有沒有人爲什麼查詢在所有情況下都不起作用。或者沒有人有建議如何編寫一個查詢,以查明clob是否可以作爲varchar2檢索?

回答

0

SUBSTR與一定數量的字節

Oracle documentation的返回的字符串表示,SUBSTR函數的量參數表示的字符(而不是字節),以待讀的CLOB的數目。

,因爲那時我遇到了麻煩與像A E奧德è

嘗試使用「Unicode=true;」連接字符串參數multibytecharacters它不僅與長度工作。

上面的查詢適用於大多數行,但對於其中一些行仍然會拋出一個 ORA-06502。但如果我將限制改爲3992,它總是有效?

send us一個小測試項目,以便我們可以在我們的環境中重現問題。還註明:

  • 連接字符串(粗略,沒有憑據)
  • 相應的數據庫的DDL/DML腳本對象
  • 版本,Oracle服務器的NLS_LANGUAGE,NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET參數