• 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();




     

  • 相关阅读:
    【学习笔记】Hibernate关联映射(Y2-1-6)
    百度搜索排名API接口返回JSON数据格式
    HtmlAgilityPack 属性获取
    HtmlAgilityPack
    HighCharts实现双Y轴
    QQ在线客服配置
    项目管理者必知:适用于仪表盘项目的7个优秀JavaScript库
    极简Node教程-七天从小白变大神(二:中间件是核心)
    极简Node教程-七天从小白变大神(一:你需要Express)
    CSS滚动插件
  • 原文地址:https://www.cnblogs.com/linjiqin/p/2159936.html
Copyright © 2020-2023  润新知