5 DICOMアプリケーション開発

この章では、Oracle Multimedia DICOMを使用してアプリケーションを開発する方法について説明します。

注:

DICOMのOracle Multimediaサポートは、Oracle Database 12cリリース2 (12.2)では非推奨になりました。将来のリリースではサポートされなくなる可能性があります。できるだけ早く、非推奨となった機能の使用を停止することをお薦めします。

Oracle Multimedia DICOMでは、次のアプリケーション・プログラミング・インタフェース(API)を使用してOracle Databaseのサポートを提供します。

  • DICOM PL/SQL API

  • ORDDicomオブジェクトAPI

  • DICOMデータ・モデル・ユーティリティAPI

これらのインタフェースを使用すると、DICOMコンテンツに対してデータベースへのアップロード、データベースからの取得および操作を実行するアプリケーションを短期間で開発できます。

この章には、DICOMコンテンツのデータベースへのインポート、DICOMメタデータに基づくSQL問合せの書込み、基本的な画像処理の実行、ORDDicomオブジェクトの匿名コピーの作成、およびDICOMコンテンツのユーザー定義制約ルールへの準拠の確認について、それぞれの方法を示す例が含まれています。一部の例は、チュートリアル「Oracle Database 12cでのDICOM形式データの管理」から抜粋して、このマニュアルに合わせて改変しています。このチュートリアルの箇所については、「DICOMサンプル・アプリケーション」を参照してください。

この章では、次の内容を説明します。

関連項目:

その他の例や記事などについては、Oracle Technology Network Webサイトの「Oracle Multimedia」

5.1 環境設定

この章の例では、次の4つの列を含むmedical_image_table表を使用しています。

  • id: 整数の識別子

  • dicom: ORDSYS.ORDDicomオブジェクト

  • imageThumb: ORDSYS.ORDImageオブジェクト

  • anonDicom: 別のORDSYS.ORDDicomオブジェクト

この章に記載している例を実行する前に、ディレクトリ・オブジェクトを作成する特権を持つユーザーに接続した状態で次の文を発行する必要があります。ここでc:\mydir\workは、ユーザーscottがDICOMファイルを検索できるディレクトリです。

CREATE OR REPLACE DIRECTORY FILE_DIR as 'c:\mydir\work';
GRANT READ ON DIRECTORY FILE_DIR TO scott;

DICOMファイルに別のディレクトリを使用するには、ファイルを格納するディレクトリの指定でc:\mydir\workを置き換えてください。

注:

オラクル社が提供するすべてのOracle Multimediaオブジェクトおよびプロシージャは、ORDSYSスキーマで定義されています。

5.2 ORDDicom列を含む表の作成

この項では、DICOMコンテンツを格納するための、ORDDicom列を含む表の作成方法を示します。

例5-1に示すコード・セグメントでは、iddicomimageThumbおよびanonDicomの4つの列を含むmedical_image_table表が作成されます。

例5-1では、メディア・コンテンツにSecureFiles LOB記憶域を使用しています。Oracle SecureFilesは、再設計されたバイナリ・ラージ・オブジェクト(BLOB)で、パフォーマンスの向上、およびOracle Databaseのコンテンツ管理機能の強化を図ります。

関連項目:

例5-1 DICOMコンテンツの表の作成

create table medical_image_table
             (id          integer primary key,
              dicom       ordsys.orddicom,
              imageThumb  ordsys.ordimage,
              anonDicom   ordsys.orddicom)
              --
              -- metadata extraction expands the ORDDicom object, allow room
              pctfree 60
              --
              -- Use SecureFiles LOBS for binary content
              -- 
              lob(dicom.source.localdata) store as SecureFile
                 (nocache filesystem_like_logging),
              lob(imageThumb.source.localdata) store as SecureFile
                 (nocache filesystem_like_logging),
              lob(anonDicom.source.localdata) store as SecureFile
                 (nocache filesystem_like_logging),
              --
              -- disable in row storage for the extension
              -- so that it does not consume page space
              -- it is usually < 4k in size
              --
              lob(dicom.extension) store as SecureFile
                 ( nocache disable storage in row ),
              lob(anonDicom.extension) store as SecureFile
                 ( nocache disable storage in row ),
              --
              -- store the metadata as a CLOB,
              -- disable storage in row
              --
              xmltype dicom.metadata store as SecureFile clob
                 ( nocache disable storage in row )
              xmltype anonDicom.metadata store as SecureFile clob
                 ( nocache disable storage in row )
;

5.3 SQL*Loaderユーティリティを使用したDICOMコンテンツのロード

この項では、SQL*Loaderユーティリティを使用して、Oracle Databaseの既存の表にDICOMコンテンツをロードする方法を示します。SQL*Loaderは、外部ファイルのデータをOracle Databaseの表にロードするための高パフォーマンスのユーティリティです。外部データは、Oracle Databaseのサーバーを実行しているシステムとは異なるクライアント・システムからネットワークを経由してロードできます。データは、データベース・サーバーと同じローカル・システムにロードすることもできます。

典型的なSQL*Loaderセッションは、制御ファイルと1つ以上のデータファイルを入力として受け入れます。制御ファイルは、データをデータベースにロードする方法を定義します。SQL*Loaderセッションの出力先は、Oracle Database (データがロードされます)とログ・ファイルであり、廃棄ファイルに出力される場合もあります。

例5-2に、例5-1で作成したmedical_image_table表にDICOMデータをロードするための制御ファイルを示します。制御ファイルには、制御ファイルの最後でsample1.dcmおよびsample2.dcmとして指定された入力データを、medical_image_table表の列にマップするためのディレクティブが含まれます。id列とdicom列のみに、外部から供給されたデータがロードされます。imageThumb列とanonDicom列は、制御ファイルで指定された定数とデフォルト値を使用して初期化されます。

SQL*Loaderユーティリティを起動する前に、dicom列にロードするLOBデータのロギングを一時的に無効化できます。ロギングが無効な場合、データはデータベース表のみに書き込まれ、REDOログには書き込まれません。ロギングを無効化すると、実行されるI/Oの量が半分に削減されるため、DICOMデータのロードに必要な時間を短縮できます。

dicom列のDICOMコンテンツのロギングを無効にするには、次のSQLコマンドを使用します。

 alter table medical_image_table modify lob(dicom.source.localData) (nocache nologging);

SQL*Loaderユーティリティを起動するには、次のコマンドを使用します。プロンプトが表示されたら、パスワードを入力します。

    sqlldr userid=USER control=load_dicom.ctl

DICOMデータがロードされた後、次のSQLコマンドを使用して、dicom列のDICOMコンテンツのロギングを再度有効にします。

 alter table medical_image_table modify lob(dicom.source.localData)  (nocache logging);

DICOMデータが外部ファイルから表にロードされた後、別のプログラムで、dicom列の初期化を完了し、imageThumb列およびanonDicom列に移入するデータを生成する必要があります。これらのタスクは、例5-3 (PL/SQLブロックが含まれます)に示すように、ORDDicomオブジェクトのメソッドを使用して実行できます。この例では、setProperties()メソッドを使用してdicom列を初期化します。imageThumb列オブジェクトはprocessCopy( )メソッドを使用して作成します。また、anonDicom列オブジェクトはmakeAnonymous( )メソッドを使用して作成します。このメソッドには、入力引数のいずれかに対して一意の識別子が必要です。

注:

例5-3は、setDataModel( )プロシージャをコールする完全なコード・サンプルです。ただし、このプロシージャ・コールは、必ずしもすべての場合に必要とはかぎりません。

このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。

例5-3では、id列の値と、定義する必要のあるDICOM UIDルートの値を連結することによって、一意識別子(UID)を生成するためのgenUID( )ファンクションを定義します。このファンクションは、組織の標準に従って、一意の識別子を生成する別のファンクションに置き換えることができます。

例5-3のPL/SQLブロックは、表medical_image_tableのすべての行にわたって1回ループします。その後、3つのパスで各DICOM画像の読取りおよびアクセスを行います。1つ目のパスでは、dicom列のプロパティを設定します。2つ目のパスでは、JPEGサムネイル画像を作成します。さらに、3つ目のパスでは、anonDicom列に格納する匿名のDICOM画像を作成します。これらの読取り操作を繰り返すため、dicom列のLOB記憶域プロパティを変更して、DICOMコンテンツのキャッシュを有効にできます。

dicom列のDICOMコンテンツのキャッシュを有効にするには、次のSQLコマンドを使用します。

 alter table medical_image_table  modify lob(dicom.source.localData) (cache);

初期化の完了後、次のSQLコマンドを使用して、dicom列のDICOMコンテンツのキャッシュを無効にします。

 alter table medical_image_table  modify lob(dicom.source.localData) (nocache logging);

「PL/SQL APIを使用したDICOMアプリケーションの開発」で、このプログラムおよび他のPL/SQLプログラムについて詳細に説明しています。

関連項目:

例5-2 DICOMコンテンツのロード

-- This file is a SQL*LDR control file to load DICOM data
-- into the table MEDICAL_IMAGE_TABLE. The control file contains directives
-- to load DICOM data into the DICOM column. It also contains directives
-- to initialize the IMAGETHUMB and ANONDICOM columns. The data to be loaded
-- is specified in this file after the BEGINDATA delimiter.
--
--  The following command invokes the SQL*Loader utility and then prompts you
--  to enter the password for the specified userid.
--
--    sqlldr userid=USER control=load_dicom.ctl
--
--
load data
-- 
-- The input data is contained in this file after the BEGINDATA delimiter.
--
infile *
into table medical_image_table
--
-- This example truncates the table. Change the following to "append"
-- if you want to add to an existing table.
--
truncate
fields terminated by whitespace optionally enclosed by '"'
(
 --
 -- The primary key column.
 --
 id                 integer external,
 --
 -- A filler field that holds the file path of the DICOM data.
 --
 dicomFilename      filler char,
 --
 -- Load the dicom column object
 --    The LOB attribute source.localData is loaded with the DICOM data.
 --    The srcType attribute is initialized to "local".
 --    The updateTime attribute is initialized to "SYSDATE".
 --    The LOB attribute extension is initialized with an empty LOB.
 --
   dicom             column object (
     source          column object (
       localData     lobfile(dicomFilename) terminated by EOF,
       srcType       constant 'local',
       updateTime    expression "SYSDATE"
     ), 
     extension       lobfile(dicomFilename) terminated by EOF
                      defaultif dicom.source.srcType='local'
   ),
 --
 -- Initialize the imageThumb column object
 --    The LOB attribute source.localData is initialized with an empty LOB.
 --    This LOB will hold the content for the thumbnail image.
 --    The local attribute is initialized to "1".
 --
   imageThumb        column object (
     source          column object (
       localData     lobfile(dicomFilename) terminated by EOF
                       defaultif imageThumb.source.local=X'1',
       local         constant 1
     )
   ),
 --
 -- Initialize the anonDicom column object
 --    The LOB attributes source.localData and extension are initialized.
 --      with empty LOBs. 
 --    The localData LOB will hold the content for the DICOM data to be
 --      made anonymous.
 --    The extension LOB is an internal field used by ORDDICOM.
 --    The srcType attribute is initialized to "local".
 --
   anonDicom         column object (
     source          column object (
       localData     lobfile(dicomFilename) terminated by EOF
                       defaultif anonDicom.source.srcType='local',
       srcType       constant 'local'
     ), 
     extension         lobfile(dicomFilename) terminated by EOF
                      defaultif dicom.source.srcType='local'
   )
)
--
-- Input data begins here
--
-- ID  DICOMFILENAME
BEGINDATA
   1   sample1.dcm
   2   sample2.dcm

例5-3 DICOM表のロードと初期化の終了

--
-- The ORDDicom method makeAnonymous() takes a unique UID as an input parameter.
-- This utility function generates a simple UID to use in this example.
-- Replace the string value of UID_ROOT with the DICOM UID for your organization.
--
create or replace function genUID(in_id varchar2)
return varchar2
is
 -- Declare the DICOM UID root value for your organization
 -- You must replace this value.
 UID_ROOT varchar2(128) := '<unique-UID root>';
begin
 return UID_ROOT || '.' || in_id;
end;
/
show errors;
 

--
-- This PL/SQL block loops over all the rows in the MEDICAL_IMAGE_TABLE and:
-- 1. Calls the ORDDicom method setProperties() to initialize the dicom column
-- 2. Calls the ORDDicom method processCopy() to create a JPEG thumbnail image
--    that is stored in the imageThumb column.
-- 3. Calls the ORDDicom method makeAnonymous() to create an anonymous version
--    of the dicom column. The new version is stored in the column anonDicom.
--
declare
 dcm ordsys.orddicom;
begin
  -- load the DICOM data model
  ord_dicom.setDatamodel;
 
  -- loop over all rows in the medical image table
  for rec in (select * from medical_image_table for update) loop
 
    -- initialize the dicom column
    rec.dicom.setProperties();
 
    -- create a JPEG thumbnail 
    rec.dicom.processCopy('fileFormat=jpeg fixedScale=75,100', rec.imageThumb);
 
    -- make a new anonymous version of the ORDDicom object
    rec.dicom.makeAnonymous(genUID(rec.id), rec.anonDicom);
    -- write the objects back to the row
    update medical_image_table
    set dicom = rec.dicom,
        imageThumb = rec.imageThumb,
        anonDicom = rec.anonDicom
    where id = rec.id;
 
  end loop;
  commit;
end;
/

5.4 PL/SQL APIを使用したDICOMアプリケーションの開発

この項は、「ORDDicom列を含む表の作成」および「SQL*Loaderユーティリティを使用したDICOMコンテンツのロード」のコード例に基づいています。ここでは、Oracle Multimedia DICOMを使用してデータベース内のDICOMコンテンツの格納および操作を行うPL/SQLコードの例を示します。

Oracle Multimedia DICOMを使用すると、ORDDicom型の列を含むデータベース表にDICOMコンテンツを格納できます。次のコード例に、データベース表のORDDicomオブジェクト内に含まれるいくつかの属性を示します。

SOP_INSTANCE_UID
SOP_CLASS_UID
STUDY_INSTANCE_UID
SERIES_INSTANCE_UID
Source (ORDDataSource)
Metadata (SYS.XMLType)
ContentLength (integer)
Internal attributes

次の各項では、この項に示したコード例を使用してPL/SQLで実行できるサンプル・タスクについて説明します。

5.4.1 DICOM属性の選択

この項では、「SQL*Loaderユーティリティを使用したDICOMコンテンツのロード」でロードしたDICOMコンテンツのDICOM属性にアクセスする方法を示します。

medical_image_table表が移入されると、メタデータが抽出され、SQL問合せを使用してメタデータにアクセスすることができます。例5-4に、抽出されたDICOMメタデータをDICOMコンテンツから選択する方法を示します。

例5-4を実行すると、次の出力が生成されます。

ID SOP_INSTANCE_UID
-- -------------------------------------------------------
 1 1.2.392.200036.9116.2.2.2.1762676206.1077529882.102147
 
ID SOP_CLASS_UID
-- -------------------------------------------------------
 1 1.2.840.10008.5.1.4.1.1.2
 
ID STUDY_INSTANCE_UID
-- -------------------------------------------------------
 1 1.2.392.200036.9116.2.2.2.1762929498.1080638122.365416
 
ID SERIES_INSTANCE_UID
-- -------------------------------------------------------
 1 1.2.392.200036.9116.2.2.2.1762929498.1080638122.503288
 
ID CONTENT_LENGTH
-- ---------------
 1   525974
 
ID PATIENT_NAME                    PATIENT_ID      MODALITY
--- ------------------------------ ----------      ----------
 1 CANCIO   2HR                    A-02-013        CT 

例5-4 DICOMコンテンツからのメタデータの選択

1.     SOP_INSTANCE_UID.
2.     SOP_CLASS_UID
3.     STUDY_INSTANCE_UID
4.     SERIES_INSTANCE_UID.
5.     Content length (number of bytes of DICOM content)
6.     Patient Name, Patient ID, and Modality from DICOM metadata
 
 
select id,
       t.dicom.getSOPInstanceUID() as SOP_Instance_UID
from medical_image_table t;
 
select id,
       t.dicom.getSOPClassUID() as SOP_Class_UID
from medical_image_table t;
 
select id,
       t.dicom.getStudyInstanceUID() as Study_Instance_UID
from medical_image_table t;
 
select id,
       t.dicom.getSeriesInstanceUID() as Series_Instance_UID
from medical_image_table t;
 
select id,
       t.dicom.getcontentlength() as content_Length
from medical_image_table t;

select m.id, t.PATIENT_NAME, t.PATIENT_ID, t.MODALITY
from medical_image_table m,
  xmltable
    (xmlnamespaces
      (default 'http://xmlns.oracle.com/ord/dicom/metadata_1_0'),
           '/DICOM_OBJECT'
       passing m.dicom.metadata
       columns
         patient_name varchar2(100)
                   path './*[@name="Patient''''s Name"]/VALUE',
         patient_id   varchar2(100)
                   path './*[@name="Patient ID"]',
         modality     varchar2(100)
                   path './*[@name="Modality"]'
    ) t ;

5.4.2 サムネイル画像の作成および画像形式の変更

この項では、データベース内で起動可能ないくつかの画像処理操作を示します。

例として、DICOMイメージからJPEGサムネイル画像を作成するために、ORDDicomオブジェクトから新しいORDImageオブジェクトを生成します。このタスクを完了するには、新しいORDImageオブジェクトに適用するプロパティを記述する必要があります。

次の記述により、75x100ピクセルのJPEGサムネイル画像が生成されます。

'fileFormat=jfif fixedScale=75 100'

例5-5に示すコード・セグメントでは、次のタスクを実行するgenerate_thumb()プロシージャを定義します。

  • 識別子source_idを含むmedical_image_table表のimageThumb列を移入する。

  • ソース行のORDDicomオブジェクトでprocessCopy( )メソッドをコールすることによって、列にORDImageオブジェクトを生成する。

例5-5で、これらのタスクを実行する部分は、太字で強調表示しています。

注:

例5-5は、setDataModel( )プロシージャをコールする完全なコード・サンプルです。ただし、このプロシージャ・コールは、必ずしもすべての場合に必要とはかぎりません。

このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。

例5-5を実行すると、次の出力が生成されます。

ID  T.IMAGETHUMB.GETWIDTH() T.IMAGETHUMB.GETHEIGHT() T.IMAGETHUMB.GETFILE
--- ----------------------- ------------------------ ----------------------
 1              75                      100            JFIF

例5-5 新しいORDImageオブジェクトの生成および処理

-- Set Data Model Repository
execute ordsys.ord_dicom.setDataModel();
 
create or replace procedure generate_thumb(source_id number, verb varchar2) is
    dcmSrc    ordsys.orddicom;
    imgDst    ordsys.ordimage;
begin
  select dicom, imageThumb into dcmSrc, imgDst from medical_image_table
         where id = source_id for update;
  dcmSrc.processCopy(verb, imgDst);
 
  update medical_image_table set imageThumb = imgDst where id = source_id;
  commit;
end;
/
 
 
-- Create a JPEG thumbnail image for our test DICOM
execute generate_thumb(1, 'fileFormat=jfif fixedScale=75 100');
 
-- look at our handiwork
column t.imageThumb.getFileFormat() format A20;
select id, t.imageThumb.getWidth(), t.imageThumb.getHeight(), 
       t.imageThumb.getFileFormat() 
from medical_image_table t;

5.4.3 ORDDicomオブジェクトの匿名コピーの作成

この項では、ORDDicomオブジェクトを匿名化することによって、患者のプライバシを保護する方法を示します。

ORDDicomオブジェクトを匿名化するには、新しいDICOMコンテンツおよび関連するORDDicomオブジェクト・メタデータの両方でユーザー定義の特定のDICOM属性が削除されているか上書きされている、新しいORDDicomオブジェクトを作成する必要があります。XMLの匿名ドキュメントでは、削除または置換するDICOM属性、および各属性を匿名化するためのアクションが指定されます。

デフォルトの匿名ドキュメントordcman.xmlがインストール中にロードされます。カスタマイズされた匿名ドキュメントを作成することもできますが、この例では、そのトピックは対象としていません。この例では、デフォルトの匿名ドキュメントを使用します。

例5-6のコード・セグメントでは、次のタスクを実行するgenerate_anon()プロシージャを定義します。

  • 元のコンテンツdicomと、識別子source_idを含むmedical_image_table表のanonDicom列を選択する。

  • ソース行のdicomで、makeAnonymous( )メソッドをコールすることによって、anonDicom列にORDDicomオブジェクトを生成する。

このコード・セグメントを実行すると、generate_anonプロシージャの変数dest_sop_instance_uidに対する一時UIDが、グローバルに一意なUIDに置き換えられます。

例5-6で、makeAnonymous( )メソッドをコールする部分は、太字で強調表示しています。

注:

例5-6は、setDataModel( )プロシージャをコールする完全なコード・サンプルです。ただし、このプロシージャ・コールは、必ずしもすべての場合に必要とはかぎりません。

このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。

例5-6を実行すると、次の出力が生成されます。

ID PATIENT_NAME                    PATIENT_ID
--- ------------------------------ ----------
 1  anonymous                      anonymous

例5-6 列の移入および匿名ORDDicomオブジェクトの生成

-- Set Data Model Repository
 
execute ordsys.ord_dicom.setDataModel();
 
create or replace procedure generate_anon(source_id number) is
    dcmSrc    ordsys.orddicom;
    anonDst   ordsys.orddicom;
    dest_sop_inst_uid varchar2(128) := '1.2.3';
 
begin
  select dicom, anonDicom into dcmSrc, anonDst from medical_image_table
         where id = source_id for update;
  dcmSrc.makeAnonymous(dest_sop_inst_uid, anonDst);
  update medical_image_table set anonDicom = anonDst where id = source_id;
  commit;
end;
/
 
-- Generate an Anonymous Copy of our test DICOM
execute generate_anon(1);

select m.id, t.PATIENT_NAME, t.PATIENT_ID
from medical_image_table m,
  xmltable
   (xmlnamespaces
     (default 'http://xmlns.oracle.com/ord/dicom/metadata_1_0'),
          '/DICOM_OBJECT'
      passing m.anondicom.metadata
      columns
        patient_name varchar2(100)
                  path './*[@name="Patient''''s Name"]/VALUE',
        patient_id   varchar2(100)
                  path './*[@name="Patient ID"]'
   ) t ;

5.4.4 ORDDicomオブジェクトの準拠の検証

この項では、ユーザー定義の一連の制約ルールに対するORDDicomオブジェクトの準拠を検証する方法を示します。制約ルールは、1つ以上の制約ドキュメントで指定されます。これらのXML文書では、DICOMメタデータ・スキーマでは表現できない属性間の関係およびセマンティックの制約を指定します。

デフォルトの制約ドキュメントordcmct.xmlがインストール中にロードされます。カスタマイズされた制約ドキュメントを作成することもできますが、この例では、そのトピックは対象としていません。この例では、デフォルトの制約ドキュメントを使用します。

例5-7のコード・セグメントでは、次のタスクを実行するプロシージャcheck_conform()を定義します。

  • 識別子source_idを持つ表medical_image_tableの元の内容dicomが選択されます。

  • 出力テキストの行を表示します。ここには、DICOMコンテンツの次のいずれかの条件が示されます。

    • 準拠妥当

      isconformanceValid(OracleOrdObject): 1

    • 非準拠妥当

      isconformanceValid(OracleOrdObject): 0

注:

例5-7は、setDataModel( )プロシージャをコールする完全なコード・サンプルです。ただし、このプロシージャ・コールは、必ずしもすべての場合に必要とはかぎりません。

このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。

例5-7を実行すると、次の出力が生成されます。

SQL> execute check_conform(1) ;
isconformanceValid(OracleOrdObject): 1

1の値は、デフォルトのOracle制約ルールに適合しているため、この例で使用されているDICOMコンテンツが妥当であったことを示します。DICOMコンテンツが妥当でない場合にこの例を実行すると、0の値が返されます。さらに、以前の準拠検証中に生成された1つ以上の制約メッセージがビューorddcm_conformance_vld_msgsに検出されます。

次のコード・セグメントには、このビューの説明が示されています。

SQL> describe orddcm_conformance_vld_msgs;

 Name                         Null?          Type
 ----------------------    -------------    ---------------------
 SOP_INSTANCE_UID                            VARCHAR2(128 CHAR)
 RULE_NAME                  NOT NULL         VARCHAR2(64 CHAR)
 MESSAGE                                     VARCHAR2(1999 CHAR)
 MSG_TYPE                   NOT NULL         VARCHAR2(20 CHAR)
 MSG_TIME                   NOT NULL         TIMESTAMP(6)

このビューを問い合せて、準拠検証中に生成された制約メッセージを調べることができます。この例で使用されたDICOMコンテンツがOracleの制約ルールに準拠していたため、orddcm_conformance_vld_msgsビューにメッセージはありません。

select * from orddcm_conformance_vld_msgs;

したがって、前述のSELECT文による問合せをコールすると、次の出力が生成されます。

no rows selected

組織内で定義された制約ルールにDICOMコンテンツが準拠していない場合の処置については、「タスク8: DICOM制約への準拠の検証」を参照してください。ビューorddcm_conformance_vld_msgsの詳細は、「DICOMリポジトリのパブリック・ビュー」を参照してください。

例5-7 DICOMの準拠の検証

-- Set Data Model Repository
execute ordsys.ord_dicom.setDataModel();
 
create or replace procedure check_conform(source_id number) is
    dcmSrc    ordsys.orddicom;
begin
  select dicom into dcmSrc from medical_image_table
         where id = source_id;
  dbms_output.put_line('isconformanceValid(OracleOrdObject): ' ||
    dcmSrc.isConformanceValid('OracleOrdObject'));
end;
/
show errors;

5.4.5 PL/SQLでのOracle Multimedia DICOM例外の処理

実行時に発生する可能性があるエラーを、常にアプリケーションで処理する必要があります。これにより、実行時エラーが発生してもプログラムの動作を継続できます。また、プログラム動作中のエラーの原因を認識することもできるようになります。エラーを適切に処理することによって、可能であれば、アプリケーションの実行中に常にエラーからリカバリできます。さらに、適切にエラーを処理することで、必要な情報が提供されるため、常にエラーの原因を認識できます。

例外を処理する場合、PL/SQLでは例外ブロックを使用します。たとえば、PL/SQLの場合、次のように例外を処理します。

BEGIN
<some program logic>
EXCEPTION
     WHEN OTHERS THEN
     <some exception logic>
END;

独自に設計、コーディングおよびデバッグしたアプリケーションであれば、プログラム内のどの箇所でエラーが発生してプログラムの処理が停止する可能性があるかがわかります。そのような箇所に対しては、発生する可能性のあるエラーを処理するための例外処理ブロックを追加する必要があります。

関連項目:

PL/SQL例外の処理の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください