• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 天下网吧 | 发布时间: 2025-6-18 09:24| 查看数: 85| 评论数: 0|帖子模式

    Oracle中BLOB、CLOB的读取和写入

    在Oracle数据库中,大类型字段(也称为大对象或LOB,Large Object)用于存储大量的数据,如文本、图像、视频等。
    Oracle 提供了几种不同的大类型字段,主要包括:
    1.CLOB(Character Large Object)

    • 存储大量的字符数据,可以存储多达4 GB的文本。
    • 适用于需要存储大段文本信息的场景,如文档、日志记录等。
    2.BLOB(Binary Large Object)

    • 存储大量的二进制数据,可以存储多达4 GB的二进制信息。
    • 常用于存储图片、音频、视频等媒体文件。
    3.NCLOB(National Character Large Object)

    • 类似于CLOB,但用于存储多字节字符集(如Unicode字符集)的数据。
    • 适用于需要存储多国语言文本的应用。
    4.BFILE(Binary File)

    • 存储外部文件的引用,而不是将文件内容直接存储在数据库中。
    • BFILE可以存储在数据库外部文件系统中,数据库只存储其路径和文件名。
    基于SQL和Java的方式实现读取和插入这些大类型字段,同时将读取的数据转换为字符串类型。

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


    1. 插入大类型数据

    插入 CLOB 数据
    CLOB用于存储大段文本,可以通过简单的SQL插入语句来插入数据:
    1. INSERT INTO my_table (id, clob_column)
    2. VALUES (1, 'This is a large text that can go up to 4 GB');
    复制代码
    插入 BLOB 数据
    BLOB用于存储二进制数据。由于直接通过SQL插入BLOB数据较为复杂,通常会通过文件或其他方法插入数据。
    假设我们要插入一段十六进制字符串代表的二进制数据:
    1. INSERT INTO my_table (id, blob_column)
    2. VALUES (1, hextoraw('48656C6C6F20576F726C64')); -- 'Hello World' in hexadecimal
    复制代码
    2. 读取大类型数据并转换为字符串

    读取 CLOB 数据并转换为字符串
    CLOB字段中的数据可以直接读取并视为字符串:
    1. SELECT clob_column
    2. FROM my_table
    3. WHERE id = 1;
    复制代码
    读取 BLOB 数据并转换为字符串 (
    1. UTL_RAW.CAST_TO_VARCHAR2
    复制代码
    )
    BLOB数据通常是二进制的,如果需要将其转换为字符串,可以使用SQL中的
    1. UTL_RAW.CAST_TO_VARCHAR2
    复制代码
    函数,将其转换为VARCHAR2类型(注意BLOB大小不能超过VARCHAR2的限制
    1. [2000]
    复制代码
    ):
    1. SELECT UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(blob_column, 4000, 1))
    2. FROM my_table
    3. WHERE id = 1;
    复制代码
    这里
    1. dbms_lob.substr
    复制代码
    用于提取BLOB中的数据,最大可提取4000字节。
    也可以先使用
    1. dbms_lob.substr(blob_column)
    复制代码
    来判断BLOB类型字段的数据长度,如果不超过
    1. 2000
    复制代码
    ,可以直接使用
    1. UTL_RAW.CAST_TO_VARCHAR2(blob_column)
    复制代码
    来将BLOB类型数据转为字符类型。
    1. SELECT UTL_RAW.CAST_TO_VARCHAR2(blob_column)
    2. FROM my_table
    3. WHERE id = 1;
    复制代码
    基于Java方式实现CLOB和BLOB的插入与读取

    在Java中,通过
    1. PreparedStatement
    复制代码
    进行插入,通过
    1. ResultSet
    复制代码
    进行读取。

    1. Java 中插入 CLOB 和 BLOB 数据

    插入 CLOB 数据
    使用Java的
    1. PreparedStatement
    复制代码
    将字符串数据插入到CLOB字段:
    1. import java.sql.Connection;
    2. import java.sql.DriverManager;
    3. import java.sql.PreparedStatement;

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

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

    14.             pstmt.executeUpdate();
    15.         } catch (Exception e) {
    16.             e.printStackTrace();
    17.         } finally {
    18.             try {
    19.                 if (pstmt != null) pstmt.close();
    20.                 if (conn != null) conn.close();
    21.             } catch (Exception e) {
    22.                 e.printStackTrace();
    23.             }
    24.         }
    25.     }
    26. }
    复制代码
    插入 BLOB 数据
    BLOB通常用于存储二进制数据,如图像或文件。
    通过Java的
    1. PreparedStatement
    复制代码
    插入二进制数据:
    1. import java.io.FileInputStream;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;

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

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

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

    16.             pstmt.executeUpdate();
    17.             inputStream.close();
    18.         } catch (Exception e) {
    19.             e.printStackTrace();
    20.         } finally {
    21.             try {
    22.                 if (pstmt != null) pstmt.close();
    23.                 if (conn != null) conn.close();
    24.             } catch (Exception e) {
    25.                 e.printStackTrace();
    26.             }
    27.         }
    28.     }
    29. }
    复制代码
    2. Java 中读取 CLOB 和 BLOB 数据并转换为字符串

    读取 CLOB 数据并转换为字符串
    读取CLOB数据并将其转换为字符串非常简单:
    1. import java.sql.Connection;
    2. import java.sql.DriverManager;
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;

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

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

    16.             if (rs.next()) {
    17.                 String clobData = rs.getString("clob_column");
    18.                 System.out.println(clobData);
    19.             }
    20.         } catch (Exception e) {
    21.             e.printStackTrace();
    22.         } finally {
    23.             try {
    24.                 if (rs != null) rs.close();
    25.                 if (pstmt != null) pstmt.close();
    26.                 if (conn != null) conn.close();
    27.             } catch (Exception e) {
    28.                 e.printStackTrace();
    29.             }
    30.         }
    31.     }
    32. }
    复制代码
    读取 BLOB 数据并转换为字符串
    由于BLOB是二进制数据,需要先读取为字节数组,然后将其转换为字符串
    1. import java.io.ByteArrayOutputStream;
    2. import java.io.InputStream;
    3. import java.sql.Connection;
    4. import java.sql.DriverManager;
    5. import java.sql.PreparedStatement;
    6. import java.sql.ResultSet;

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

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

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

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

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

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

    29.                 inputStream.close();
    30.                 outputStream.close();
    31.             }
    32.         } catch (Exception e) {
    33.             e.printStackTrace();
    34.         } finally {
    35.             try {
    36.                 if (rs != null) rs.close();
    37.                 if (pstmt != null) pstmt.close();
    38.                 if (conn != null) conn.close();
    39.             } catch (Exception e) {
    40.                 e.printStackTrace();
    41.             }
    42.         }
    43.     }
    44. }
    复制代码
    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/database/3289629m3.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表