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

Oracle BLOB/LOB 完整實戰:型別選擇、寫入流程、目錄物件與 SecureFiles

     編輯:Oracle 資料庫基礎

LOB 型別四大家族

型別內容儲存位置字元集轉換典型用途
CLOB單位元組字元資料庫內部是大型文本、JSON、XML、日誌
NCLOB固定寬多位元組字元資料庫內部是多語言文本(NLS_NCHAR_CHARACTERSET)
BLOB無結構二進制資料庫內部否圖片、PDF、Office、影音、加密資料
BFILE唯讀外部檔案**OS 檔案系統**否靜態媒體檔案、僅讀參考資料

**最大容量**:11gR2 前 4 GB,12c+ 128 TB(取決於區塊大小)。

核心觀念:LOB Locator(定位器)

  • 資料表欄位儲存的**不是資料本身**,而是 **LOB Locator**(指向 LOB Segment 的指標)。
  • 操作 LOB 必須先取得 Locator,再透過 DBMS_LOB / OCI / JDBC 流式 API 讀寫。

寫入 BLOB 三步驟(關鍵:EMPTY_BLOB → SELECT FOR UPDATE → 寫入)


-- 1. 插入空 LOB 產生 Locator
INSERT INTO t_lob (no, photo) VALUES (1, EMPTY_BLOB())
RETURNING photo INTO :lob_loc;  -- PL/SQL 變數接收 Locator

-- 2. 寫入資料(範例:DBMS_LOB.WRITEAPPEND)
DECLARE
  l_blob BLOB;
  l_raw  RAW(32767);
BEGIN
  SELECT photo INTO l_blob FROM t_lob WHERE no = 1 FOR UPDATE;
  -- 讀取檔案至 l_raw (UTL_FILE / BFILE / JAVA / OCI)
  DBMS_LOB.WRITEAPPEND(l_blob, UTL_RAW.LENGTH(l_raw), l_raw);
  COMMIT;
END;
/

關鍵點:

  1. EMPTY_BLOB() 初始化 Locator,**不佔用儲存空間**。
  2. RETURNING INTO 或 SELECT ... FOR UPDATE 取得可寫入的 Locator。
  3. 必須在**同一交易**中完成寫入並 COMMIT。

建表範例:指定 LOB Segment 儲存屬性


CREATE TABLE t_lob (
  no     NUMBER(4),
  name   VARCHAR2(10),
  resume CLOB,
  photo  BLOB,
  record BFILE
)
LOB (resume, photo) STORE AS (
  TABLESPACE ts_lob
  CHUNK 8192              -- 讀寫單位,建議 8K/16K 對齊
  PCTVERSION 10           -- 旧版本保留空間%
  RETENTION               -- 11g+ 自動保留(Undo 管理)
  CACHE                   -- 緩衝區快取 LOB
  LOGGING                 -- 產生 Redo
  STORAGE (INITIAL 1M NEXT 1M)
);

BFILE 操作:目錄物件與權限


-- 1. 建立目錄物件(需 CREATE ANY DIRECTORY 權限)
CREATE OR REPLACE DIRECTORY my_images AS '/u01/app/oracle/images';
-- Windows 網路路徑:'\\192.168.1.100\share\images'

-- 2. 授權
GRANT READ ON DIRECTORY my_images TO app_user;

-- 3. 插入 BFILE
INSERT INTO t_lob (no, record)
VALUES (2, BFILENAME('MY_IMAGES', 'photo.jpg'));
-- 目錄名**必須大寫**(資料字典存大寫)

BFILENAME 僅記錄路徑,**不驗證檔案存在**。實際讀取時才檢查。

SecureFiles (11g+):新一代 LOB 儲存引擎


LOB (photo) STORE AS SECUREFILE (
  TABLESPACE ts_lob
  COMPRESS HIGH           -- 壓縮:LOW/MEDIUM/HIGH
  DEDUPLICATE             -- 重複資料刪除
  ENCRYPT USING 'AES256'  -- 透明加密
  CACHE
);
  • 效能大幅優化(寫入吞吐提升 10x+)。
  • 功能豐富:壓縮、去重、加密、片段重組。
  • **新建 LOB 欄位強烈建議指定 SECUREFILE**。

常見操作速查

操作套件/語法
讀取片段DBMS_LOB.READ(lob, amount, offset, buffer)
寫入/附加DBMS_LOB.WRITE/WRITEAPPEND
複製DBMS_LOB.COPY(dest, src, amount, dest_offset, src_offset)
比較DBMS_LOB.COMPARE(lob1, lob2, amount, offset1, offset2)
取得長度DBMS_LOB.GETLENGTH(lob)
修剪DBMS_LOB.TRIM(lob, new_len)
轉檔案DBMS_LOB.FILECLOSE/FILEOPEN/LOADFROMFILE

效能與最佳實踐

  1. CHUNK 大小:設為 8K/16K(資料庫區塊大小整數倍),減少 I/O。
  2. CACHE vs NOCACHE:頻繁讀寫用 CACHE,歸檔/一次寫入用 NOCACHE。
  3. 避免 SELECT *:查詢含 LOB 表時**明確列出欄位**,防止 Client 驅動程式預先抓取巨大 LOB。
  4. 大量載入:SQL*Loader / Data Pump / DBMS_LOB.LOADCLOBFROMFILE 直載,避開 SQL 引擎開銷。
  5. 刪除 LOB:UPDATE t SET lob_col = EMPTY_BLOB() 或 NULL,空間由背景程序回收(或 DBMS_SPACE.SPACE_USAGE 監控)。

結語

LOB 處理核心在於 **Locator 機制** 與 **串流式讀寫**。掌握 EMPTY_BLOB() → FOR UPDATE → DBMS_LOB 標準流程、善用 SECUREFILE 壓縮去重加密、正確配置 CHUNK/CACHE/STORAGE,即能高效管理 GB/TB 級非結構化資料,避免 ORA-01555、ORA-22990 等常見錯誤。

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