6 DICOMアプリケーションの開発
この章では、Oracle Multimedia DICOMを使用してアプリケーションを開発する方法を説明します。
Oracle Multimedia DICOMでは、次のアプリケーション・プログラミング・インタフェース(API)を通じて、Oracle Databaseがサポートされています。
-
DICOM PL/SQL API
-
ORDDicomオブジェクトAPI
-
DICOMデータ・モデル・ユーティリティAPI
-
DICOM Java API(非推奨)
これらのインタフェースを使用することで、DICOMコンテンツのデータベースへのアップロード、データベースからの取得、およびこれらのコンテンツの操作を行うためのアプリケーションを短時間で開発できます。
この章には、DICOMコンテンツのデータベースへのインポート、DICOMメタデータに基づくSQL問合せの書込み、基本的な画像処理の実行、ORDDicomオブジェクトの匿名コピーの作成、およびDICOMコンテンツのユーザー定義制約ルールへの準拠の確認について、それぞれの方法を示す例が含まれています。一部の例は、チュートリアルOracle Database 12cでのDICOM形式データの管理から抜粋し、このマニュアルにあわせて調整したものです。このチュートリアルの場所については、DICOMサンプル・アプリケーションを参照してください。
この章では、次の内容を説明します。
関連項目:
下記以外の例、記事およびその他の情報については、Oracle Technology Network WebサイトのOracle Multimediaを参照してください。
6.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スキーマで定義されています。
6.2 ORDDicom列を含む表の作成
この項では、DICOMコンテンツを格納するための、ORDDicom列を含む表の作成方法を示します。
例6-1に示すコード・セグメントでは、id、dicom、imageThumbおよびanonDicomの4つの列を含むmedical_image_table表が作成されます。
例6-1では、メディア・コンテンツにSecureFiles LOB記憶域を使用しています。Oracle SecureFilesは、再設計されたバイナリ・ラージ・オブジェクト(BLOB)で、パフォーマンスの向上、およびOracle Databaseのコンテンツ管理機能の強化を図ります。
関連項目:
-
SecureFiles LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
-
SecureFiles LOBのチューニングに関するヒントは、Oracle Multimediaユーザーズ・ガイドを参照してください。
-
セキュア・パスワードの作成の詳細は、Oracle Databaseセキュリティ・ガイドを参照してください。
例6-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 )
;
6.3 SQL*Loaderユーティリティを使用したDICOMコンテンツのロード
この項では、SQL*Loaderユーティリティを使用して、Oracle Databaseの既存の表にDICOMコンテンツをロードする方法を示します。SQL*Loaderは、外部ファイルのデータをOracle Databaseの表にロードするための高パフォーマンスのユーティリティです。外部データは、Oracle Databaseのサーバーを実行しているシステムとは異なるクライアント・システムから、ネットワークを経由してロードできます。データは、データベース・サーバーと同じシステム上でローカルにロードすることもできます。
典型的なSQL*Loaderセッションは、制御ファイルと1つ以上のデータ・ファイルを入力として受け取ります。制御ファイルは、データをデータベースにロードする方法を定義します。SQL*Loaderセッションの出力は、データがロードされているOracle Databaseおよびログ・ファイルですが、廃棄ファイルが出力される場合もあります。
例6-2に、例6-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列に移入するデータを生成する別のプログラムが必要になります。これらのタスクは、例6-3 (PL/SQLブロックを含む)に示すように、ORDDicomオブジェクトのメソッドを使用することで実行できます。この例では、dicom列がsetProperties()メソッドを使用して初期化されます。imageThumb列のオブジェクトはprocessCopy( )メソッドを使用して作成されます。anonDicom列のオブジェクトはmakeAnonymous( )メソッドを使用して作成されますが、このメソッドには入力引数の1つとして一意の識別子が必要です。
注意:
例6-3は、setDataModel( )プロシージャへのコールを含む完全なコード・サンプルです。このプロシージャ・コールは、必ずしもすべての状況で必要になるわけではありません。
このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。
例6-3では、id列の値と、定義する必要のあるDICOM UIDルートの値を連結することによって、一意識別子(UID)を生成するためのgenUID( )ファンクションを定義します。このファンクションは、組織の標準に従って、一意の識別子を生成する別のファンクションに置き換えることができます。
例6-3のPL/SQLブロックは、表medical_image_table内のすべての行を1回ループします。その後、各DICOM画像の読取りおよびアクセスを3回にわたって行います。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プログラムおよび他のPL/SQLプログラムについて詳しく説明します。
関連項目:
-
SQL*Loaderユーティリティを使用して、オブジェクトおよびLOBをOracle Databaseにロードする方法の詳細は、Oracle Databaseユーティリティを参照してください。
-
LOBおよびロギングの詳細は、Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイドを参照してください
例6-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
例6-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;
/
6.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で実行できるタスクの例について説明します。
6.4.1 DICOM属性の選択
この項では、SQL*Loaderユーティリティを使用したDICOMコンテンツのロードでロードしたDICOMコンテンツからDICOM属性にアクセスする方法を示します。
medical_image_table表が移入されると、メタデータが抽出され、SQL問合せを使用してメタデータにアクセスすることができます。例6-4に、抽出されたDICOMメタデータをDICOMコンテンツから選択する方法を示します。
例6-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
例6-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 ;
6.4.2 サムネイル画像の作成および画像形式の変更
この項では、データベース内で起動可能な画像処理操作の一部を示します。
例として、DICOMイメージからJPEGサムネイル画像を作成するために、ORDDicomオブジェクトから新しいORDImageオブジェクトを生成します。このタスクを完了するには、新しいORDImageオブジェクトに適用するプロパティを記述する必要があります。
次の記述により、75x100ピクセルのJPEGサムネイル画像が生成されます。
'fileFormat=jfif fixedScale=75 100'
例6-5に示すコード・セグメントでは、次のタスクを実行するgenerate_thumb()プロシージャが定義されています。
-
識別子
source_idを含むmedical_image_table表のimageThumb列を移入する。 -
ソース行のORDDicomオブジェクトでprocessCopy( )メソッドをコールすることによって、列にORDImageオブジェクトを生成する。
例6-5で、これらのタスクを実行する部分は、太字で強調表示しています。
注意:
例6-5は、setDataModel( )プロシージャへのコールを含む完全なコード・サンプルです。このプロシージャ・コールは、必ずしもすべての状況で必要になるわけではありません。
このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。
例6-5を実行すると、次の出力が生成されます。
ID T.IMAGETHUMB.GETWIDTH() T.IMAGETHUMB.GETHEIGHT() T.IMAGETHUMB.GETFILE --- ----------------------- ------------------------ ---------------------- 1 75 100 JFIF
例6-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;
6.4.3 ORDDicomオブジェクトの匿名コピーの作成
この項では、ORDDicomオブジェクトを匿名化することによって、患者のプライバシを保護する方法を示します。
ORDDicomオブジェクトを匿名化するには、新しいDICOMコンテンツおよび関連するORDDicomオブジェクト・メタデータの両方でユーザー定義の特定のDICOM属性が削除されているか上書きされている、新しいORDDicomオブジェクトを作成する必要があります。XML匿名ドキュメントでは、削除または置換するDICOM属性、および各属性を匿名化するために実行するアクションが指定されます。
デフォルトの匿名ドキュメントordcman.xmlがインストール中にロードされます。カスタマイズされた匿名ドキュメントを作成することもできますが、この例では、そのトピックは対象としていません。この例では、デフォルトの匿名ドキュメントを使用します。
例6-6のコード・セグメントでは、次のタスクを実行するgenerate_anon()プロシージャが定義されています。
-
元のコンテンツ
dicomと、識別子source_idを含むmedical_image_table表のanonDicom列を選択する。 -
ソース行の
dicomで、makeAnonymous( )メソッドをコールすることによって、anonDicom列にORDDicomオブジェクトを生成する。
このコード・セグメントを実行する場合は、generate_anonプロシージャの変数dest_sop_instance_uidの一時UIDを、グローバルに一意なUIDに置き換えてください。
例6-6では、makeAnonymous( )メソッドをコールするコード文が太字で強調表示されています。
注意:
例6-6は、setDataModel( )プロシージャへのコールを含む完全なコード・サンプルです。このプロシージャ・コールは、必ずしもすべての状況で必要になるわけではありません。
このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。
例6-6を実行すると、次の出力が生成されます。
ID PATIENT_NAME PATIENT_ID --- ------------------------------ ---------- 1 anonymous anonymous
例6-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 ;
6.4.4 ORDDicomオブジェクトの準拠の検証
この項では、ユーザー定義の一連の制約ルールに対するORDDicomオブジェクトの準拠を検証する方法を示します。制約ルールは、1つ以上の制約ドキュメントで指定されます。これらのXML文書では、DICOMメタデータ・スキーマでは表現できない属性間の関係およびセマンティックの制約を指定します。
デフォルトの制約ドキュメントordcmct.xmlがインストール中にロードされます。カスタマイズされた制約ドキュメントを作成することもできますが、この例では、そのトピックは対象としていません。この例では、デフォルトの制約ドキュメントを使用します。
例6-7のコード・セグメントでは、次のタスクを実行するプロシージャcheck_conform()が定義されています。
-
表
medical_image_tableの元のコンテンツdicomのうち、識別子がsource_idであるものを選択します。 -
出力テキスト行を表示します。ここでは、DICOMコンテンツの次のいずれかの状態が示されます。
-
準拠が有効
isconformanceValid(OracleOrdObject): 1 -
準拠が無効
isconformanceValid(OracleOrdObject): 0
-
注意:
例6-7は、setDataModel( )プロシージャへのコールを含む完全なコード・サンプルです。このプロシージャ・コールは、必ずしもすべての状況で必要になるわけではありません。
このプロシージャをコールする場合の詳細は、setDataModel( )プロシージャを参照してください。
例6-7を実行すると、次の出力が生成されます。
SQL> execute check_conform(1) ; isconformanceValid(OracleOrdObject): 1
値1は、この例で使用されているDICOMコンテンツが、Oracleのデフォルトの制約ルールに適合していたため、有効であったことを示しています。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リポジトリのパブリック・ビューを参照してください。
例6-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;
6.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言語リファレンス』を参照してください