Oracle 提供四種 LOB 型別:BLOB (二進位)、CLOB (字元)、NCLOB (國家字元集)、BFILE (外部二進位檔案)。最大長度 4GB (受限於資料庫區塊大小)。本文整理 DBMS_LOB 套件操作、動態 PL/SQL 處理 CLOB 技巧、BFILE 唯讀特性等實戰內容。
| 型別 | 全名 | 儲存位置 | 最大長度 | 讀/寫 |
|---|---|---|---|---|
| BLOB | Binary Large Object | 資料庫內部 | 4GB | 讀/寫 |
| CLOB | Character Large Object | 資料庫內部 | 4GB | 讀/寫 |
| NCLOB | National Character LOB | 資料庫內部 | 4GB | 讀/寫 |
| BFILE | Binary File | 作業系統檔案系統 (外部) | OS 限制 | 唯讀 |
常用子程式:
READ(lob_loc, amount, offset, buffer) - 讀取WRITE(lob_loc, amount, offset, buffer) - 寫入 (內部 LOB)APPEND(dest_lob, src_lob) - 附加ERASE(lob_loc, amount, offset) - 擦除COPY(dest_lob, src_lob, amount, dest_offset, src_offset) - 複製GETLENGTH(lob_loc) - 取得長度SUBSTR(lob_loc, amount, offset) - 截取子串FILEOPEN/FILECLOSE/FILEEXISTS - BFILE 專用場景:通用程序需針對不同表的 CLOB 欄位進行分段寫入 (超過 32767 字元)。
CREATE OR REPLACE PROCEDURE UPDATE_CLOB (
P_TABLE_NAME IN VARCHAR2, -- 目標表名
P_PK_NAME IN VARCHAR2, -- 主鍵欄位名
P_CLOB_NAME IN VARCHAR2, -- CLOB 欄位名
P_PK_VAL IN NUMBER, -- 主鍵值
P_POS IN NUMBER, -- 起始位置 (以 32766 字元為區塊)
P_CLOB_DATA IN VARCHAR2 -- 要寫入的字串 (≤32767)
) IS
V_LOB_LOC CLOB;
V_AMT BINARY_INTEGER;
V_POS BINARY_INTEGER;
V_QUERY_STR VARCHAR2(1000);
BEGIN
-- 計算實際寫入位置 (每區塊 32766 字元)
V_POS := P_POS * 32766 + 1;
V_AMT := LENGTH(P_CLOB_DATA);
-- 動態查詢鎖定該列 FOR UPDATE
V_QUERY_STR := 'SELECT ' || P_CLOB_NAME || ' FROM ' || P_TABLE_NAME ||
' WHERE ' || P_PK_NAME || ' = :pk FOR UPDATE';
EXECUTE IMMEDIATE V_QUERY_STR INTO V_LOB_LOC USING P_PK_VAL;
-- 寫入 CLOB (需先初始化為 EMPTY_CLOB())
DBMS_LOB.WRITE(V_LOB_LOC, V_AMT, V_POS, P_CLOB_DATA);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END UPDATE_CLOB;
/
INSERT 或 UPDATE 將 CLOB 欄位設為 EMPTY_CLOB()UPDATE_CLOB 分段寫入 (每段 ≤ 32767 字元)P_POSUPDATE SET CLOB_COL = '...'),無法操作片段DBMS_LOB 可隨機存取片段,效能佳
DECLARE
V_BFILE BFILE := BFILENAME('MY_DIR_ALIAS', 'large_video.mp4');
V_BLOB BLOB;
BEGIN
-- 建立目錄物件 (需 DBA)
-- CREATE OR REPLACE DIRECTORY MY_DIR_ALIAS AS '/data/media';
DBMS_LOB.FILEOPEN(V_BFILE, DBMS_LOB.FILE_READONLY);
-- 讀取邏輯...
DBMS_LOB.FILECLOSE(V_BFILE);
END;
/
STORE AS SECUREFILE 提供壓縮、去重、加密、緩存優化。CACHE / NOCACHE 設定:頻繁讀取的 LOB 設 CACHE,歸檔型設 NOCACHE。VARCHAR2 32767 限制。UPDATE SET LOB_COL = EMPTY_CLOB() 或 DBMS_LOB.FREETEMPORARY。