10 DICOMリポジトリの管理

この章では、DICOMデータ・モデル・リポジトリ内の構成ドキュメントの管理方法について、コード例を使用して説明します。ORD_DICOM_ADMINパッケージがPL/SQLのみで提供されているため、コード例はパッケージと対応するようにPL/SQLで記述されています。

注:

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

Oracle Multimedia DICOMには、データ・モデル・リポジトリに関連するいくつかの管理操作に対応した機能が用意されています。たとえば、管理者は、特定の組織のカスタム構成ドキュメントを追加するかどうかを決定する前に、DICOMデータ・モデル・リポジトリにあるOracleで定義された構成ドキュメントを確認できます(「サンプル・セッション2: マッピング・ドキュメントの更新」のステップ2および4でこの手順について説明しています)。これらの構成ドキュメントに関する属性およびその他の詳細情報を管理者が取得するには、ビューを使用するか、またはデータ・モデル・ユーティリティのファンクションをコールします。リポジトリに対して構成ドキュメントを管理者が挿入、更新、エクスポートまたは削除するには、ORD_DICOM_ADMINパッケージ内のプロシージャおよびファンクションを使用します。DICOMデータ・モデル・リポジトリの管理者には、ORDADMINロールが割り当てられます。

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

関連項目:

10.1 サンプル・セッション1: 2つのドキュメントの挿入

次のサンプル・セッションは、マッピング・ドキュメントと制約ドキュメントをリポジトリに挿入する手順を示しています。このサンプルでは、前提となる次のタスクが完了していることを想定しています。

  • ディレクトリ・オブジェクト(DICOMDIR)が作成済で、読取りアクセス権が管理者に付与されている。

  • マッピング・ドキュメントに関連付けられたメタデータ・スキーマが、グローバルまたはローカルXMLスキーマとしてOracle XML DBに登録されている。

    関連項目:

    XMLスキーマの登録の詳細は、『Oracle XML DB開発者ガイド』を参照してください

マッピング・ドキュメントと制約ドキュメントをリポジトリに挿入するには、次の手順を実行します。

手順1   データ・モデルの編集

データ・モデルを編集する準備をし、他の管理者が同時に変更できないように、データ・モデルをロックします。たとえば、

exec ord_dicom_admin.editDataModel();

データ・モデルは、変更をパブリッシュするか、ロールバック操作を実行するか、またはセッションを終了するまで、ロックされたままです。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

ドキュメントのリストを確認します。

手順2   新しいドキュメントの挿入

まず、次のコマンドを実行して、サンプル・マッピング・ドキュメント(sample_map.xml)を挿入します。

exec ord_dicom_admin.insertDocument('sample_map.xml', 'MAPPING',
 xmltype(bfilename('DICOMDIR', 'sample_map.xml'), nls_charset_id('AL32UTF8')));
 

サンプル・マッピング・ドキュメント(sample_map.xml)は、例2-1を参照してください。

その後、次のようにして、サンプル制約ドキュメント(sample_ct.xml)を挿入します。

exec ord_dicom_admin.insertDocument('sample_ct.xml', 'CONSTRAINT',
 xmltype(bfilename('DICOMDIR', 'sample_ct.xml'), nls_charset_id('AL32UTF8')));

サンプル制約ドキュメント(sample_ct.xml)は、例2-3を参照してください。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

挿入したドキュメントが、ドキュメントのリストに表示されることを確認します。

別の方法として、次のようにorddcm_document_refsビューを問い合せた後、ドキュメント参照を確認できます。

select * from orddcm_document_refs order by doc_name, ref_by_doc_name asc;

この時点で、必要に応じて管理に関連するテストを実行できます。また、rollbackDataModel( )プロシージャをコールして、変更をパブリッシュせずに操作を終了できます。終了しない場合は、次の手順を続行します。

手順3   変更のパブリッシュ

次のコマンドを実行し、変更をパブリッシュしてデータ・モデルのロックを解除します。

exec ord_dicom_admin.publishDataModel();

データ・モデルには、挿入した構成ドキュメントが含まれます。

10.2 サンプル・セッション2: マッピング・ドキュメントの更新

次のサンプル・セッションは、リポジトリ内のマッピング・ドキュメントを更新する手順を示しています。このサンプルでは、前提となる次のタスクが完了していることを想定しています。

  • ディレクトリ・オブジェクト(DICOMDIR)が作成済で、読取りおよび書込みアクセス権が管理者に付与されている。

  • マッピング・ドキュメントに関連付けられた参照先のメタデータ・スキーマが、グローバルまたはローカルXMLスキーマとしてOracle XML DBに登録されている。

    XMLスキーマの登録の詳細は、『Oracle XML DB開発者ガイド』を参照してください。

リポジトリでマッピング・ドキュメントを更新するには、次の手順を実行します。

手順1   データ・モデルの編集

「サンプル・セッション1: 2つのドキュメントの挿入」の場合と同様に、データ・モデルを編集するための準備をして、他の管理者が同時に変更できないようにロックします。たとえば、

exec ord_dicom_admin.editDataModel();

データ・モデルは、変更をパブリッシュするか、ロールバック操作を実行するか、またはセッションを終了するまで、ロックされたままです。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

ドキュメントのリストを確認します。

手順2   既存のドキュメントのエクスポート

サンプル・マッピング・ドキュメント(sample_map.xml)を編集するために、指定のファイル(sample_map_export.xml)にリポジトリからエクスポートします。たとえば、

exec ord_dicom_admin.exportDocument('sample_map.xml', 'DICOMDIR', 
 'sample_map_export.xml');

サンプル・マッピング・ドキュメント(sample_map.xml)は、例2-1を参照してください。

sample_map_export.xmlファイルはXMLエディタを使用して編集できます。

手順3   既存のドキュメントの削除

次のようにして、既存のマッピング・ドキュメント(sample_map.xml)をリポジトリから削除します。

exec ord_dicom_admin.deleteDocument('sample_map.xml');

リポジトリには、サンプル・マッピング・ドキュメントは含まれなくなります。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

削除したドキュメントが、ドキュメントのリストに表示されないことを確認します。

手順4   エクスポートしたドキュメントの編集

手順2でエクスポートしたファイルを、XMLエディタで編集します。その後、変更を保存し、ファイルをリポジトリに挿入する前に、ファイルのアクセス権をチェックします。

手順5   編集済ドキュメントの挿入

次のコマンドを実行して、編集済のドキュメント(sample_map_edited.xml)をリポジトリに挿入します。

exec ord_dicom_admin.insertDocument('sample_map_edited.xml', 'MAPPING',
 xmltype(bfilename('DICOMDIR', 'sample_map_edited.xml'), 
 nls_charset_id('AL32UTF8')));

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

更新したドキュメントが、ドキュメントのリストに表示されることを確認します。

この時点で、変更内容をテストして、編集済マッピング・ドキュメントでextractMetadata( )メソッドを実行して、埋込みDICOMコンテンツからXMLコードとしてメタデータを取得してから、データベース表に格納して検索や表示を行えるようにします。また、rollbackDataModel( )プロシージャをコールして、変更をパブリッシュせずに操作を終了できます。終了しない場合は、次の手順を続行します。

手順6   変更のパブリッシュ

「サンプル・セッション1: 2つのドキュメントの挿入」と同様に、次のようにして変更内容を公開し、データ・モデルをロック解除します。

exec ord_dicom_admin.publishDataModel();

データ・モデルには、更新済の構成ドキュメントが含まれます。

10.3 サンプル・セッション3: 制約ドキュメントの削除

次のサンプル・セッションは、リポジトリから制約ドキュメントを削除する手順を示しています。このサンプルでは、前提となる次のタスクが完了していることを想定しています。

ディレクトリ・オブジェクト(DICOMDIR)が作成済で、書込みアクセス権が管理者に付与されている。

リポジトリから制約ドキュメントを削除するには、次の手順を実行します。

手順1   データ・モデルの編集

「サンプル・セッション1: 2つのドキュメントの挿入」の場合と同様に、データ・モデルを編集するための準備をして、他の管理者が同時に変更できないようにロックします。たとえば、

exec ord_dicom_admin.editDataModel();

データ・モデルは、変更をパブリッシュするか、ロールバック操作を実行するか、またはセッションを終了するまで、ロックされたままです。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

ドキュメントのリストを確認します。

手順2   既存のドキュメントのエクスポート(推奨オプション)

サンプル制約ドキュメント(sample_ct.xml)を編集するために、指定のファイル(sample_ct_export.xml)にリポジトリからエクスポートします。たとえば、

exec ord_dicom_admin.exportDocument('sample_ct.xml', 'DICOMDIR', 
'sample_ct_export.xml');

サンプル制約ドキュメント(sample_ct.xml)は、例2-3を参照してください。

次のコマンドを入力して、orddcm_document_refsビューを問い合せることもできます。このビューには、リポジトリ内の他のドキュメントから参照されているドキュメントのリストが表示されます。

select * from orddcm_document_refs order by doc_name, ref_by_doc_name asc;

ドキュメントのリストを表示して、削除しようとしている制約ドキュメントが参照されているかをチェックします。

手順3   ドキュメントの削除

次のようにして、サンプル制約ドキュメント(sample_ct.xml)を削除します。

exec ord_dicom_admin.deleteDocument('sample_ct.xml');

リポジトリには、サンプル制約ドキュメントは含まれなくなります。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

削除したドキュメントが、ドキュメントのリストに表示されないことを確認します。

この時点で、rollbackDataModel( )プロシージャをコールして、変更をパブリッシュせずに操作を終了できます。終了しない場合は、次の手順を続行します。

手順4   変更のパブリッシュ

次のコマンドを実行し、変更をパブリッシュしてデータ・モデルのロックを解除します。

exec ord_dicom_admin.publishDataModel();

データ・モデルには、削除した構成ドキュメントは含まれません。

10.4 サンプル・セッション4: ストアド・タグ・リスト・ドキュメントの挿入

この項では、ストアド・タグ・リスト・ドキュメントをリポジトリに挿入するために実行できる2つの方法について説明します。

  • 「タグの既知のセットを使用したストアド・タグ・リスト・ドキュメントの挿入」では、属性タグの既知のセットを使用してストアド・タグ・リスト・ドキュメントを挿入する方法を説明します。

    リポジトリ内のすべての制約ドキュメントおよびマッピング・ドキュメントで使用する可能性のある属性タグがすべて判明している場合は、この項に示す例に従って、独自のストアド・タグ・リスト・ドキュメントを作成して挿入してください。

  • 「ストアド・タグ・リスト・ドキュメントの生成と挿入」では、制約ドキュメントおよびマッピング・ドキュメントが格納された既存のリポジトリからストアド・タグ・リスト・ドキュメントを生成して挿入する方法について説明します。

    既存のリポジトリがあり、既存の制約ドキュメントおよびマッピング・ドキュメントで使用されているタグからストアド・タグ・リスト・ドキュメントを生成して挿入する場合は、この項の例に従ってください。

ストアド・タグ・リスト機能の記憶域とパフォーマンス上の利点を生かすための適切な方法を選択してください。

次の各項では、それぞれのアプローチについて説明します。

10.4.1 タグの既知のセットを使用したストアド・タグ・リスト・ドキュメントの挿入

独自のストアド・タグ・リスト・ドキュメントを作成してリポジトリに挿入できます。リポジトリ内の制約ドキュメントおよびマッピング・ドキュメントで定義するすべての属性タグをドキュメントに含めます。例10-1は、ストアド・タグ・リスト・ドキュメントとして挿入可能なサンプル・ファイル(sample_stl.xml)です。

この方法では、前提となる次のタスクが完了していると想定しています。

ディレクトリ・オブジェクト(DICOMDIR)が作成済で、読取りアクセス権が管理者に付与されている。

属性タグの既知のセット使用してストアド・タグ・リスト・ドキュメントをリポジトリに挿入するには、次の手順を実行します。

手順1   データ・モデルの編集

「サンプル・セッション1: 2つのドキュメントの挿入」の場合と同様に、データ・モデルを編集するための準備をして、他の管理者が同時に変更できないようにロックします。たとえば、

exec ord_dicom_admin.editDataModel();

データ・モデルは、変更をパブリッシュするか、ロールバック操作を実行するか、またはセッションを終了するまで、ロックされたままです。

この時点でリポジトリに格納されているドキュメントを表示するには、次のコマンドを入力してorddcm_documentsビューを問い合せます。

select doc_name from orddcm_documents order by doc_id asc;
ステップ2: ストアド・タグ・リスト・ドキュメントの挿入

次のようにしてサンプルのストアド・タグ・リスト・ドキュメント・ファイル(sample_stl.xml)を挿入します。

exec ord_dicom_admin.insertDocument(
                           'sample_stl.xml',
                           'STORED_TAG_LIST',
                            xmltype(bfilename('DICOMDIR', 'sample_stl.xml'),
                            nls_charset_id('AL32UTF8') ) );
手順3   変更のパブリッシュ

次のコマンドを実行し、変更をパブリッシュしてデータ・モデルのロックを解除します。

exec  ord_dicom_admin.publishDataModel;

データ・モデルには、挿入した構成ドキュメントが含まれます。

例10-1 既知の属性タグを使用したストアド・タグ・リスト・ドキュメントの挿入

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
 Copyright (c) 2008, Oracle. All rights reserved.
 
   NAME
     sample_stl.xml   - sample stored tag list 
 
-->
<ATTRIBUTE_TAG_LIST xmlns="http://xmlns.oracle.com/ord/dicom/attributeTag_1_0"
 xmlns:dt="http://xmlns.oracle.com/ord/dicom/datatype_1_0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.oracle.com/ord/dicom/attributeTag_1_0
 http://xmlns.oracle.com/ord/dicom/attributeTag_1_0">
  <DOCUMENT_HEADER>
    <dt:DOCUMENT_CHANGE_LOG>
      <dt:DOCUMENT_MODIFIER>ORACLE</dt:DOCUMENT_MODIFIER>
      <dt:DOCUMENT_MODIFICATION_DATE>2009-02-25</dt:DOCUMENT_MODIFICATION_DATE>
      <dt:DOCUMENT_VERSION>1.0</dt:DOCUMENT_VERSION>
    </dt:DOCUMENT_CHANGE_LOG>
  </DOCUMENT_HEADER>
  <ATTRIBUTE_TAG>00020002</ATTRIBUTE_TAG>
  <ATTRIBUTE_TAG>00020003</ATTRIBUTE_TAG>
  <ATTRIBUTE_TAG>00100010</ATTRIBUTE_TAG>
</ATTRIBUTE_TAG_LIST>

10.4.2 ストアド・タグ・リスト・ドキュメントの生成と挿入

制約ドキュメントおよびマッピング・ドキュメントが格納された既存のリポジトリがある場合は、既存の制約ドキュメントおよびマッピング・ドキュメントで使用されているタグからストアド・タグ・リスト・ドキュメントを生成し、必要に応じてタグを変更して、そのストアド・タグ・リスト・ドキュメントをリポジトリに挿入できます。

ストアド・タグ・リストに含める属性に対して固有のルールを適用するには、それらの属性ルールを定義するプリファレンス・ドキュメントを挿入します。例10-2に、マッピング・ドキュメントおよび制約ドキュメントの属性タグ要求ルールを適用するプリファレンス・ドキュメント(sample_pf.xml)を示します。この操作を実行するコード文は、太字で強調表示しています。

MANDATE_ATTR_TAGS_IN_STLパラメータの値がtrueに設定されているため、制約ドキュメントおよびマッピング・ドキュメントで使用されているすべてのタグがストアド・タグ・リスト・ドキュメントにリストされます。プリファレンス・ドキュメントでのこのパラメータの定義の詳細は、「MANDATE_ATTR_TAGS_IN_STLプリファレンス・パラメータの定義」を参照してください。

この方法では、前提となる次のタスクが完了していると想定しています。

ディレクトリ・オブジェクト(DICOMDIR)が作成済で、読取りおよび書込みアクセス権が管理者に付与されている。

ストアド・タグ・リスト・ドキュメントを生成してリポジトリに挿入するには、次の手順を実行します。

手順1   データ・モデルの編集

「サンプル・セッション1: 2つのドキュメントの挿入」の場合と同様に、データ・モデルを編集するための準備をして、他の管理者が同時に変更できないようにロックします。たとえば、

exec ord_dicom_admin.editDataModel();

データ・モデルは、変更をパブリッシュするか、ロールバック操作を実行するか、またはセッションを終了するまで、ロックされたままです。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select doc_name from orddcm_documents order by doc_id asc;

ドキュメントのリストを確認して、リポジトリに存在するドキュメントを確認します。

ステップ2: ストアド・タグ・リスト・ドキュメントの生成およびファイルへのエクスポート

ストアド・タグ・リスト・ドキュメントを生成して、ストアド・タグ・リスト・ドキュメント例のファイル(sample_stl.xml)にエクスポートします(例10-3を参照)。

ステップ3 (オプション): ストアド・タグ・リスト・ドキュメントの編集

XMLエディタを使用して、ステップ2でエクスポートされたストアド・タグ・リスト・ドキュメント・ファイルを編集します。リポジトリに挿入する前に、必要に応じてタグを変更して変更内容を保存し、ファイルに対するアクセス権を確認します。

ステップ4: ストアド・タグ・リスト・ドキュメントの挿入

次のようにして、生成されたストアド・タグ・リスト・ドキュメント(sample_stl.xml)を挿入します。

ord_dicom_admin.insertDocument(
                        'sample_stl.xml', 
                        'STORED_TAG_LIST',
                         xmltype(bfilename('DICOMDIR', 'sample_stl.xml'),
                         nls_charset_id('AL32UTF8') ) );
ステップ5 (オプション): 必須属性タグ・ルールの適用

必須属性タグルールを適用するには、次のように、MANDATE_ATTR_TAGS_IN_STLパラメータの値をtrueに設定したプリファレンス・ドキュメントを挿入します。

 exec ord_dicom_admin.insertDocument(
                           'sample_pf.xml', 
                           'PREFERENCE',
                            xmltype(bfilename('DICOMDIR', 'sample_pf.xml'),
                            nls_charset_id('AL32UTF8') ) );

このルールを適用するプリファレンス・ドキュメントの例については、例10-2を参照してください。

注:

プリファレンス・ドキュメントでMANDATE_ATTR_TAGS_IN_STLパラメータがtrueに設定されている場合は、ストアド・タグ・リスト・ドキュメントにリストされていないタグが含まれるマッピング・ドキュメントや制約ドキュメントを挿入しようとしても、それらのドキュメントはリポジトリに挿入されません。このプリファレンス・パラメータの詳細は、「MANDATE_ATTR_TAGS_IN_STLプリファレンス・パラメータの定義」を参照してください。

次のコマンドを入力して、orddcm_documentsビューを問い合せることもできます。

select * from orddcm_documents order by doc_id asc;

ドキュメントのリストを確認します。

手順6   変更のパブリッシュ

次のコマンドを実行し、変更をパブリッシュしてデータ・モデルのロックを解除します。

exec  ord_dicom_admin.publishDataModel;

例10-2 必須属性タグ・ルールのサンプル・プリファレンス・ドキュメント

<?xml version="1.0" encoding="UTF-8"?>
<DICOM_RUNTIME_PREFERENCES xmlns="http://xmlns.oracle.com/ord/dicom/preference_1_0"
  xmlns:dt="http://xmlns.oracle.com/ord/dicom/datatype_1_0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://xmlns.oracle.com/ord/dicom/preference_1_0 
  http://xmlns.oracle.com/ord/dicom/preference_1_0">
 <DOCUMENT_HEADER>
  <dt:DOCUMENT_CHANGE_LOG>
   <dt:DOCUMENT_MODIFIER>Developer 1</dt:DOCUMENT_MODIFIER>
   <dt:DOCUMENT_MODIFICATION_DATE>2009-02-20</dt:DOCUMENT_MODIFICATION_DATE>
   <dt:DOCUMENT_VERSION>0.2</dt:DOCUMENT_VERSION>
   <dt:MODIFICATION_COMMENT> enable MANDATE_ATTR_TAGS_IN_STL</dt:MODIFICATION_COMMENT>
  </dt:DOCUMENT_CHANGE_LOG>
 </DOCUMENT_HEADER>
 <PREFERENCE_DEF>
  <PARAMETER>MANDATE_ATTR_TAGS_IN_STL</PARAMETER>
  <DESCRIPTION> allowed values true or false</DESCRIPTION>
  <VALUE>true</VALUE>
 </PREFERENCE_DEF>
</DICOM_RUNTIME_PREFERENCES>

例10-3 ストアド・タグ・リスト・ドキュメントの生成およびファイルへのエクスポート

--
-- Generate a tag list document and store in sample_stl.xml
-- in DICOMDIR
--
-- A stored tag list document must include all tags used by
-- mapping and constraint documents in the repository
-- to enforce the mandate_attr_tags_in_stl rule using a
-- preference document.
--
-- Use the 'ALL' option to ensure that the generated tag list
-- document contains all the tags used by mapping and constraint
-- documents.
--
set serveroutput on;
declare
  fid           UTL_FILE.FILE_TYPE;
  buf           VARCHAR2(32767);
  bytesLeft     INTEGER;
  pos           INTEGER;
  chunk         INTEGER;
  xml_clob      CLOB;
  xt            XMLType;
BEGIN

   xt := ORD_DICOM_ADMIN.generateTagListDocument('ALL');
   if (xt is null) then
    dbms_output.put_line('Repository has no documents');
    dbms_output.put_line('Tag list document is null');
    return;
   end if;

    -- write xml document to file using UTL_FILE
    -- let UTL_FILE report errors for directory and filename
    fid := utl_file.fopen( 'DICOMDIR', 'sample_stl.xml', 'w', 32767 );
 
 
    -- Read from clob and write to file
    select XMLSerialize(document xt as clob)        into xml_clob from dual;
    bytesLeft := dbms_lob.getLength( xml_clob );
    pos       := 1;
    WHILE bytesLeft > 0 loop
      chunk := 32767;
      IF bytesLeft < chunk THEN
        chunk := bytesLeft;
      END IF;
      dbms_lob.read(xml_clob, chunk, pos, buf );
      utl_file.put( fid, buf);  
      utl_file.fflush(fid);
      bytesLeft := bytesLeft - chunk;
      pos := pos + chunk;
    end loop;
 
    utl_file.fclose( fid );
 
    --free the temporary blob returned by xmltype
    if(dbms_lob.isTemporary(xml_clob) <> 0) then
      dbms_lob.freeTemporary(xml_clob);
    end if;
 
 
   exception
   WHEN OTHERS then
    -- free temp lobs
    if(dbms_lob.isTemporary(xml_clob) <> 0) then
      dbms_lob.freeTemporary(xml_clob);
    end if;
 
    raise;   -- original exception
END;
/