文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle中BLOB、CLOB的读取和写入方式

2024-10-17 20:25

关注

Oracle中BLOB、CLOB的读取和写入

在Oracle数据库中,大类型字段(也称为大对象或LOB,Large Object)用于存储大量的数据,如文本、图像、视频等。

Oracle 提供了几种不同的大类型字段,主要包括:

1.CLOB(Character Large Object)

2.BLOB(Binary Large Object)

3.NCLOB(National Character Large Object)

4.BFILE(Binary File)

基于SQL和Java的方式实现读取和插入这些大类型字段,同时将读取的数据转换为字符串类型。

基于SQL的方式实现CLOB、BLOB的插入与读取

1. 插入大类型数据

插入 CLOB 数据

CLOB用于存储大段文本,可以通过简单的SQL插入语句来插入数据:

INSERT INTO my_table (id, clob_column)
VALUES (1, 'This is a large text that can go up to 4 GB');

插入 BLOB 数据

BLOB用于存储二进制数据。由于直接通过SQL插入BLOB数据较为复杂,通常会通过文件或其他方法插入数据。

假设我们要插入一段十六进制字符串代表的二进制数据:

INSERT INTO my_table (id, blob_column)
VALUES (1, hextoraw('48656C6C6F20576F726C64')); -- 'Hello World' in hexadecimal

2. 读取大类型数据并转换为字符串

读取 CLOB 数据并转换为字符串

CLOB字段中的数据可以直接读取并视为字符串:

SELECT clob_column
FROM my_table
WHERE id = 1;

读取 BLOB 数据并转换为字符串 (UTL_RAW.CAST_TO_VARCHAR2)

BLOB数据通常是二进制的,如果需要将其转换为字符串,可以使用SQL中的UTL_RAW.CAST_TO_VARCHAR2函数,将其转换为VARCHAR2类型(注意BLOB大小不能超过VARCHAR2的限制[2000]):

SELECT UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(blob_column, 4000, 1))
FROM my_table
WHERE id = 1;

这里dbms_lob.substr用于提取BLOB中的数据,最大可提取4000字节。

也可以先使用dbms_lob.substr(blob_column) 来判断BLOB类型字段的数据长度,如果不超过 2000,可以直接使用UTL_RAW.CAST_TO_VARCHAR2(blob_column)来将BLOB类型数据转为字符类型。

SELECT UTL_RAW.CAST_TO_VARCHAR2(blob_column)
FROM my_table
WHERE id = 1;

基于Java方式实现CLOB和BLOB的插入与读取

在Java中,通过PreparedStatement进行插入,通过ResultSet进行读取。

1. Java 中插入 CLOB 和 BLOB 数据

插入 CLOB 数据

使用Java的PreparedStatement将字符串数据插入到CLOB字段:

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

public class ClobInsertExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");

            String sql = "INSERT INTO my_table (id, clob_column) VALUES (?, ?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 1);
            pstmt.setString(2, "This is a large text for CLOB field.");

            pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

插入 BLOB 数据

BLOB通常用于存储二进制数据,如图像或文件。

通过Java的PreparedStatement插入二进制数据:

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

public class BlobInsertExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");

            String sql = "INSERT INTO my_table (id, blob_column) VALUES (?, ?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 1);

            FileInputStream inputStream = new FileInputStream("path/to/your/file.jpg");
            pstmt.setBinaryStream(2, inputStream, inputStream.available());

            pstmt.executeUpdate();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

2. Java 中读取 CLOB 和 BLOB 数据并转换为字符串

读取 CLOB 数据并转换为字符串

读取CLOB数据并将其转换为字符串非常简单:

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

public class ClobReadExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");

            String sql = "SELECT clob_column FROM my_table WHERE id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 1);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String clobData = rs.getString("clob_column");
                System.out.println(clobData);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

读取 BLOB 数据并转换为字符串

由于BLOB是二进制数据,需要先读取为字节数组,然后将其转换为字符串

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class BlobReadExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");

            String sql = "SELECT blob_column FROM my_table WHERE id = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 1);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                InputStream inputStream = rs.getBinaryStream("blob_column");
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                byte[] buffer = new byte[4096];
                int bytesRead = -1;

                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }

                byte[] imageBytes = outputStream.toByteArray();
                String blobAsString = new String(imageBytes, "UTF-8");
                System.out.println(blobAsString);

                inputStream.close();
                outputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网(www.lsjlt.com)。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯