前言
做項目的時候遇到一個報錯:ORA-22835 緩沖區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小。查找原因發現是某個字段在數據庫中是clob類型。然后sql語句進行查詢的時候,對該字段進行了to_char操作。由於varchar類型最大長度為4000,而clob中的內容長度高於4000。於是產生這樣的問題。針對這個問題,結合自己的測試,想了以下三種解決方法,在此進行記錄。
一、進行實體映射及獲取字段數據時,直接當成string處理
比如說,我們使用jdbctemplate來進行查詢的時候,封裝實體對象字段,我們不將字段封為clob類型而是直接封為string類型。然后我們進行查詢的時候,會發現沒有問題,clob中的內容完整的封入了string字段中。
二、對clob進行截取
對數據庫中的clob字段的內容進行截取,也可以解決這一問題,但是會造成clob中內容獲取的不完整。
比如下方 name字段是clob類型,sql寫法如下:
select to_char(substr(name,0,4000)) as name from people
我們截取name的前4000位,這樣沒有超過varchar類型的最大值,所以不會報錯。
需要注意的是:如果clob中有中文會占兩個字符。所以比較安全的方式就是除以2,進行截取。
sql寫法如下:
select to_char(substr(name,0,2000)) as name from people
三、通過java代碼將clob轉為string
我們獲取到一個clob類型的數據后,對其進行處理,使其轉換為string類型。
轉換代碼如下:
public String ClobtoString(Clob clob){ String reString = ""; Reader is = null; try { is = clob.getCharacterStream(); } catch (Exception e) { e.printStackTrace(); } // 得到流
BufferedReader br = new BufferedReader(is); String s = null; try { s = br.readLine(); } catch (Exception e) { e.printStackTrace(); } StringBuffer sb = new StringBuffer(); while (s != null) { // 執行循環將字符串全部取出付值給StringBuffer由StringBuffer轉成STRING
sb.append(s); try { s = br.readLine(); } catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace(); } } reString = sb.toString(); return reString; }
總結
三種方式,推薦大家使用第三種。
第三種方式正規,靠譜。
第二種方式,如果圖便捷,又對數據完整性沒要求,可以使用。
第一種方式,只在spring中的jdbcTemplate下使用沒有發現問題,其他操作方式或數據庫框架可能引起問題,需要大家來測試了。