Oracle Multimedia(舊稱 interMedia)提供 ORDDicom、ORDImage 等原生物件型別,讓 DICOM 醫學影像與中繼資料能像關係資料一樣在資料庫中儲存、索引、查詢、處理。本文以完整範例示範:建立醫學影像表、定義 PL/SQL 匯入程序、自動提取 DICOM 標籤至 XML 中繼資料。
CREATE TABLE medical_image_table (
id INTEGER PRIMARY KEY,
dicom ORDSYS.ORDDicom, -- 原始 DICOM 物件
imageThumb ORDSYS.ORDImage, -- 縮圖(JPEG/PNG)
anonDicom ORDSYS.ORDDicom -- 去識別化後 DICOM
) TABLESPACE users;
關鍵點:所有 Multimedia 物件型別定義於 ORDSYS Schema,授權模式為 Oracle Database Enterprise Edition 選項。
任何 DICOM 操作前,必須在 Session 中載入資料模型:
EXEC ORDSYS.ORD_DICOM.setDataModel();
此呼叫將標準 DICOM 資料字典、對應文檔、約束定義載入記憶體,建議在應用啟動或連接池初始化時執行一次。
CREATE OR REPLACE PROCEDURE image_import (
p_dest_id IN NUMBER,
p_filename IN VARCHAR2
) AS
v_dcm ORDSYS.ORDDicom;
BEGIN
-- 1. 刪除同 ID 舊資料(冪等)
DELETE FROM medical_image_table WHERE id = p_dest_id;
-- 2. 插入新列,ORDDicom 以 BFILE 參考外部檔案
INSERT INTO medical_image_table (id, dicom, imageThumb, anonDicom)
VALUES (
p_dest_id,
ORDSYS.ORDDicom('FILE', 'IMAGEDIR', p_filename, 0), -- 來源:Directory 物件 IMAGEDIR 下的檔案
ORDSYS.ORDImage.INIT(), -- 空縮圖物件
ORDSYS.ORDDicom() -- 空去識別化物件
)
RETURNING dicom INTO v_dcm;
-- 3. 將檔案內容載入資料庫(BFILE → BLOB)
v_dcm.import(1); -- 1 = 同步模式
-- 4. 更新含完整 BLOB 的物件
UPDATE medical_image_table SET dicom = v_dcm WHERE id = p_dest_id;
COMMIT;
END;
/
SHOW ERRORS;
'FILE':來源類型為資料庫 Directory 物件下的檔案。'IMAGEDIR':預先建立的 Directory 物件(CREATE OR REPLACE DIRECTORY IMAGEDIR AS '/u01/dicom_in';),且執行匯入的用戶需有 READ 權限。p_filename:DICOM 檔名(如 179.dcm)。0:不自動提取中繼資料(稍後由 import 隱含完成)。BEGIN
ORDSYS.ORD_DICOM.setDataModel();
image_import(1, '179.dcm');
END;
/
COMMIT;
ORDDicom.source.localData (SecureFile BLOB)。ordcmmp.xml 將 DICOM 標籤轉為 XML 文檔,存於 ORDDicom.metadata。若需提取特定私有標籤或調整 XML 結構,可建立自訂 Mapping Document(參考 ordcmmp.xsd),匯入時指定:
v_dcm.setProperties('CUSTOM_MAP.xml'); -- 在 import 前呼叫
DECLARE
v_src ORDSYS.ORDDicom;
v_anon ORDSYS.ORDDicom;
BEGIN
SELECT dicom INTO v_src FROM medical_image_table WHERE id = 1;
v_anon := v_src.makeAnonymous('ANON_MAP.xml'); -- 依規則移除/偽裝患者資訊
UPDATE medical_image_table SET anonDicom = v_anon WHERE id = 1;
COMMIT;
END;
/
-- 縮圖產生
DECLARE
v_src ORDSYS.ORDDicom;
v_thumb ORDSYS.ORDImage;
BEGIN
SELECT dicom, imageThumb INTO v_src, v_thumb FROM medical_image_table WHERE id = 1;
v_src.processCopy('MAXSCALE=128 128 FILEFORMAT=JPEG', v_thumb);
UPDATE medical_image_table SET imageThumb = v_thumb WHERE id = 1;
COMMIT;
END;
/
-- 建立目錄物件
CREATE OR REPLACE DIRECTORY IMAGEDIR AS '/u01/dicom_in';
GRANT READ ON DIRECTORY IMAGEDIR TO app_user;
-- 匯出目錄(下一篇將使用)
CREATE OR REPLACE DIRECTORY EXPORTDIR AS '/u01/dicom_out';
GRANT READ, WRITE ON DIRECTORY EXPORTDIR TO app_user;
Oracle Multimedia 將 DICOM 視為一等公民資料型別,單一 INSERT 即完成檔案載入、中繼資料提取、UID 索引、格式驗證。配合 ORDImage 產生縮圖、makeAnonymous 去識別化,資料庫即可成為 PACS/VNA 的核心儲存與查詢引擎,消除檔案系統管理的碎片化與一致性風險。