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




     

  • 相关阅读:
    scala之伴生对象的继承
    scala之伴生对象说明
    “Failed to install the following Android SDK packages as some licences have not been accepted” 错误
    PATH 环境变量重复问题解决
    Ubuntu 18.04 配置java环境
    JDBC的基本使用2
    DCL的基本语法(授权)
    ZJNU 1374
    ZJNU 2184
    ZJNU 1334
  • 原文地址:https://www.cnblogs.com/linjiqin/p/2159936.html
Copyright © 2011-2022 走看看