Oracle DICOM
Version 19c

General Information
Library Note Morgan's Library Page Header
The best Oracle News for FY2026

Oracle Database 26ai will be available on generic Linux platforms in January and soon on AIX and Windows
Dependencies conn sys@pdbdev as sysdba

SELECT object_type, COUNT(*)
FROM cdb_objects_ae
WHERE UPPER(object_name) LIKE '%DICOM%'
GROUP BY object_type
ORDER BY 1;

OBJECT_TYPE    COUNT(*)
-------------- --------
PACKAGE               5
PACKAGE BODY          5
SYNONYM               3
TABLE                 2
TYPE                  7
TYPE BODY             1


SELECT DISTINCT owner, object_name
FROM cdb_objects_ae
WHERE UPPER(object_name) LIKE '%DICOM%'
AND object_type = 'PACKAGE'
ORDER BY 2;

OWNER   OBJECT_NAME
-----   -------------------
ORDSYS  ORD_DICOM
ORDSYS  ORD_DICOM_ADMIN
ORDSYS  ORD_DICOM_ADMIN_PRV
ORDSYS  ORD_DICOM_CT
ORDSYS  ORD_DICOM_PKG
First Available 11.1.0.6
Source {$ORACLE_HOME}/ord/im/admin/ordcpksp.sql
{$ORACLE_HOME}/ord/im/admin/ordcrpsp.sql
{$ORACLE_HOME}/ord/im/admin/imxreg.sql
Storage Structure DICOM_IMAGE
  ORD_DICOM_HEADER
    VERSION
    DICOM_STANDARD_VERSION
    DICOM_STANDARD_RELEASE
  FILE_META_HEADER
    MEDIA_STORAGE_SOP_CLASS_UID
    MEDIA_STORAGE_SOP_INSTANCE_UID
    TRANSFER_SYNTAX_UID
    IMPLEMENTATION_CLASS_UID
    IMPLEMENTATION_VERSION_NAME
    SOURCE_APPLICATION_ENTITY_TITLE
  PATIENT
    NAME
    ID
    BIRTH_DATE
    SEX
  GENERAL_STUDY
    INSTANCE_UID
    DATE
    TIME
    REFERING_PHYSICIANS_NAME
    ID
    ACCESSION_NUMBER
    DESCRIPTION?
  PATIENT_STUDY?
    ADMITTING_DIAGNOSES_DESCRIPTION
    ADMITTING_DIAGNOSES_CODE_SEQUENCE
  GENERAL_SERIES
    MODALITY
 INSTANCE_UID
    DATE
    TIME
    PERFORMING_PHYSICIANS_NAME
    BODY_PART_EXAMINED
    PATIENT_POSITION
    PERFORMED_PROCEDURE_STEP_ID
    PERFORMED_PROCEDURE_STEP_START_DATE
    PERFORMED_PROCEDURE_STEP_START_TIME
    PERFORMED_PROCEDURE_STEP_DESCRIPTION
    PERFORMED_PROTOCOL_CODE_SEQUENCE
  GENERAL_EQUIPMENT?
    MANUFACTURER
  GENERAL_IMAGE?
    INSTANCE_NUMBER
    ACQUISITION_NUMBER
    ACQUISITION_DATE
    ACQUISITION_TIME
    ACQUISITION_DATETIME
    PATIENT_ORIENTATION
    FRAME_LATERALITY
    ANATOMIC_REGION
  IMAGE_PIXEL?
    SAMPLES_PER_PIXEL
    PHOTOMETRIC_INTERPRETATION
    ROWS
    COLUMNS
    BIT_ALLOCATED
    BIT_STORED
    HIGH_BIT
    PIXEL_REPRESENTATION
    PLANAR_CONFIGURATION
    PIXEL_ASPECT_RATIO
    ''
  SOP_COMMON
    CLASS_UID
   INSTANCE_UID
   SPECIFIC_CHARACTER_SET
 
DICOM Demo
Sample DICOM Image Files Download free DICOM images [Click Here]

Download a free DICOM image viewer [Click Here]

-- if these links are broken use google to find DICOM + "DCM" and you'll find lots of other sources
Create Directory Object conn sys@pdbdev as sysdba

CREATE OR REPLACE DIRECTORY ctemp AS 'c:\temp';

GRANT read ON DIRECTORY ctemp TO uwclass;


-- place a dicom image named image1.dcm into the directory pointed to by the Oracle Directory object CTEMP
Create table to hold DICOM images conn uwclass/uwclass@pdbdev

CREATE TABLE medicalImages(
image_id    NUMBER,
description VARCHAR2(40),
metadata    XMLType,
image       ORDSYS.ORDIMAGE,
thumb       ORDSYS.ORDIMAGE)
LOB (image.source.localdata) STORE AS (chunk 32K)
-- store images with 32K chunk
LOB (thumb.source.localdata) STORE AS (chunk 16K)
-- but the thumbnails with only 16K
-- bind the XMLType columns to the multiMedia metadata columns

XMLType column metadata
XMLSCHEMA "https://xmlns.oracle.com/ord/meta/dicomImage"
ELEMENT "DICOM_IMAGE";

ALTER TABLE medicalimages
ADD CONSTRAINT pk_medicalimages
PRIMARY KEY(image_id)
USING INDEX;

desc medicalImages

set describe depth all linenum on indent on

desc medicalImages

set describe depth 1

SELECT object_name, object_type
FROM user_objects
WHERE created > SYSDATE-10/1440
ORDER BY 1,2;

desc user_lobs

SELECT table_name, segment_name, index_name, chunk, in_row
FROM user_lobs;

SELECT index_name, index_type, table_type
FROM user_indexes
WHERE table_name = 'MEDICALIMAGES'
ORDER BY 1;

-- explore what ORDDICOM is
conn sys@pdbdev as sysdba

SELECT object_type
FROM dba_objects
WHERE object_name = 'ORDDICOM';

OBJECT_TYPE
-------------------------
SYNONYM
TYPE
TYPE BODY


SELECT DISTINCT object_name
FROM dba_arguments
WHERE package_name = 'ORDDICOM'
ORDER BY 1;

OBJECT_NAME
------------------------------
EXPORT
EXTRACTMETADATA
GETATTRIBUTEBYNAME
GETATTRIBUTEBYTAG
GETCONTENT
GETCONTENTLENGTH
GETSERIESINSTANCEUID
GETSOPCLASSUID
GETSOPINSTANCEUID
GETSOURCEINFORMATION
GETSOURCELOCATION
GETSOURCENAME
GETSOURCETYPE
GETSTUDYINSTANCEUID
IMPORT
ISANONYMOUS
ISCONFORMANCEVALID
ISLOCAL
MAKEANONYMOUS
ORDDICOM
PROCESSCOPY
SETPROPERTIES
WRITEMETADATA
Load DICOM image file conn uwclass/uwclass@pdbdev

INSERT INTO medicalimages
(image_id, description, metadata, image)
VALUES
(1, 'TEST',  NULL, ordsys.ordimage.init());
                   *
ERROR at line 4:
ORA-06598: insufficient INHERIT PRIVILEGES privilege
ORA-06512: at "ORDSYS.ORDIMAGE", line 25


conn sys@pdbdev as sysdba

GRANT inherit privileges ON USER ordsys TO uwclass;
GRANT inherit any privilege to uwclass;

Grant succeeded.

GRANT execute ON ordsys.ordimage TO uwclass;

Grant succeeded.

conn uwclass/uwclass@pdbdev

INSERT INTO uwclass.medicalimages
(image_id, description, metadata, image)
VALUES
(1, 'TEST',  NULL, ordsys.ordimage.init());

SELECT *
FROM medicalimages;

SELECT image_id, description
FROM medicalimages;

set serveroutput on

DECLARE
 obj1 ordsys.ordimage;
BEGIN
  SELECT image
  INTO obj1
  FROM medicalImages
  WHERE image_id = 1
  FOR UPDATE;

  obj1.setSource('FILE', 'CTEMP', 'image1.dcm');

  dbms_output.put_line(obj1.getSource || ' has been loaded');

  UPDATE medicalImages
  SET image=obj1
  WHERE image_id=1;

  COMMIT;
END;
/
Create metadata extract procedure CREATE OR REPLACE PROCEDURE extractDicomMetadata(inID IN INTEGER) AUTHID DEFINER IS
 local_image    ORDSYS.ORDIMAGE;
 local_id       INTEGER;
 dicom_metadata XMLType := NULL;
BEGIN
  SELECT image
  INTO local_image
  FROM medicalImages
  WHERE image_id = inID;

  -- extract DICOM metadata
  dicom_metadata := local_image.getDicomMetadata('imageGeneral');
  IF (dicom_metadata IS NULL) THEN
    dbms_output.put_line('metadata is NULL');
  ELSE
    UPDATE medicalImages
    SET metadata = dicom_metadata
    WHERE image_id = inID;
  END IF;

  -- print the namespace of the XML document containing the DICOM metadata just extracted
  dbms_output.put_line('namespace: ' || dicom_metadata.getNamespace());
END extractDicomMetadata;
/

-- this may take a ~60 seconds the first time on a Windows machine
exec extractDicomMetadata(1);
View metadata SELECT DISTINCT package_name, object_name
FROM all_arguments
WHERE package_name LIKE '%DICOM%'
ORDER BY 1;

set long 1000000

SELECT metadata FROM medicalimages;

Related Topics
DBMS_LOB
Directories
Multimedia Audio
Multimedia Image
Multimedia Video
Packages
What's New In 21c
What's New In 26ai

Morgan's Library Page Footer
This site is maintained by Daniel Morgan. Last Updated: This site is protected by copyright and trademark laws under U.S. and International law. © 1998-2026 Daniel A. Morgan All Rights Reserved