2013-10-18 76 views
1

我們試圖在CLOB字段中應用子字符串函數來修剪前4000個字符。我們正在收到以下錯誤消息。CLOB字段上的子串

下面是我們所使用的查詢:

select 
cast(substr(field_name,1,4000) as varchar(4000)) 
from table_name; 

錯誤報告:

SQL Error: ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 8000, maximum: 4000)
22835. 00000 - "Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: %s, maximum: %s)"
*Cause: An attempt was made to convert CLOB to CHAR or BLOB to RAW, where the LOB size was bigger than the buffer limit for CHAR and RAW types. Note that widths are reported in characters if character length semantics are in effect for the column, otherwise widths are reported in bytes.
*Action: Do one of the following 1. Make the LOB smaller before performing the conversion, for example, by using SUBSTR on CLOB 2. Use DBMS_LOB.SUBSTR to convert CLOB to CHAR or BLOB to RAW.

+0

建議2看起來很有希望。 –

回答

0

試試這個以下功能。本應解決您的問題。

SELECT SUBSTR(xmltype(CLOBColumnname),4001,LENGTH(CLOBColumnname)) 
FROM TABLENAME; 
+0

試過 SELECT xmltype(CLOBColumnName)FROM TABLENAME; 得到下面的錯誤: ORA-31011:XML解析失敗 ORA-19202:發生了錯誤在XML處理 LPX-00210:預期 '<',而不是在第1行 ORA-06512 'T' 錯誤:在「SYS.XMLTYPE」,行301 ORA-06512:在行1 31011. 00000 - 「XML解析失敗」 *原因:XML解析器在嘗試解析文檔時返回錯誤。 *操作:檢查要解析的文檔是否有效。 – Navin

3

上VARCHAR上限爲4000個字節字符。如果你的數據庫字符集是多字節字符集substr(field_name,1,4000)將會太長。 (錯誤消息中的8000表示每個字符使用2個字節,所以UTF16可能?)。

嘗試:

select cast(substr(field_name,1,2000) as varchar(4000 byte)) 
from table_name; 

但要知道,2000個字符可能會超過4000個字節(這取決於你的設置數據庫字符和你編碼文本)。

1

替代使用dbms_lob.substr

dbms_lob.substr(clob_field_name, desired_size) 

不需要投。

+0

根據文檔dbms_lob.substr()計算substr的字符數(不是以字節爲單位)。 – Christian4145

+0

「字節數(用於BLOB)或字符(用於CLOB)」 – Vadzim