| 維度 | 方案一:PL/SQL + DBMS_LOB | 方案二:SQL*Loader (LOBFILE) |
|---|---|---|
| 適用場景 | 單文件/少量文件、應用層動態上傳、需事務綁定 | 海量文件初始化遷移、定期批量載入、離線 ETL | 性能 | 單文件較慢,上下文切換開銷大 | 直接路徑載入,極快,繞過 REDO/UNDO(可選) | 事務性 | 完全支持(COMMIT/ROLLBACK) | 直接路徑不可回滾,常規路徑支持 | 維護性 | 代碼可控,易集成業務邏輯 | 需準備控制文件、數據文件、文件系統佈局 |
-- 1. 授權創建目錄對象權限
GRANT CREATE ANY DIRECTORY TO app_user;
GRANT CREATE ANY LIBRARY TO app_user; -- 部分版本需要
-- 2. 創建目錄對象映射 OS 路徑
CREATE OR REPLACE DIRECTORY photo_dir AS 'E:\photo';
-- 3. 目標表
CREATE TABLE photos (blob_column BLOB);
DECLARE
l_blob BLOB;
l_bfile BFILE := BFILENAME('PHOTO_DIR', 'flower.jpg');
BEGIN
-- 1. 插入空 BLOB 並獲取 LOB 定位器
INSERT INTO photos VALUES (EMPTY_BLOB())
RETURNING blob_column INTO l_blob;
-- 2. 打開 BFILE
DBMS_LOB.FILEOPEN(l_bfile, DBMS_LOB.FILE_READONLY);
-- 3. 從文件載入到 BLOB(自動處理分塊)
DBMS_LOB.LOADFROMFILE(
dest_lob => l_blob,
src_lob => l_bfile,
amount => DBMS_LOB.GETLENGTH(l_bfile) -- 全量
);
-- 4. 關閉 BFILE
DBMS_LOB.FILECLOSE(l_bfile);
COMMIT;
END;
/
-- 驗證
SELECT DBMS_LOB.GETLENGTH(blob_column) FROM photos; -- 1212681
LOAD DATA
INFILE 'sample.dat'
APPEND
INTO TABLE test
FIELDS TERMINATED BY ','
(
product_id INTEGER EXTERNAL(6),
file_name FILLER CHAR(30), -- 不載入表列,僅供 LOBFILE 引用
ad_graphic LOBFILE(file_name) TERMINATED BY EOF
)
1,1.jpg,
2,2.jpg,
3,3.jpg,
4,4.jpg,
5,5.jpg,
sqlldr userid=app_user/pwd control=test.ctl log=test.log direct=true
CREATE TABLE photos (
id NUMBER PRIMARY KEY,
img BLOB
) LOB (img) STORE AS SECUREFILE (
ENABLE STORAGE IN ROW, -- 小 LOB 存行內
COMPRESS HIGH, -- 透明壓縮
DEDUPLICATE, -- 重複刪除
ENCRYPT USING 'AES256' -- 透明加密
);
SecureFiles 同時提供**更高讀寫性能、壓縮、去重、加密**,是現代 Oracle 存儲非結構化數據的首選。