一:操作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. asp程序里,如何判断一个字符串中存在包含了另一个字符串?

    1.判断是否包含某某字符函数是:Instr()和InstrRev();2.具体使用如下:ab="abcdefgHTTP"你可以用Instr()或者InstrRev()来判断if I ...

  2. 009-Spring Boot全局配置跨域请求支持

    1.Spring Boot 2.0以前全局配置跨域主要是继承WebMvcConfigurerAdapter @Configuration public class CorsConfig extends ...

  3. ES6深入浅出-5 新版对象-1.如何创建对象

    对象属性的加强: 可以通过new Object(), Object.create()方法,或者使用字面量标记(初始化标记)初始化对象. 一个对象初始化器,由花括号/大括号 ({}) 包含的一个由零个或 ...

  4. LeetCode_374. Guess Number Higher or Lower

    374. Guess Number Higher or Lower Easy We are playing the Guess Game. The game is as follows: I pick ...

  5. 【kubernetes secret 和 aws ecr helper】kubernetes从docker拉取image,kubernetes docker私服认证(argo docker私服认证),no basic auth credentials错误解决

    aws ecr helper: https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-dock ...

  6. 使用Spring Boot接受HTTP GET/POST请求的一个SQL并返回结果

    这里说的意思是:我向我的Web服务器发送一个请求(因为GET请求的一些限制,所以最好使用POST请求,不过这里作为测试还是使用GET请求),请求中带一个sql参数,它对应查询的数据.然后我的Sprin ...

  7. 【Leetcode_easy】1030. Matrix Cells in Distance Order

    problem 1030. Matrix Cells in Distance Order 参考 1. Leetcode_easy_1030. Matrix Cells in Distance Orde ...

  8. 【Leetcode_easy】905. Sort Array By Parity

    problem 905. Sort Array By Parity solution1: class Solution { public: vector<int> sortArrayByP ...

  9. AWS 架构最佳实践概述(十一)

    AWS 架构最佳实践 AWS合理架构的框架支柱 安全性 - 保护并监控系统 能够保护信息.系统和资产 通过风险评估和缓解策略 可靠性 - 从故障中恢复并减少中断 从基础设施或服务故障中恢复 动态获取计 ...

  10. k8s 使本地集群支持 LoadBalancer 服务

    k8s 使本地集群支持 LoadBalancer 服务 为了使本地集群支持 LoadBalancer 服务,可以参考以下两种实现方案: keepalived-cloud-provider metalL ...