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に示すコード・セグメントでは、id
、dicom
、imageThumb
およびanonDicom
の4つの列を含むmedical_image_table
表が作成されます。
例5-1では、メディア・コンテンツにSecureFiles LOB記憶域を使用しています。Oracle SecureFilesは、再設計されたバイナリ・ラージ・オブジェクト(BLOB)で、パフォーマンスの向上、およびOracle Databaseのコンテンツ管理機能の強化を図ります。
関連項目:
-
SecureFiles LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
-
SecureFiles LOBのチューニング・ヒントは、『Oracle Multimediaユーザーズ・ガイド』を参照してください。
-
セキュア・パスワードの作成の詳細は、『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プログラムについて詳細に説明しています。
関連項目:
-
SQL*Loaderユーティリティを使用してオブジェクトおよびLOBをOracle Databaseにロードする方法の詳細は、『Oracle Databaseユーティリティ』
-
LOBおよびロギングの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』
例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言語リファレンス』を参照してください