一:操作CLOB
 
 (1)数据库表结构如下:
 
 
      create table CLOB_TEST
      (
         ID      VARCHAR2(5) not null,
         CONTENT CLOB     
     )
 
 (2)插入CLOB
 
 方法一:第一步插入一个空值,第二步锁住此行,更新clob字段
 
 public static void insertClob(Connection conn,String data) throws Exception{      //这句话如没有,9i的驱动下会报 java.sql.SQLException: ORA-01002: 读取违反顺序 的异常。  conn.setAutoCommit(false);
   //插入一个空CLOB   String insertSql = "insert into clob_test(id,content) values('1',empty_clob())";   //查询插入的空CLOB   String selectSql = "select content from clob_test where id = '1' for update";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.executeUpdate();   stmt.close();   // lock this line   PreparedStatement pstmt = conn.prepareStatement(selectSql);   ResultSet rs = pstmt.executeQuery();   if(rs.next()){    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1);    //为CLOB写信息   BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());     BufferedReader in = new BufferedReader(new FileReader(data));     int c;     while ((c=in.read())!=-1) {       out.write(c);     }     in.close();     out.close();    }   conn.commit();   pstmt.close();  }
 
 注:此方法在jdk1.4、jdk50、jdk6.0和Oracle9i、Oracle10g、Oracle11g驱动下测试通过!
 
 方法二:通过setString方法
 
 public static void insertClob(Connection conn,String data) throws Exception{     String insertSql = "insert into clob_test(id,content) values('1',?)";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.setString(1, data);   stmt.executeUpdate();   stmt.close();   conn.close();
 
  }
 
 
 注:由于在Oracle9i的驱动下,setString 有2000字符长度的限制,故这个方法只适合Oracle10g以上的驱动(Oracle11g驱动+JDK6.0也测试通过)。
 
 方法三:通过setClob方法
 
 public static void insertClob(Connection conn,String filePath) throws Exception{   String insertSql = "insert into clob_test(id,content) values('1',?)";   PreparedStatement  stmt = conn.prepareStatement(insertSql);   stmt.setClob(1, new FileReader(filePath));   stmt.executeUpdate();   stmt.close();   conn.commit();  }
 
 注:由于setClob(int parameterIndex, Reader reader)这个方法是JDBC4.0规范刚加的内容,是以流的方式为CLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
 
 (3)读取CLOB
 
 方法一:
 
 public static String readClob(Connection conn) throws Exception{   PreparedStatement  stmt = conn.prepareStatement("select * from clob_test where id = '1'");   ResultSet rs = stmt.executeQuery();   String str="";   StringBuffer sb = new StringBuffer("");   while(rs.next()){    Clob clob = rs.getClob("content");    Reader is = clob.getCharacterStream();        BufferedReader br = new BufferedReader(is);        str = br.readLine();        while (str != null)       {         sb.append(str);        str = br.readLine();        }    }   return sb.toString();  }
 
 方法二:
 public static String readClob(Connection conn) throws Exception{   PreparedStatement  stmt = conn.prepareStatement("select * from clob_test where id = '1'");   ResultSet rs = stmt.executeQuery();   String str="";   while(rs.next()){    str = rs.getString("content");   }   return str;  }
 
 注:由于在Oracle9i的驱动下,rs.getString 返回为null,所以此方法只适合Oracle10g及其以上驱动。
 
 二:操作BLOB
 
 (1)数据库表结构如下:
 
 
      create table BLOB_TEST
      (
         ID      VARCHAR2(5) not null,
         CONTENT BLOB
     )
 
 (2)插入BLOB
 
  方法一:第一步插入一个空值,第二步锁住此行,更新blob字段
 
 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   psm = con.prepareStatement("insert into blob_test(id,content) values('2',empty_blob())");   psm.executeUpdate();   psm = con.prepareStatement("select content from blob_test where id ='2' for update");   ResultSet rs = psm.executeQuery();   if(rs.next()){    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(1);    FileInputStream fin = new FileInputStream(file);    OutputStream out = blob.getBinaryOutputStream();    int count = -1, total = 0;     byte[] data = new byte[blob.getBufferSize()];    while ((count = fin.read(data)) != -1)    {      out.write(data, 0, count);     }     out.flush();    out.close();
   }    }
 
  方法二:通过setBinaryStream方法
 
 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   try {    fis = new FileInputStream(file);    psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");    psm.setBinaryStream(1, fis, fis.available());    psm.executeUpdate();     }finally{    if(fis != null) fis.close();    psm.close();    con.close();   }    }
 
  方法三:通过setBlob(int parameterIndex, InputStream inputStream)方法
 
 public static void writeBlob(Connection con,String filePath) throws Exception{   FileInputStream fis = null;   PreparedStatement psm = null;   File file = new File(filePath);   try {    fis = new FileInputStream(file);    psm = con.prepareStatement("insert into blob_test(id,content) values('2',?)");    psm.setBlob(1, fis);    psm.executeUpdate();     }finally{    if(fis != null) fis.close();    psm.close();    con.close();   }    }
 
 
 注:由于setBlob(int parameterIndex, InputStream inputStream)这个方法是JDBC4.0规范刚加的内容,是以流的方式为BLOB赋值的。并且Oracle9i驱动、Oracle10g驱动、JDK1.4、JDK1.5是基于JDBC3.0规范的,只有Oracle11g驱动+JDK6.0才是基于JDBC4.0规范的,所以目前这个方法只适合Oracle11g驱动(ojdbc6.jar)+JDK6.0!
 
 (3)读取BLOB
 
 public static void readBlob(Connection con,String outFilePath){   Statement sm = null;   ResultSet rs = null;   try {    sm = con.createStatement();    rs = sm.executeQuery("select * from blob_test where id = 2");    if(rs.next()){     Blob blob = rs.getBlob("content");     File file = new File(outFilePath);                 FileOutputStream sout = new FileOutputStream(file);        InputStream in = blob.getBinaryStream();//获取BLOB数据的输入数据流                 //经BLOB输入数据流读取数据,并将其写入文件                 byte[] b = new byte[256];                  int off = 0;                 int len = b.length;                 for (int i = in.read(b); i != -1;) {                      sout.write(b);                      i = in.read(b);                 }              sout.close();              rs.close();              sm.close();              con.close();    }   } catch (Exception e) {    e.printStackTrace();   }  }

JAVA操作ORACLE大对象的更多相关文章

  1. Java操作Oracle

    public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...

  2. java 操作Oracle 批量入库的问题

    java 操作Oracle 批量入库的问题 先说下我运行的环境: Windows7 64位操作系统 (四核)Intel i5-2300 CPU @2.80GHz 内存4G 硬盘1T Jdk1.6+My ...

  3. java操作oracle的blob,clob数据

    一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB:  ...

  4. JAVA操作ORACLE数据库的存储过程

    一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...

  5. ORACLE大对象存储

    --创建有大对象字段的一张表 create table test001 (       fname varchar2(50),       content blob )  select * from ...

  6. Java操作Oracle数据库以及调用存储过程

    操作Oracle数据库 publicclass DBConnection {     //jdbc:oracle:thin:@localhost:1521:orcl     publicstaticf ...

  7. Java 操作Oracle数据库

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  8. JAVA处理Blob大对象

    Blob对象是SQL Blob的Java语言映射.SQL Blob是一个内置类型,它可以将一个二进制大对象保存在数据库中.接口ResultSet.CallableStatement和PreparedS ...

  9. Java操作Redis存储对象类型数据

    背景描述      关于JAVA去操作Redis时,如何存储一个对象的数据,大家是非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用.存储一个对象是是 ...

随机推荐

  1. scipy详解

    登月图片消噪   scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快,是对之前算法的改进图片是二维数据,注意使用fftpack的二维转变方法   import numpy a ...

  2. 001-guava概述

    一.概述 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives supp ...

  3. Linux strace追踪命令详解

    strace介绍 strace命令是一个集诊断.调试.统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的.当然s ...

  4. Spring Cloud Ribbon 客户端负载均衡 4.3

      在分布式架构中,服务器端负载均衡通常是由Nginx实现分发请求的,而客户端的同一个实例部署在多个应用上时,也需要实现负载均衡.那么Spring Cloud中是否提供了这种负载均衡的功能呢?答案是肯 ...

  5. Python - Django - 页面上展示固定的页码数

    如果页数太多的话,全部显示在页面上就会显得很冗杂 可以在页面中显示规定的页码数 例如: book_list.html: <!DOCTYPE html> <html lang=&quo ...

  6. idea的alt+enter可以从菜单点吗

    在idea中,当java某个类的包没有引入的时候,可以通过alt+enter来实现包的引入,那么可以通过菜单按钮,或者右键的方式点出来吗? 我们知道eclipse如果某个类为止,放在这个报错的类上,e ...

  7. 【Leetcode_easy】949. Largest Time for Given Digits

    problem 949. Largest Time for Given Digits solution: class Solution { public: string largestTimeFrom ...

  8. CSS3 《3D骰子 压大小》

    游戏在线预览地址:http://dtdxrk.github.io/game/3d-dice/index.html js判断一个随机数大小的游戏. 本来想用canvas做的,平面的生产一个点数,感觉没啥 ...

  9. 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测

    1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...

  10. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法

    光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...