| 型別 | 內容 | 儲存位置 | 字元集轉換 | 典型用途 |
|---|---|---|---|---|
| CLOB | 單位元組字元 | 資料庫內部 | 是 | 大型文本、JSON、XML、日誌 |
| NCLOB | 固定寬多位元組字元 | 資料庫內部 | 是 | 多語言文本(NLS_NCHAR_CHARACTERSET) |
| BLOB | 無結構二進制 | 資料庫內部 | 否 | 圖片、PDF、Office、影音、加密資料 |
| BFILE | 唯讀外部檔案 | **OS 檔案系統** | 否 | 靜態媒體檔案、僅讀參考資料 |
**最大容量**:11gR2 前 4 GB,12c+ 128 TB(取決於區塊大小)。
DBMS_LOB / OCI / JDBC 流式 API 讀寫。
-- 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;
/
關鍵點:
EMPTY_BLOB() 初始化 Locator,**不佔用儲存空間**。RETURNING INTO 或 SELECT ... FOR UPDATE 取得可寫入的 Locator。COMMIT。
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)
);
-- 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 僅記錄路徑,**不驗證檔案存在**。實際讀取時才檢查。
LOB (photo) STORE AS SECUREFILE (
TABLESPACE ts_lob
COMPRESS HIGH -- 壓縮:LOW/MEDIUM/HIGH
DEDUPLICATE -- 重複資料刪除
ENCRYPT USING 'AES256' -- 透明加密
CACHE
);
| 操作 | 套件/語法 |
|---|---|
| 讀取片段 | 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 |
CACHE,歸檔/一次寫入用 NOCACHE。SQL*Loader / Data Pump / DBMS_LOB.LOADCLOBFROMFILE 直載,避開 SQL 引擎開銷。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 等常見錯誤。