zoukankan      html  css  js  c++  java
  • (Clob的写入和读取-java)更新数据库报错:SQL Error: 1461, SQLState: 72000 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允许的最大长度4000时,oracle自动将该字段值转化为Long类型,然后提示插入操作失败。

    解决办法:

        1)是不是真的要插入超过定义长度的值?否则对长度做判断,截取等。

        2)若是,则将字段采用clob、blob,或者使用文件代替,字段保存文件地址即可。

    对于clob、blob

    CLOB 定义

      数据库中的一种保存文件所使用的类型。

      Character Large Object

      SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(CLOB) 实现 Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身。Clob 对象在它被创建的事务处理期间有效。

      在一些数据库系统里,也使用Text 作为CLOB的别名,比如SQL Server

    BLOB的含义

      BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。

      在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。

      BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

      根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。

    但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。

    CLOB和BLOB的区别

      CLOB使用CHAR来保存数据。 如:保存XML文档。

           BLOB就是使用二进制保存数据。 如:保存位图。

     

    JAVA里面对CLOB的操作

      在绝大多数情况下,使用2种方法使用CLOB

      1 相对比较小的

        可以用String进行直接操作,把CLOB看成字符串类型即可

      2 如果比较大

        1)如果使用jdbc则,可以用 getAsciiStream 或者 getUnicodeStream 以及对应的 setAsciiStream 和 setUnicodeStream 即可)

        2)clob怎么和Hibernate一起使用(参考原文:http://www.tuicool.com/articles/fumQfe )

          a)Clob类型的属性的赋值方式—— String转Clob

            String content = request.getParameter("content");//1.从request请求中取值(String类型的)
            Clob clob = Hibernate.createClob(content);//2.通过hibernate将string转化为clob
            news.setContent(clob);//3.给实体类对应属性赋值

          b)Clob类型的属性的取值方式—— Clob转String

            List<News> list = query.addEntity(News.class).list();//1.从数据库取值
            News news = (News)list.get(0);//2.取News对象
            String content = ClobUtil.ClobToString(news.getContent());//3.将news对象中的clob类型的content转化为String字符串
          
     1 -----------------   ClobUtil    -----------------------
     2 
     3 public class ClobUtil {
     4   public static String ClobToString(Clob clob) {
     5         String clobStr = "";
     6         Reader is = null;
     7         try {
     8   is = clob.getCharacterStream();
     9           // 得到流
    10           BufferedReader br = new BufferedReader(is);
    11           String s = null;
    12   s = br.readLine();
    13           StringBuffer sb = new StringBuffer();
    14           //执行循环将字符串全部取出赋值给StringBuffer,由StringBuffer转成String
    15           while (s != null) {
    16     sb.append(s);
    17     s = br.readLine();
    18           }
    19           clobStr = sb.toString();
    20         } catch (IOException e) {
    21   e.printStackTrace();
    22         } catch (SQLException e) {
    23   e.printStackTrace();
    24         }
    25         return clobStr;
    26     }
    27 }
    28 
    29 注意:通过流的方式读取Clob类型数据


  • 相关阅读:
    Cogs 452. Nim游戏!(博弈)
    Cogs 876. 游戏(DP)
    Cogs 2546. 取石块儿(博弈)
    Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
    Codevs 3002 石子归并 3(DP四边形不等式优化)
    洛谷 P1041 传染病控制
    洛谷 P1967 货车运输
    洛谷 P1038 神经网络
    洛谷 P1027 Car的旅行路线
    洛谷 P1054 等价表达式
  • 原文地址:https://www.cnblogs.com/yingsong/p/5685790.html
Copyright © 2011-2022 走看看