下面是我用jsp插入oracle 9i 的clob 的程序片段.
      String Sql="INSERT INTO website.ynews(id,title,content,classid) VALUES(newsid.nextval,?,?,?)";
      stmt=con.prepareStatement(Sql);
      stmt.setString(1, txtshowname);
      StringBufferInputStream sbin = new StringBufferInputStream(note);
      stmt.setAsciiStream(2,sbin,note.length());
      stmt.setString(3, classid);
      con.setAutoCommit(true);
      stmt.execute();
      con.commit();
      stmt.close();
插入短的文本可以,但一旦长一些,比如2000字左右就会报下面的异常.javax.servlet.ServletException: Io 异常: Char  数组不够长: javaCharsToUtf8Bytes连接用的是Tomcat 的连接池.
大家帮帮忙, 我弄这个弄了好多天了.或者帮我改改这段代码,只能能插入clob字段就行.万分感谢!!!!

解决方案 »

  1.   

    CLOB可以容纳4GB的内容 我的content字段是clob型的.
    忘记给出 String note=request.getParameter("content");
      

  2.   

    转相关资料: 假设col2是CLOB:
    写操作:String sql = "insert into tb_commendtemp (col1,col2) values('111',?)";
    string s = "长文本";
    StringBufferInputStream sbin = new StringBufferInputStream(s);
    PreparedStatement ps = query.getPreStmt(sql);
    ps.setAsciiStream(1,sbin,s.length());
    int i = ps.executeUpdate();
    ps.close();
    sbin.close();
    if(i>0) ok;
    如果是二进制文件就用FileInputStream写进去读的时候只要
    rs.getAsciiStream();
    rs.getUnicodeStream();
    rs.getBinaryStream();
    看它们的名字就知道是得到什么类型的的数据流了.如果存放的是二进制文件,比如图形,执行文件,压缩文件最好还是blob保险.
    写和读也要用二进制流,
    DataInputStrean和DatOutputStream.有时用UNICODE的字符流也能行,但
    不保险.如果是文本,用Clob和LONG都行.读和写用
    BuffreedReader和PrintWriter更方便.
    要想在一个网页上同时显示从程序中推出的文字和图象,这项技术目前在国内
    可以值100万.
    因为目前浏览器要想同时显示HTML文档和image文档,你到目前在国内还没有
    发现,要用到server push技术.你想想一下电子邮件的文档头,是复合型的,把
    数据用Base 64编码就可以通过特定的文档类型同时显示文字和图片了.可是浏览器目前还做不到.blob:二进制,如果exe,zip
    clob:单字节码,比如一般的文本文件.
    nlob:多字节码,如UTF格式的文件.如果带格式的文件如果WORD,EXECL等如果要保持格式不被破坏,最好以BLOB
    方式,它近似于以byte的原始方式存放,缺点当然是操作时效率低(慢).操作CLOB,别的可以看我上面的写和读的例子,只要注意把
    写pstmt.setBinaryStream()改成rs.setAsciiStream();
    读pstmt.getBinaryStream()改成rs.getBinaryStream();在从文件读成流的时候用Reader而不要用DataInuputStream
      

  3.   

    给你参考下,希望有用(网上的代码).
    strSQL = "insert into product(ID,slID,pID,postID,name,num,unit,localPrice,otherPrice,agioPrice,phone,staTime,endTime,flag_1,flag_2,rule,summaryMemo,detailMemo) values(......+empty_clob())";
    其中detailMemo是clob型 pstmt       =   con.prepareStatement(strSQL); 
    int inserNum = pstmt.executeUpdate();
    int inserNum_1 = 0;
    strSQL  = "select detailMemo from product where ID='"+ID+"' for   update";
    pstmt       =   con.prepareStatement(strSQL); 
    ResultSet rs1 = pstmt.executeQuery();
    if(rs1 != null && rs1.next())
    {
    oracle.sql.CLOB   clob   =   (oracle.sql.CLOB)rs1.getClob(1);  

    clob.putString(1,detailMemo);     
    strSQL = "update product set detailMemo=? where ID='"+ID+"'";
    pstmt       =   con.prepareStatement(strSQL); 
    pstmt.setClob(1,   clob);   
    inserNum_1 = pstmt.executeUpdate();
    }
    con.commit();
    rs1.close();
    rs1 = null;
    pstmt.close();
    con.close();
      

  4.   

    alin2008cn(阿林) 如果你有注意,我的代码和你的用的是一种方式,我想可能是
    stmt.setAsciiStream(2,sbin,note.length());报的异常.
    javax.servlet.ServletException: Io 异常: Char  数组不够长: javaCharsToUtf8Bytes
    我不知道是哪个Char数组不够长.另aimer311  你的方法我也用过. 
    oracle.sql.CLOB clob = ((oracle.sql.CLOB)rs).getClob("content"); 会报错.参见http://blog.csdn.net/Inber/archive/2006/04/08/655153.aspx网页后,改为
    java.sql.Clob clob=((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("CONTENT");
    可是报异常org.apache.commons.dbcp.DelegatingResultSet cannot be resolved to a type现在这两种方法都用不了,本人非常急! 谢谢大家的帮忙.请看看我的代码,和异常,谢谢.
      

  5.   

    把我用的另一种方法也附上,帮我看看哪里有问题,急死了.只要一种能用就行啊.我用的是Tomcat连接池,好像网上说,直连可以,但我没试过,应为一定要用连接池
        con.setAutoCommit(false);
        stmt.executeUpdate("INSERT INTO website.ynews(id,title,content,classid) VALUES(newsid.nextval,'"+txtshowname+"',empty_clob(),'"+classid+"')");
        //锁定数据行进行更新,注意“for update”语句
       rs = stmt.executeQuery("select content from website.ynews where id=(select max(id) from website.ynews) for update");
    if (rs.next())
        {
            //得到java.sql.Clob对象后强制转换为oracle.sql.CLOB
        //  oracle.sql.CLOB clob = ((oracle.sql.CLOB)rs).getClob("content");
            java.sql.Clob clob=((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("content");
           Writer outStream = clob.getCharacterOutputStream();
            //data是传入的字符串,定义:String data
            char[] c = note.toCharArray();
            outStream.write(c, 0, c.length);
        }
       outStream.flush();
        outStream.close();
       con.commit();
       con.close();