首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Java 操作 Oracle CLOB 完整實戰:插入、讀取、流式處理

     編輯:Oracle 資料庫基礎

CLOB(Character Large Object)用於存儲超長文本(>4000 字符)。本文提供完整的 JDBC 操作 CLOB 代碼,涵蓋連接構建、PreparedStatement 綁定、流式寫入/讀取、資源管理,可直接用於生產環境。

一、數據庫表結構

CREATE TABLE article_add (
  id          VARCHAR2(32) PRIMARY KEY,
  content     CLOB,
  modify_date DATE DEFAULT SYSDATE
);

二、核心 Java 實現

package com.example.lob;

import java.io.*;
import java.sql.*;
import oracle.sql.CLOB;

public class ClobDemo {
  // 連接配置
  private static final String URL  = "jdbc:oracle:thin:@218.56.105.30:1521:myora";
  private static final String USER = "skgl";
  private static final String PWD  = "skgl";

  public void insertClob() {
    String sql = "INSERT INTO article_add (id, content, modify_date) VALUES ('7', ?, SYSDATE)";
    String bigText = "這是要插入到 CLOB 裡面的超長文本內容...";  // 可為超大字符串

    try (Connection conn = DriverManager.getConnection(URL, USER, PWD);
         PreparedStatement stmt = conn.prepareStatement(sql)) {

      // 方式 1:直接 setString(適用於中小文本,驅動自動轉 CLOB)
      stmt.setString(1, bigText);
      stmt.executeUpdate();

      // 方式 2:流式寫入(超大文本,避免內存 OOM)
      /*
      CLOB clob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);
      try (Writer writer = clob.getCharacterOutputStream()) {
        writer.write(bigText);  // 或分塊讀取文件流寫入
      }
      stmt.setClob(1, clob);
      stmt.executeUpdate();
      clob.freeTemporary();
      */

    } catch (SQLException e) {
      e.printStackTrace();
    }
  }

  public void readClob() {
    String sql = "SELECT content FROM article_add WHERE id = '7'";
    try (Connection conn = DriverManager.getConnection(URL, USER, PWD);
         PreparedStatement stmt = conn.prepareStatement(sql);
         ResultSet rs = stmt.executeQuery()) {

      if (rs.next()) {
        // 方式 1:getString(小文本)
        String text = rs.getString("content");
        System.out.println(text);

        // 方式 2:流式讀取(大文本)
        /*
        Clob clob = rs.getClob("content");
        try (Reader reader = clob.getCharacterStream();
             BufferedReader br = new BufferedReader(reader)) {
          String line;
          while ((line = br.readLine()) != null) {
            System.out.println(line);
          }
        }
        */
      }
    } catch (SQLException | IOException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    new ClobDemo().insertClob();
    new ClobDemo().readClob();
  }
}

三、關鍵技術點

場景推薦 API說明
中小文本(< 1MB)setString / getString驅動自動處理 CLOB 轉換,代碼最簡潔
大文本/文件導入CLOB.createTemporary + getCharacterOutputStream流式寫入,常駐內存小,支持分塊
大文本讀取getClob + getCharacterStream流式讀取,避免一次性載入內存
二進制大對象BLOB + getBinaryStream圖片/文件存儲,同理

四、連接串解析

jdbc:oracle:thin:@218.56.105.30:1521:myora
  │           │         │           │    │
  │           │         │           │    └─ Service Name (或 SID)
  │           │         │           └─ Port (默認 1521)
  │           │         └─ Host IP
  │           └─ Thin 驅動(純 Java,無需 Client)
  └─ JDBC 協議前綴

五、注意事項

  • Oracle 12c+ 支持 setClob(1, reader, length) 更簡潔。
  • 臨時 CLOB 用完必須 freeTemporary(),否則臨時段洩漏。
  • 字符集一致性:DB、JVM、應用編碼三方統一(建議 AL32UTF8)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved