上一篇示範了將 DICOM 檔案匯入資料庫。實務上同樣需要將資料庫中的影像匯出至檔案系統——提供給 PACS 工作站、燒錄光碟、外部 AI 模型推理、跨院區傳輸等場景。本文示範建立匯出預存程序、執行匯出、驗證檔案完整性。
資料庫進程需對目標目錄擁有作業系統層面的寫入權限:
-- 1. 作業系統層建立目錄並設定權限
mkdir -p /u01/dicom_out
chown oracle:oinstall /u01/dicom_out
chmod 775 /u01/dicom_out
-- 2. 資料庫建立 Directory 物件並授權
CREATE OR REPLACE DIRECTORY EXPORTDIR AS '/u01/dicom_out';
GRANT READ, WRITE ON DIRECTORY EXPORTDIR TO app_user;
CREATE OR REPLACE PROCEDURE dicom_export (
p_source_id IN NUMBER,
p_filename IN VARCHAR2
) AS
v_dcm ORDSYS.ORDDicom;
BEGIN
-- 1. 查詢來源 DICOM 物件
SELECT dicom INTO v_dcm FROM medical_image_table WHERE id = p_source_id;
-- 2. 呼叫 export 方法寫入檔案
-- 參數:'FILE'=檔案類型, 'EXPORTDIR'=Directory 物件, p_filename=輸出檔名
v_dcm.export('FILE', 'EXPORTDIR', p_filename);
END;
/
SHOW ERRORS;
export 會將 ORDDicom.source.localData (BLOB) 完整寫入檔案,保持原始 DICOM 位元流不變。ORDDicom 建構時指定 'FILE' 且未 import,export 會直接複製原始檔案(快速路徑)。BLOB、BFILE、HTTP 等多種目標類型。BEGIN
dicom_export(1, 'dicom_orig.dcm');
END;
/
COMMIT;
ls -lh /u01/dicom_out/dicom_orig.dcm
# 檢查檔案大小、時間戳記
dcmdump /u01/dicom_out/dicom_orig.dcm | head -30
# 或
gdcmconv --info /u01/dicom_out/dicom_orig.dcm
SELECT id,
dbms_lob.getlength(dicom.source.localData) AS db_bytes,
(SELECT file_size FROM v$directory_files WHERE directory_name='EXPORTDIR' AND file_name='dicom_orig.dcm') AS fs_bytes
FROM medical_image_table WHERE id = 1;
BEGIN
FOR rec IN (SELECT id, sop_instance_uid FROM medical_image_table
WHERE study_instance_uid = '1.2.3.4.5.6.7')
LOOP
dicom_export(rec.id, 'EXPORT_' || rec.sop_instance_uid || '.dcm');
END LOOP;
END;
/
COMMIT;
CREATE OR REPLACE PROCEDURE dicom_export_anon (
p_source_id IN NUMBER,
p_filename IN VARCHAR2
) AS
v_dcm ORDSYS.ORDDicom;
BEGIN
SELECT anonDicom INTO v_dcm FROM medical_image_table WHERE id = p_source_id;
v_dcm.export('FILE', 'EXPORTDIR', p_filename);
END;
/
-- 執行
BEGIN dicom_export_anon(1, 'dicom_anon.dcm'); END;
/
CREATE OR REPLACE PROCEDURE thumb_export (
p_source_id IN NUMBER,
p_filename IN VARCHAR2
) AS
v_img ORDSYS.ORDImage;
BEGIN
SELECT imageThumb INTO v_img FROM medical_image_table WHERE id = p_source_id;
v_img.export('FILE', 'EXPORTDIR', p_filename);
END;
/
| 面向 | 建議 |
|---|---|
| 大檔案匯出 | DICOM 可達 GB 級,建議啟用 SecureFile BLOB 压缩/去重,匯出時使用大緩衝區(ORDS 內部自動處理) |
| 並發匯出 | 多 Session 並行匯出不同 ID,避免單一巨大檔案佔用 I/O 頻寬 |
| 稽核追蹤 | 在 export 程序中記錄 INSERT INTO export_log VALUES (SYSDATE, USER, p_source_id, p_filename) |
| 權限最小化 | 僅對特定匯出目錄授予 WRITE,嚴禁授予預設 DATA_PUMP_DIR 等敏感目錄 |
Oracle Multimedia 的 export 方法提供單一行呼叫、位元級完整、支援多種目標類型的匯出能力。配合 Directory 物件權限模型,資料庫即可安全、可審計地作為 DICOM 檔案的權威來源與分發中心,支撐 PACS 存檔、AI 推理輸入、跨機構影像交換等多元場景。