一:操作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. ratingBar 星级评分条

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  2. spring-data-redis数据类型

    一.引入依赖 <!-- 缓存 --> <dependency> <groupId>redis.clients</groupId> <artifac ...

  3. zookeeper在windows的常用命令

    首先简要讲下安装 安装jdk 安装Zookeeper. 在官网http://zookeeper.apache.org/下载zookeeper.我下载的是zookeeper-3.4.6版本. 解压zoo ...

  4. Qt编写自定义控件61-通用移动

    一.前言 通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐 ...

  5. [ jenkins ] 基础安装及权限管理

    1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...

  6. CA机构介绍(Certificate Authority 域名SSL证书颁发机构)

    SSL证书机构即CA机构的全称为Certificate Authority证书认证中心,只有通过WebTrust国际安全审计认证,根证书才能预装到主流浏览器,成为全球可信的ssl证书颁发机构. HTT ...

  7. k8s SLUB: Unable to allocate memory on node -1 错误

    Try to Fix Two Linux Kernel Bugs While Testing TiDB Operator in K8sWed, May 1, 2019 Wenbo Zhang Auth ...

  8. PDO 查询mysql返回字段int变为String型解决方法

    PDO 查询mysql返回字段int变为String型解决方法使用PDO查询mysql数据库时,执行prepare,execute后,返回的字段数据全都变为字符型. 例如id在数据库中是Int的,查询 ...

  9. 走进热修复框架AndFix的世界

    关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法.1.什么是AndFix? AndFix是阿里巴巴出的一个专门 ...

  10. 虚拟机中windows下制作超级隐藏账户

    这篇博客非原创,我只是将很多大佬写的东西理解了一下写了出来. 接下来的实验最好在虚拟机进行,因为可以快照~ 制作隐藏用户可以说是两种方法但是基本操作一样,所以我们穿插着进行一种是隐藏账户,一种是影子账 ...