java.sql.SQLException: 数据大小超出此类型的最大值

前两天频发遇到这个问题,领导开始让截断字符串后插入,但是终究不是解决之道,后来再遇到,必须要解决了。

环境:oracle:11.2.0.3.0。

驱动:ojdbc14_g.jar

目标表字段类型:CLOB

网上搜了一下,基本上有以下几种方法:

1、使用setCharacterStream()方法,代替setString; 
2、使用OCI驱动连接Oracle数据库。

3 驱动的问题,换其他版本的驱动。

4 用setClob的方式。

依次尝试:

1 换成setCharacterStream()方法,依然报错。

2 没有考虑这种解决方法,因为OCI驱动要求机器上装有oracle客户端。因为程序肯定要其他机器上运行,就算这种方法能解决,也米有意思。

3 驱动换成ojdbc14-10.2.0.3.0.jar,依然报错,没有继续尝试。

4 解决,具体代码如下,基本上是先插入一个空的CLOB,然后再更新。

public boolean saveCPBaseResultJSON(String json) throws SQLException {
        String sql = "INSERT INTO REPORT_CP_BASE(id,NORM_TIME,JSON) VALUES(SQ_REPORT_CP_BASE.NEXTVAL,sysdate,?)";
        PreparedStatement prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
        prest.setClob(1, CLOB.empty_lob());
        prest.execute();
        conn.commit();
        prest.close();
        //获取最大ID
        String csql = "select max(id) as max from REPORT_CP_BASE";
        Statement stm = conn.createStatement();  
        ResultSet rs = stm.executeQuery(csql);  
        int max=0;
        while (rs.next()) {  
            max=rs.getInt("max");
        }
        try{
            UpdateClob(max,json);
        }catch(Exception e)
        {
            e.printStackTrace();
            return false;
        }
        
        return true;
    }
    
     private  void UpdateClob(int id,String bigstr) throws SQLException, IOException {  
            String sql = "select json from REPORT_CP_BASE where id ="+id+" for update";  
            Statement stm = conn.createStatement();  
            conn.setAutoCommit(false);
            ResultSet rs = stm.executeQuery(sql);  
            CLOB clob=null;
            while (rs.next()) {  
                clob = (CLOB)rs.getClob(1);    
            }  
            Writer writer = clob.getCharacterOutputStream();
            writer.write(bigstr);
            writer.flush();
            writer.close();
            conn.commit(); 
        }  
View Code
原文地址:https://www.cnblogs.com/lxlck/p/3483606.html