在Oracle数据库中,大范例字段(也称为大对象或LOB,Large Object)用于存储大量的数据,如文本、图像、视频等。Oracle 提供了几种差异的大范例字段,主要包括:
- CLOB(Character Large Object):
- 存储大量的字符数据,可以存储多达4 GB的文本。
- 适用于需要存储大段文本信息的场景,如文档、日志记录等。
- BLOB(Binary Large Object):
- 存储大量的二进制数据,可以存储多达4 GB的二进制信息。
- 常用于存储图片、音频、视频等媒体文件。
- NCLOB(National Character Large Object):
- 雷同于CLOB,但用于存储多字节字符集(如Unicode字符集)的数据。
- 适用于需要存储多国语言文本的应用。
- BFILE(Binary File):
- 存储外部文件的引用,而不是将文件内容直接存储在数据库中。
- BFILE可以存储在数据库外部文件系统中,数据库只存储其路径和文件名。
基于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();
- }
- }
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |