Oracle DICOM
Version 19c

General Information
Library Note Morgan's Library Page Header
Which has the higher priority in your organization: Deploying a new database or securing the ones you already have? Looking for a website, and resources, dedicated solely to securing Oracle databases? Check out DBSecWorx.
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 23c

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