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

Oracle BLOB 欄位存取完整實戰:Java JDBC 讀寫大物件

     編輯:Oracle 資料庫基礎

解決 Oracle BLOB 與 Java JDBC 相容性難題

Oracle BLOB (Binary Large Object) 儲存二進位檔案是常見需求,但 JDBC 標準介面與 Oracle 專屬實作常有相容性問題。本文提供完整建表、Java 讀寫範例、關鍵 API 解析與最佳實務,助你穩定處理大物件資料。

建立測試表

DROP TABLE filelist;
CREATE TABLE SYSTEM.FILELIST (
  "FILENAME" VARCHAR2(50) NOT NULL,
  "FILESIZE" NUMBER(20),
  "FILEBODY" BLOB,
  PRIMARY KEY ("FILENAME")
);

核心 Java 讀寫流程

  1. 檔案讀入 byte[] 陣列
  2. INSERT 時用 EMPTY_BLOB() 初始化 BLOB 欄位
  3. 查詢定位 BLOB,取得 oracle.sql.BLOB 物件
  4. 使用 putBytes(pos, bytes[]) 寫入
  5. 讀取時用 getBytes(pos, length) 或串流 API

關鍵程式碼片段

寫入 BLOB

// 1. 插入控制資料並初始化 BLOB
String sql = "INSERT INTO filelist (FileName, FileSize, FileBody) VALUES (?, ?, EMPTY_BLOB())";
OraclePreparedStatement opst = (OraclePreparedStatement) conn.prepareStatement(sql);
opst.setString(1, "Wordtemplate");
opst.setInt(2, fileLength);
opst.executeUpdate();

// 2. 定位 BLOB 進行寫入
sql = "SELECT filebody FROM filelist WHERE filename=? FOR UPDATE";
opst = (OraclePreparedStatement) conn.prepareStatement(sql);
opst.setString(1, "Wordtemplate");
OracleResultSet ors = (OracleResultSet) opst.executeQuery();
if (ors.next()) {
    BLOB blob = ors.getBLOB(1);
    int written = blob.putBytes(1, fileBytes); // 從位置 1 開始寫入
    conn.commit();
}

讀取 BLOB

sql = "SELECT filebody FROM filelist WHERE filename=?";
opst = (OraclePreparedStatement) conn.prepareStatement(sql);
opst.setString(1, "Wordtemplate");
ors = (OracleResultSet) opst.executeQuery();
if (ors.next()) {
    BLOB blob = ors.getBLOB(1);
    byte[] data = blob.getBytes(1, (int) blob.length()); // 一次讀完
    // 或使用串流處理大檔案
    // InputStream is = blob.getBinaryStream();
    // OutputStream os = new FileOutputStream("output.doc");
    // byte[] buf = new byte[4096]; int len;
    // while ((len = is.read(buf)) != -1) os.write(buf, 0, len);
}

關鍵 API 對照

功能位元組陣列 API串流 API (大檔案推薦)
寫入putBytes(long pos, byte[] bytes)getBinaryOutputStream()
讀取getBytes(long pos, int length)getBinaryStream()

避坑指南與最佳實務

  • 必須使用 Oracle 專屬類別:oracle.sql.BLOB, OraclePreparedStatement, OracleResultSet,標準 JDBC 介面常失效。
  • EMPTY_BLOB() 初始化:INSERT 時不可為 NULL,必須用 EMPTY_BLOB() 建立定位器。
  • FOR UPDATE 鎖定:查詢 BLOB 進行寫入時,需加 FOR UPDATE 取得鎖定,否則 putBytes 會拋例外。
  • 大檔案分塊處理:超過記憶體限制時,改用串流 API 分批讀寫,避免 OOM。
  • 提交交易:寫入後必須 conn.commit() 持久化。
  • 資源關閉:確保 ResultSet、Statement、Connection 在 finally 區塊正確關閉。

掌握 Oracle BLOB 專屬 API 與交易控制,能穩定實現檔案資料庫化儲存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved