1. 程式人生 > 實用技巧 >Oracle查資料並使用wm_concat函式拼接欄位報錯:緩衝區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小 (實際: 4763, 最大: 4000)

Oracle查資料並使用wm_concat函式拼接欄位報錯:緩衝區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小 (實際: 4763, 最大: 4000)

查詢sql如下:

 select 
(select to_char(wm_concat(a.description)) from project_report_detail a 
 where project_report_id = t.id) as description2 ,
 t.* 
 from project_report t  
 where 1=1  order by t.dept_id 

然後由於project_report_detail表的description欄位是多條資料拼接成一個欄位,拼接出來的結果字串超過了sql的varchar2型別4000字元,所以報了此錯:

緩衝區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小 (實際: 4763, 最大: 4000)

百度了一下找到了靠譜的解決辦法,借鑑部落格:http://www.linuxboy.net/linuxjc/137415.html

我的解決辦法如下:查詢的sql不再用to_char轉成字串,直接查出拼接欄位的clob型別

 select 
(select wm_concat(a.description) from project_report_detail a 
 where project_report_id = t.id) as description2 ,
 t.* 
 from project_report t  
 where 1=1  order by t.dept_id 

  然後在java中,用上面部落格的方法處理成String型別:

private 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; }

成功解決,親測有效