ORA-22835 緩沖區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小


前言

做項目的時候遇到一個報錯: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下使用沒有發現問題,其他操作方式或數據庫框架可能引起問題,需要大家來測試了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM