在执行插入文章(2000个汉字以上)时,执行插入SQL的时候,抛错:
-------------------------------
execute JDBC batch update; uncategorized SQLException for SQL [update BOOK_INFO set PUBLISH_ID=?, BOOK_CLASS_ID=?, BOOK_NAME=?, WRITER_NAME=?, PUBLISH_DATE=?, PAGE_NUM=?, BOOK_CONTENT_INTRO=?, BOOK_PRICE=?, REBATE=?, BOOK_COL=?, PIC_URL=?, ISBN=?, WORD_NUMBER=?, PUBLISH_TIMES=? where BOOK_ID=?]; SQL state [72000]; error code [1461]; ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
; nested exception is java.sql.BatchUpdateException: ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
--------------------------------
如果少于2000汉字,则正常,请问如何解决。有的专家说要设置一下数据库某个参数,但是到底是那个参数也没有说明。上面是更新语句,插入的时候跟这情况是一样的。

解决方案 »

  1.   

    当超过2000汉字,就使SQL语句过长了,超出处理容器的大小了
      

  2.   

    那你的意思是:这不是CLOB本身的问题,而是我掌握用好CLOB的方法,我现在想要的就是这个方法,还望知道一二,今天我将要解决这个问题,望各位大哥帮帮忙,我如果解决的话,会把相应的方案贴上来的,在网络上搜索了很多相关的问题,都没有找到答案,这个问题很广泛。
      

  3.   

    查了一下国外资料,都说clob类型的数据直接insert可能会因为字符过长而出错,所以要用对象形式插入.
      

  4.   

    //创建并实例化一个CLOB对象
    CLOB clob = new CLOB((OracleConnection)con);
    clob = oracle.sql.CLOB.createTemporary((OracleConnection)con,true,1);
    //对CLOB对象赋值
    clob.putString(1,formateSingleQuotes(Content));
    OracleConnection OCon = (OracleConnection)con;
    OraclePreparedStatement pstmt = (OraclePreparedStatement)OCon.prepareCall(strSql);//这一条,看到了吗,关键,setCLOB
    pstmt.setCLOB(1,clob);
      

  5.   

    我的是hibernate操作,所以theforever(碧海情天) 的方法我没有试过,不能确认正确与否。
    经过了2天的网络上搜寻,我发现最好的办法是下载oracle 10g jdbc驱动,这样你可以跟正常操作string类型一样对clob进行操作,perfect。
    见:http://download-east.oracle.com/otn_hosted_doc/jdeveloper/904preview/jdbc-javadoc/oracle/sql/BLOB.html#freeTemporary()
    网络上有个例子对现在的hibernate3.0是不合适,应为那个例子是针对hibernate1.0的,该例子为:
    s = sf.openSession();
    tx = s.beginTransaction();
    foo = new Foo();
    foo.setClob( Hibernate.createClob(" ") );
    s.save(foo);
    s.flush();
    s.refresh(foo, LockMode.UPGRADE); //grabs an Oracle CLOB
    oracle.sql.CLOB clob = (oracle.sql.CLOB) foo.getClob();
    java.io.Writer pw = clob.getCharacterOutputStream();
    pw.write(content);
    pw.close();
    tx.commit();
    s.close();在hibernate3.0操作,出现: ClassCastException错误,大家切记。
      

  6.   

    包括孙卫琴<精通Hibernate>一书,也是这种方法,对于,hibernate1.1还适用,现在不行拉。
    我解决程序:
    public String save(BookInfo entity) throws Exception {
    log.debug("saving BookInfo instance");
    try {
    entity.setBookCol(Hibernate.createClob(entity.getBookColS()));
    //写入的大字符串(超过4000个字节)在entity.getBookColS()中
    entity.setBookContentIntro(Hibernate.createClob(entity
    .getBookContentIntroS()));
    return entity.getBookId(); } catch (Exception re) {
    log.error("save failed", re);
    throw re;
    }
    }
    hibernate映射文件:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="com.book.entity.BookInfo" table="BOOK_INFO">
            <id name="bookId" type="string">
                <column name="BOOK_ID" length="32" />
                <generator class="uuid.hex" />
            </id>
            <many-to-one name="publisher" class="com.book.entity.Publisher" fetch="join" lazy="false">
             <column name="PUBLISH_ID" length="32" />
            </many-to-one>
            <many-to-one name="bookClass" class="com.book.entity.BookClass" fetch="join" lazy="true">
             <column name="BOOK_CLASS_ID" length="32" />
            </many-to-one>
            <property name="bookName" type="string">
                <column name="BOOK_NAME" length="32" />
            </property>
            <property name="writerName" type="string">
                <column name="WRITER_NAME" length="32" />
            </property>
            <property name="publishDate" type="date">
                <column name="PUBLISH_DATE" length="7" />
            </property>
            <property name="pageNum" type="int">
                <column name="PAGE_NUM"/>
            </property>
            <property name="bookContentIntro" type="java.sql.Clob">
                <column name="BOOK_CONTENT_INTRO" />
            </property>
            <property name="bookPrice" type="double">
                <column name="BOOK_PRICE" precision="5" />
            </property>
            <property name="rebate" type="double">
                <column name="REBATE" precision="1" />
            </property>
            <property name="bookCol" type="java.sql.Clob">
                <column name="BOOK_COL" />
            </property>
            <property name="picUrl" type="string">
                <column name="PIC_URL" length="100" />
            </property>
            <property name="isbn" type="string">
                <column name="ISBN" length="50" />
            </property>   
            <property name="wordNumber" type="string">
                <column name="WORD_NUMBER" />
            </property>  
            <property name="publishTimes" type="string">
                <column name="PUBLISH_TIMES"/>
            </property> 
            <set name="bookSonOrders" inverse="true">
                <key>
                    <column name="BOOK_ID" length="32" />
                </key>
                <one-to-many class="com.book.entity.BookSonOrder" />
            </set>
            <set name="bookComments" inverse="true">
                <key>
                    <column name="BOOK_ID" length="32" />
                </key>
                <one-to-many class="com.book.entity.BookComment" />
            </set>
        </class>
    </hibernate-mapping>
    实体文件:
    package com.book.entity;import java.sql.Clob;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;/**
     * BookInfo generated by MyEclipse - Hibernate Tools
     */public class BookInfo implements java.io.Serializable { // Fields /**
     * 
     */
    private static final long serialVersionUID = 1L; private String bookId; private Publisher publisher = new Publisher(); private BookClass bookClass = new BookClass(); private String bookName; private String writerName; private Date publishDate; private int pageNum; private Clob bookContentIntro; private double bookPrice; private double rebate; private Clob bookCol; private String picUrl; private Set bookSonOrders = new HashSet(0); private Set bookComments = new HashSet(0);

    private String bookContentIntroS;

    private String bookColS;

    private String isbn;

    private String wordNumber;

    private String publishTimes; /** default constructor */
    public BookInfo() { } // Property accessors public String getBookId() {
    return this.bookId;
    } public void setBookId(String bookId) {
    this.bookId = bookId;
    } public Publisher getPublisher() {
    if (this.publisher == null) {
    return new Publisher();
    }
    return this.publisher;
    } public void setPublisher(Publisher publisher) {
    this.publisher = publisher;
    } public BookClass getBookClass() {
    if (this.bookClass == null) {
    return new BookClass();
    }
    return this.bookClass;
    } public void setBookClass(BookClass bookClass) {
    this.bookClass = bookClass;
    } public String getBookName() {
    return this.bookName;
    } public void setBookName(String bookName) {
    this.bookName = bookName;
    } public String getWriterName() {
    return this.writerName;
    } public void setWriterName(String writerName) {
    this.writerName = writerName;
    } public Date getPublishDate() {
    return this.publishDate;
    } public void setPublishDate(Date publishDate) {
    this.publishDate = publishDate;
    } public int getPageNum() {
    return this.pageNum;
    } public void setPageNum(int pageNum) {
    this.pageNum = pageNum;
    }
    public double getBookPrice() {
    return this.bookPrice;
    } public void setBookPrice(double bookPrice) {
    this.bookPrice = bookPrice;
    } public double getRebate() {
    return this.rebate;
    } public void setRebate(double rebate) {
    this.rebate = rebate;
    } public String getPicUrl() {
    return this.picUrl;
    } public void setPicUrl(String picUrl) {
    this.picUrl = picUrl;
    } public Set getBookSonOrders() {
    return this.bookSonOrders;
    } public void setBookSonOrders(Set bookSonOrders) {
    this.bookSonOrders = bookSonOrders;
    } public Set getBookComments() {
    return this.bookComments;
    } public void setBookComments(Set bookComments) {
    this.bookComments = bookComments;
    } public Clob getBookCol() {
    return bookCol;
    } public void setBookCol(Clob bookCol) {
    this.bookCol = bookCol;
    } public Clob getBookContentIntro() {
    return bookContentIntro;
    } public void setBookContentIntro(Clob bookContentIntro) {
    this.bookContentIntro = bookContentIntro;
    } public String getBookColS() {
    return bookColS;
    } public void setBookColS(String bookColS) {
    this.bookColS = bookColS;
    } public String getBookContentIntroS() {
    return bookContentIntroS;
    } public void setBookContentIntroS(String bookContentIntroS) {
    this.bookContentIntroS = bookContentIntroS;
    } public String getIsbn() {
    return isbn;
    } public void setIsbn(String isbn) {
    this.isbn = isbn;
    } public String getPublishTimes() {
    return publishTimes;
    } public void setPublishTimes(String publishTimes) {
    this.publishTimes = publishTimes;
    } public String getWordNumber() {
    return wordNumber;
    } public void setWordNumber(String wordNumber) {
    this.wordNumber = wordNumber;
    }}
    一切OK,我检验过了,操作时间:2006-8-13 15:00分。
      

  7.   

    现在改写theforever(碧海情天) 程序,他不会介意的,大家都为了进步:
    PreparedStatement pstmt = conn.prepareStatement(                                  "INSERT INTO book_info(bookContentIntro) VALUES(?)");//我就写一个字段
    pstmt.setString(1, str);//str就是大字符串拉
    pstmt.executeUpdate();
    一切OK。
    ---------------------------------
    注意,上面的程序是在oracle 10g下运行的,下载地址:
    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html
    记得自己打包哦,不会打包的找我:MSN: [email protected] ,要著名你是讨论问题,要不然,不通过哦。
      

  8.   

    用long就可以啦!long可以容下2G
      

  9.   

    foo.setClob( Hibernate.createClob(" ") );
    这个是关键,原理是一样的.
    窗户纸就这么一层,一点就破.
      

  10.   

    其实Hibernate我还没怎么看,小虫的代码对我也有益处,有空看看(其实应该说是有心情,现在很难有激情追逐新的技术,只要没说需要,就不太想看.实用主义的心理胜过理想主义了.
      

  11.   

    http://topic.csdn.net/t/20050629/15/4112666.html
      

  12.   

    http://www.cnblogs.com/minbear/archive/2005/09/27/12754.html
      

  13.   

    上面的SAVE函数应该修改为,上面的SAVE函数还是有一点小BUG的,正确,完美的如下::
    public String save(BookInfo entity) throws Exception {
    log.debug("saving BookInfo instance");
    try {
    entity.setBookCol(Hibernate.createClob(" "));
    entity.setBookContentIntro(Hibernate.createClob(" "));
    getHibernateTemplate().save(entity);
    getHibernateTemplate().flush();
    getHibernateTemplate().refresh(entity, LockMode.UPGRADE); SerializableClob bookCol = (SerializableClob) entity.getBookCol();
    Clob jbookColClob = bookCol.getWrappedClob();
    CLOB oClob = (CLOB) jbookColClob;
    Writer wtBookCol = oClob.getCharacterOutputStream();
    wtBookCol.write(entity.getBookColS());
    wtBookCol.close(); SerializableClob bookContentIntro = (SerializableClob) entity
    .getBookContentIntro();
    Clob jbookContentIntroClob = bookContentIntro.getWrappedClob();
    CLOB obookContentIntroClob = (CLOB) jbookContentIntroClob;
    Writer wtBookContentIntro = obookContentIntroClob
    .getCharacterOutputStream();
    wtBookContentIntro.write(entity.getBookContentIntroS());
    wtBookContentIntro.close(); return entity.getBookId(); } catch (Exception re) {
    log.error("save failed", re);
    throw re;
    }
    }
      

  14.   

    theforever(碧海情天):每天做项目都做得很晚啊,不过都是自己得项目啦,已经开发3个月,每天都累得不行,特别是腰锥,受不了!2天睡觉很正常,呵呵!