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 的方式实现 CLOBBLOB 的插入与读取

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 方式实现 CLOBBLOB 的插入与读取

在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();
            }
        }
    }
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OracleBLOBCLOB都是用来存储大型二进制和字符数据的数据类型,但是它们之间有一些区别。 BLOB是二进制大型对象,用于存储二进制数据,例如图像、音频和视频等。BLOB数据可以通过二进制流进行读取写入CLOB是字符大型对象,用于存储字符数据,例如文本和XML等。CLOB数据可以通过字符流进行读取写入。 另外,BLOBCLOB在存储和检索时的处理方式也有所不同。BLOB数据可以使用OracleBLOB API进行处理,而CLOB数据可以使用OracleCLOB API进行处理。 ### 回答2: 在Oracle数据库BLOBCLOB都是用于存储大型二进制对象(LOB)的数据类型。但是,它们之间存在一些区别。 首先,BLOB(Binary Large Object)用于存储二进制数据,例如图像、音频和视频文件等。而CLOB(Character Large Object)用于存储字符数据,例如文本文档和HTML页面等。 其次,BLOB在存储时不会进行字符集转换,而CLOB则需要转换为数据库的字符集。这意味着当您插入或更新BLOB数据时,它将保持原样,而CLOB数据可能会因为字符集转换而发生变化。因此,在处理文本数据时应该使用CLOB,而在处理二进制数据时应该使用BLOB。 另外,BLOB可以存储二进制文件,并且是二进制安全的,这意味着它可以存储任意二进制数据。而CLOB只能存储字符数据,因此无法存储二进制文件。 最后,由于BLOBCLOB存储的数据量可能非常大,因此它们的操作方式也有所不同。通常情况下,您不应该使用SELECT *查询BLOBCLOB列,因为它们会返回非常大的数据块并导致性能问题。相反,您应该使用子选择语句或分段读取(chunking)等技术来处理LOB数据。 总之,在Oracle数据库BLOBCLOB是用于存储大型对象的非常有用的数据类型,但是要注意它们之间的差异并适当地使用它们以获得最佳性能和效果。 ### 回答3: Oracle数据库是一种关系型数据库管理系统。它支持许多数据类型以适应不同的场景,其包括BLOBCLOB类型。BLOBCLOB类型是两种不同的数据类型,它们在使用和存储方面有着一些不同之处。 BLOB是二进制大型对象(Binary Large Object)的缩写,存储的是二进制数据,例如图片、音乐、视频等等。它可以存储最大长度达到4GB的二进制数据。BLOB数据可以直接存储在数据库,也可以被存储在文件系统。当需要操作BLOB数据时,可以使用内置的函数来读取写入或更新数据。 CLOB是字符大型对象(Character Large Object)的缩写,存储的是文本数据,例如文章、邮件、代码等等。它可以存储最大长度达到4GB的文本数据。CLOB数据也可以直接存储在数据库,但由于其大小通常比BLOB更大,因此它们也可以被存储在文件,而不是存储在表。当需要处理CLOB数据时,也可以使用内置的函数进行读取写入或更新。 BLOBCLOB在使用方式上也有所不同。BLOB数据更适合用于媒体数据的存储和处理,例如图片、音乐、视频等。而CLOB数据则更适合用于文本数据的存储和处理,例如文章、邮件、代码等。通常来说,CLOBBLOB更易于处理和查询,因为它们是基于文本的数据类型,可以使用文本搜索和其他文本处理功能。 总之,在Oracle数据库BLOBCLOB是两种不同的数据类型,用途和存储方式也不同。BLOB用于存储二进制数据,例如图片、音乐、视频等;而CLOB用于存储文本数据,例如文章、邮件、代码等。了解它们之间的差异可以帮助你选择正确的数据类型,并更好地进行数据库管理和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值