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(); }