zoukankan      html  css  js  c++  java
  • Oracle中Varchar2/Blob/Clob用法详解

    数据库中提供了三种字段类型Varchar2、Blob和Clob用于存储字符串或二进制数据,其中Varchar2、Clob用于存储字符串数据,而Blob用于存储二进制数据。

                  

    Varchar2采用单字节存储,有两个最大长度:一个是在字段类型4000;一个是在PL/SQL中变量类型32767。

    今天犯了一个小错误,就是函数的varchar2类型的返回值长度也是4000,而不是我以为的32767。
    Blob 采用单字节存储,适合保存二进制数据,如图片文件。
    Clob 采用多字节存储,适合保存大型文本数据。

                

    Oracle中处理BLOB/CLOB字段的方式比较特别,所以需要特别注意下面两点:

    1. 在Oracle JDBC中采用流机制对 BLOB/CLOB 进行读写操作,所以要注意不能在批处理中读写 BLOB/CLOB字段,否则将出现
    Stream type cannot be used in batching 异常。

    2. Oracle BLOB/CLOB 字段本身拥有一个游标(cursor),JDBC通过游标对Blob/Clob字段进行操作,在Blob/Clob字段创建之前,无法获取其游标句柄,会出现
    Connection reset by peer: socket write error 异常。
               

    正确的做法是:首先创建一个空 Blob/Clob 字段,再从这个空 Blob/Clob字段获取游标,例如下面的代码:

    PreparedStatement ps=conn.prepareStatement("insert into PICTURE(image,resume) values(?,?)");
    //通过oralce.sql.BLOB/CLOB.empty_lob()构造空Blob/Clob对象
    ps.setBlob(
    1, oracle.sql.BLOB.empty_lob());
    ps.setClob(
    2, oracle.sql.CLOB.empty_lob());

    ps.excuteUpdate();
    ps.
    close();


    //再次对读出Blob/Clob句柄
    ps
    =conn.prepareStatement("select image,resume from PICTURE where id=? for update");
    ps.setInt(
    1 , 100);

    ResultSet rs
    =ps.executeQuery();
    rs.
    next();
    oracle.sql.BLOB imgBlob
    =(oracle.sql.BLOB)rs.getBlob(1);
    oracle.sql.CLOB resClob
    =(oracle.sql.CLOB)rs.getClob(2);

     

    //将二进制数据写入Blob 
    FileInputStream inStream
    =new FileInputStream("c://image.jpg");
    OutputStream outStream
    =imgBlob.getBinaryOutputStream();
    byte
    [] buf=new byte[10240];
    int len;
    while(len=inStream.read(buf)>0){
    outStream.write(buf,
    0 ,len);
    }
    inStream.
    close();
    outStream.cloese();


    //将字符串写入Clob
    resClob.putString(
    1, "this is a clob");

    //再将Blob/Clob字段更新到数据库
    ps
    =conn.prepareStatement("update PICTURE set image=? and resume=? where id=?");
    ps.setBlob(
    1, imgBlob);
    ps.setClob(
    2, resClob);
    ps.setInt(
    3, 100 );

    ps.executeUpdate();
    ps.
    close();




     

  • 相关阅读:
    Web应用程序的开发步骤
    APAP INCLUDE
    2015-07-12
    oracle自定义异常
    java quartz 设置定时任务串行执行
    java stream peek的使用
    java List转String
    Java打jar包后如何获取resource中的文件
    ImmutablePair和ImmutableTriple的使用
    mvn打jar包示例:依赖打入jar包和依赖打到外部文件夹
  • 原文地址:https://www.cnblogs.com/linjiqin/p/2159936.html
Copyright © 2011-2022 走看看