因为后台的数据库可以是oracle,也可以是sybase,怎么样在插入blob字段时允许插入4K以上的文件,目前程序报java.sql.SQLException: 数据大小超出此类型的最大值: 5884

解决方案 »

  1.   

    创建了blob字段后,插入数据如果大于4k,会报这个错,在网上看到需要先使用empty_blob()更新该字段,,但是在调用empty_blob()后仍然会提示这个错,代码如下:    String updateSql = "update iptad_log_filter_rule set script_content=empty_blob() where rule_id="+ruleId;
        执行更新    然后调用:
        String sql = "update iptad_log_filter_rule set script_content=? where rule_id=?";
    ps=conn.prepareStatement(sql); 
        ps.setObject(1,data);
        ps.setLong(2, Long.valueOf(ruleId));
        ps.executeUpdate();
        ps.close();
        conn.close();
        就报java.sql.SQLException: 数据大小超出此类型的最大值: 5884
      

  2.   

    你这个BLOB里存的什么?是字符吗?字符改用clob
      

  3.   

    此处所说并不是要考虑sybase的情况?
      

  4.   

    关于这个有一堆的内容可以参考,blob用setBlob,clob用setClob,
    问题的关键在于,如果内容很大,那么需要使用指定的流操作对象把需要写的内容分多次写到Clob,或者Blob内容中.
    贴一段相对比较完整的给你,这是从本地读取文件,把文件存入到blob的例子.
                pst=(OraclePreparedStatement)conn.prepareStatement("select contents from test where .... for update");
                java.sql.ResultSet rs=pst.executeQuery();
                oracle.sql.BLOB c=null;
                if (rs.next()){
                    c=(oracle.sql.BLOB)rs.getBlob(1);
                }
                pst.close();
                rs.close();   //是否可以关闭呢?
                //3)更新内容            
                java.io.OutputStream writer;     
                byte[] cbuf=new byte[BufLen];            
                writer=c.setBinaryStream(1L);
                
                Integer offset=Integer.valueOf(0);
                Integer iRead;            
                iRead=fr.read(cbuf,offset,BufLen);                       
                while (iRead.compareTo(-1)!=0){      
                    //writer.write(cbuf);    
                    writer.write(cbuf,0, iRead);                
                    iRead=fr.read(cbuf,offset,BufLen);                  
                }                          
                writer.flush();
                writer.close();
                pst=(OraclePreparedStatement)conn.prepareStatement("update test set contents=? where  ....");
                pst.setBLOB(1, c);
                pst.executeUpdate();
    对于Oracle的操作,标准的是先select .. for update, 然后设置blob内容,然后才是update ....
      

  5.   

    另外,只要你的oracle只9i以上,就可以直接在insert 语句中使用empty_blob(),或者empty_clob()函数. 不需要那么麻烦.