IT评测·应用市场-qidao123.com

标题: Oracle中BLOB、CLOB的读取和写入 [打印本页]

作者: 梦见你的名字    时间: 2024-11-29 08:23
标题: Oracle中BLOB、CLOB的读取和写入
在Oracle数据库中,大范例字段(也称为大对象或LOB,Large Object)用于存储大量的数据,如文本、图像、视频等。Oracle 提供了几种差异的大范例字段,主要包括:
基于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 数据并转换为字符串 (UTL_RAW.CAST_TO_VARCHAR2)

BLOB数据通常是二进制的,如果需要将其转换为字符串,可以使用SQL中的UTL_RAW.CAST_TO_VARCHAR2函数,将其转换为VARCHAR2范例(留意BLOB巨细不能超过VARCHAR2的限定[2000]):
  1. SELECT UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(blob_column, 4000, 1))
  2. FROM my_table
  3. WHERE id = 1;
复制代码
这里dbms_lob.substr用于提取BLOB中的数据,最大可提取4000字节。
也可以先使用dbms_lob.substr(blob_column) 来判断BLOB范例字段的数据长度,如果不超过 2000,可以直接使用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中,通过PreparedStatement举行插入,通过ResultSet举行读取。
1. Java 中插入 CLOB 和 BLOB 数据

插入 CLOB 数据

使用Java的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的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. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4