转载至程式先锋技术维客[url]www.javabiz.cn[/url]
先来看看两种LOB类型的主要区别:
CLOB 表示Character LOB (字符LOB)  它可以存储大量的字符数据。
BLOB表示 Binary LOB(二进制LOB)。此数据类型的列可以存储大型二进制对象,如图形、视频剪辑和声音文件等。

基本上我们可以得出这样的结论: 文本文件我们既可以使用BLOB也可以使用CLOB,二进制文件的存储我们只能使用BLOB类型.

好,下面通过代码示例描述如何读取和写入LOB类型的字段:
1. 先建一张表,具有三个字段:
CREATE TABLE "ATTACHMENT" (
"ID" VARCHAR2(10) NOT NULL,
"MYCLOB" CLOB,
"MYBLOB" BLOB,
PRIMARY KEY("ID"));

2. 准备两个文件用来存入数据库:
c:/Test.java  用来代表文本文件
C:/xx.jar  用来代表二进制数据

3. 存储文本信息到CLOB字段中
    Connection conn = DBUtil.getConnection();
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();
        //先初始化CLOB字段,此处为必须的操作,否则后面会产生空指针异常
    String initSql = "UPDATE ATTACHMENT SET MYCLOB=EMPTY_CLOB() WHERE ID=1";
        //读取CLOB字段
    String updateSql = "SELECT MYCLOB FROM ATTACHMENT WHERE ID=1";
    stmt.executeUpdate(initSql);
    ResultSet rs = stmt.executeQuery(updateSql);
    if (rs.next()) {
        CLOB clob = (CLOB) rs.getClob(1); //获取CLOB字段内容并转换为 oracle.sql.CLOB类型
                //获取CLOB的输出流
        Writer os = clob.getCharacterOutputStream();
                //读取文本文件
        BufferedReader br = new BufferedReader(new FileReader(new File(
                "c:/Test.java")));
        String line = br.readLine();
        StringBuffer buffer = new StringBuffer();
        while (line != null) {
            buffer.append(line);  
            line = br.readLine();
        }
        os.write(buffer.toString());
        os.flush();
        br.close();
        os.close();
        conn.commit();
        conn.close();
    }
    System.out.println("Saved");
   在SQLPlus中测试一下文件有没有存入到数据库中,
   SQL>
   SQL> SELECT DBMS_LOB.GETLENGTH(MYCLOB) FROM ATTACHMENT;
显示结果如下:
DBMS_LOB.GETLENGTH(MYCLOB)
--------------------------
                       177
这表明文件已经写入到这个MYCLOB字段中,如果没有存入的话,SQLPlus中不会显示任何数字(包括零也不会被显示), 现在可以进行下一步操作了
  
4. 读取CLOB字段中的文本信息
    Connection conn = DBUtil.getConnection();
    Statement st = conn.createStatement();
    PreparedStatement preparedStatement = conn.prepareStatement("SELECT MYCLOB FROM ATTACHMENT WHERE ID=1");
    ResultSet rs = preparedStatement.executeQuery();
    if (rs.next()) {
                //获取CLOB字段信息
        CLOB clob = (CLOB)rs.getClob("MYCLOB");
        BufferedReader br = new BufferedReader(clob.getCharacterStream());
                //创建输出流
        BufferedWriter out = new BufferedWriter(new FileWriter("C:/tttt.txt"));
        String line = br.readLine();
        while (line != null) {
            out.write(line);
            System.out.println(line);
            line = br.readLine();
            out.flush();
        }
        out.close();
        br.close();
    }
    rs.close();
    st.close();
    conn.close();

5. 写入二进制信息到BLOB字段
    conn = DBUtil.getConnection();
    // 设置不自动提交
    conn.setAutoCommit(false);
    // 创建数据库操作语句
    statement = conn.createStatement();
    // 定义SQL语句
    statement.executeUpdate("UPDATE ATTACHMENT SET MYBLOB = EMPTY_BLOB() WHERE ID=1");
    String strSQL = "SELECT MYBLOB FROM ATTACHMENT WHERE ROWNUM = 1 FOR UPDATE";
    resultset = statement.executeQuery(strSQL);
    BLOB contents = null;
    while (resultset.next()) {
        // 取出BLOB对象
        contents = (oracle.sql.BLOB) resultset.getBlob(1);
    }
    OutputStream out = contents.getBinaryOutputStream();
    FileInputStream in = new FileInputStream(new File("c:/XX.jar"));
    //将输出流和输入流对转
    FileUtil.copy(in, out);
    out.close();
    in.close();
    // 数据库提交
    conn.commit();
    conn.close();
    同样,这里我们也在SQLPlus中测试一下BLOB字段中是否已经含有数据:
    SQL>
    SQL> SELECT DBMS_LOB.GETLENGTH(MYBLOB) FROM ATTACHMENT;
    显示结果如下:
    DBMS_LOB.GETLENGTH(MYBLOB)
    --------------------------
                           211
    表明已经存入数据,数据的大小是21.1k, 现在可以进行读取操作了

6. 读取BLOB字段中内容并存储到一个文件中
    Connection conn = DBUtil.getConnection();
    conn.setAutoCommit(false);
    PreparedStatement preparedStatement = conn
            .prepareStatement("SELECT DATA FROM ATTACH WHERE ROWNUM=1");
    ResultSet rs = preparedStatement.executeQuery();
    if (rs.next()) {
        Blob blob = rs.getBlob(1);
        if (blob != null) {
            InputStream is = ((BLOB) blob).getBinaryStream();
            // ((CLOB) clob).getCharaterStream();
            FileOutputStream fos = new FileOutputStream(new File(
                    "c:/abc.jar"));
            FileUtil.copy(is, fos);
            fos.close();
            is.close();
        }
    }
    rs.close();
    preparedStatement.close();
    conn.close();

输出: c盘的根目录下应该出现了一个abc.jar 的文件, 你可以根据字节数和xx.jar比较一下,应该完全相同.
    上述步骤是使用了示例代码展示了如何操作Oracle中LOB字段类型,如果需要本文中的全部源代码请发送邮件到[email]info@javabiz.cn[/email]

转载于:https://blog.51cto.com/gongqikui/82299

使用JDBC操作基于Oracle的CLOB,BLOB字段类型相关推荐

  1. 在VC6中使用ADO读取Oracle中的BLOB字段

    今天尝试将存储于Oracle(版本:9.0.1.1.1)中BLOB字段里的图像文件读出来,文件量很小,不到10K.使用vc6+ADO,使用控制台程序初步尝试如下: ::CoInitialize(NUL ...

  2. form6i支持 oracle 11g,使用Form6i保存文件到Oracle中的Blob字段

    oracle|字符串1.在数据库中建一个新表用于测试.CREATE TBALE TB_TEST ( ID NUMBER, BLB BLOB);COMMIT;2.往TB_TEST表中插入一条新记录用于测 ...

  3. JDBC Mybatis 调用 ORACLE 存储过程 函数 返回 varray 类型 function return varray out varray

    ORACLE中使用VARRAY解决字符串数组问题 博客分类: ORACLE/MYSQL总结 OracleSQLJDBCCC++ 如何从 PL/SQL 存储函数中返回数组类型 思路:在 Oracle 数 ...

  4. oracle 数据库表的字段类型修改为clob类型报错及解决方法

    数据库表修改字段类型为clob会报错invalid alteration of datatype.不允许修改.可以先建个clob类型的新字段,然后把要改字段类型数据备份到新的字段中,然后删除掉旧的字段 ...

  5. oracle表的常见字段类型有哪些,Oracle数据库的字段类型

    字 段 类 型 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度 ...

  6. mysql数据库blob区别_MySQL中TEXT与BLOB字段类型的区别

    在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程序的博主不知道改为自己的博客正文字段选择TEXT还是BLOB类型. 下面给出几点区别: 一.主要差别 TEXT ...

  7. mysql blob 字段_MySQL中TEXT与BLOB字段类型的区别

    在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程序的博主不知道改为自己的博客正文字段选择TEXT还是BLOB类型. 下面给出几点区别: 一.主要差别 TEXT ...

  8. 查看oracle的表的字段类型

    查看oracle中的表的字段类型的sql: select COLUMN_NAME,DATE_TYPE,DATA_LENGTH,DATA_PRECISION from all_tab_columnswh ...

  9. jdbc oracle clob blob long类型数据

    InputStream rd = resultset.getBinaryStream("列名"); int data=-1; StringBuffer sbf=new String ...

最新文章

  1. Linux文件系统属性权限chattr与lsattr命令
  2. MySQL是自主可控的吗_国产处理器那么多,究竟有哪些,是真正的“自主可控”?...
  3. 计算机复位启动如何操作,电脑能开机但进入不了系统,怎么办?按什么键能恢复系统?...
  4. KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)
  5. ecm工作原理 usb_“好玩具”来了!往你的USB端口里藏入一个小开发板...
  6. linux分区设置大小,Linux调整磁盘分区大小
  7. 小米百万美金大奖花落机器狗团队,5 年千亿重砸研发鼓励创新
  8. ios审核一般要多久_水电施工要注意哪些问题?水电施工一般需要多久
  9. 在 Linux 的应用中测试中的延时和丢包模拟
  10. Programiz 中文系列教程·翻译完成
  11. FW150U构建无线局域网【模拟AP功能设置指南】
  12. python列表解析的底层详解
  13. 一个555振荡电路及其解释
  14. Realsense-Ros安装配置
  15. 《R语言入门与实践》学习笔记二(chapter4~6)
  16. Qt Jambi 4.8 快速入门
  17. 篱笆回路Fence Loops
  18. python打印2020某月的日历_教你用Python打印2020年日历
  19. 10个程序员最喜欢的 HTML和CSS 等在线代码编辑器——pow_na的博客
  20. gSoap生成C++接口

热门文章

  1. OpenCV支持向量机SVM的实例(附完整代码)
  2. C语言将向量中的所有0移至末尾(附完整源码)
  3. c++稀疏表sparse table的实现算法(附完整源码)
  4. QT的QMapIterator类的使用
  5. QT的QByteArray 类的使用
  6. C++加号运算符重载
  7. python类_Python中的类
  8. Minimum supported Gradle version is 6.5. Current version is 6.1.1. If using the gradle wrapper, try
  9. C语言文件操作函数的编写
  10. volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域