Oracle Enterprise Service Busの相互参照機能を使用すると、様々なアプリケーションで作成された同等のエンティティのIDを関連付けることができます。たとえば、相互参照を使用して、あるアプリケーションで作成された顧客エンティティ(ネイティブIDはCust_100
)を、別のアプリケーションにおける同一顧客のエンティティ(ネイティブIDはCT_001
)に関連付けることができます。
この章では、相互参照を作成、移入および使用する方法について説明します。項目は次のとおりです。
通常、あるアプリケーションでオブジェクトを作成または更新した場合、その変更内容を別のアプリケーションにも伝播させる必要があります。たとえば、SAPアプリケーションで新規顧客が作成された場合、同じ顧客に関する新規エントリをOracle E-Business Suiteアプリケーション(EBS
)でも作成する必要があります。
ただし、統合対象の各アプリケーションでは、同じ情報の表現に異なるエンティティを使用している可能性があります。たとえば、SAPアプリケーションでの新規顧客の場合、Customer
データベースにはSAP_001
などの一意IDとともに新規の1行が挿入されます。この情報がOracle E-Business SuiteアプリケーションとSiebelアプリケーションに伝播するときには、EBS_1001
やSBL001
などの異なるIDとともに新規の1行が挿入される必要があります。このような場合、異なるアプリケーションで同一エンティティを参照するIDとして解釈できるように、各IDを相互にマップするなんらかの機能が必要になります。相互参照表を使用すると、このマッピングを実行できます。表8-1に、様々なアプリケーションの顧客IDに関する情報を含む相互参照表を示します。
また、あるアプリケーションで顧客情報が更新され、変更内容を他のアプリケーションにも伝播させる必要がある場合も、IDマッピングが必要になります。異なるIDを統合するには、相互参照表の全IDにマップする共通値統合パターンを使用する方法もあります。たとえば、表8-1の相互参照表に、さらにCommon
という1列を追加できます。更新後の相互参照表は、表8-2のようになります。
表8-2 Common列が追加された相互参照表
SAP | EBS | SBL | Common |
---|---|---|---|
SAP_001 |
EBS_1001 |
SBL001 |
CM001 |
SAP_002 |
EBS_1002 |
SBL002 |
CM002 |
図8-1に、共通値統合パターンを使用して様々なアプリケーションのIDをマップする方法を示します。
相互参照表は、メタデータと実際のデータという2つの部分で構成されています。メタデータは相互参照コマンドライン・ユーティリティにより作成され、リポジトリにXMLファイルとして格納されます。実際のデータは、データベースに格納されます。
相互参照表を使用すると、実行時に列の値を参照できます。ただし、相互参照を特定の値の参照に使用する前に、実行時に移入する必要があります。この操作は、相互参照XPath関数を使用して実行できます。XPath関数を使用すると、相互参照の移入、参照の実行および列の値の削除ができます。これらのXPath関数を「式ビルダー」ダイアログ・ボックスで使用して式を作成したり、XSLTマッパー・ダイアログ・ボックスで使用して変換を作成できます。
「式ビルダー」ダイアログ・ボックスは、「ルーティング・ルール」パネルで「式ビルダーの起動」アイコンをクリックすると表示されます。図8-2に、「式ビルダー」ダイアログ・ボックスで相互参照関数を選択する様子を示します。
XSLTマッパー・ダイアログ・ボックスは、XSLファイルを作成してXMLスキーマ間でデータを変換するときに表示されます。図8-3に、XSLTマッパー・ダイアログ・ボックスで相互参照関数を選択する様子を示します。
Oracle Enterprise Service Busには、相互参照管理に使用できるように一連のコマンドライン・ユーティリティが用意されています。名称はそれぞれxreftool、xrefimportおよびxrefexportです。
注意: これらのコマンドライン・ユーティリティを使用する前に、Oracle SOA Suite Serverを起動する必要があります。 |
xrefimportおよびxrefexportユーティリティを使用すると、相互参照のメタデータとデータをインポートおよびエクスポートできます。
xreftoolユーティリティを使用すると、相互参照表や列の作成など、相互参照のメタデータを作成できます。ただし、xreftoolコマンドを使用して相互参照表を移入することはできません。xreftoolコマンドを使用して相互参照表を変更および削除することもできます。xreftoolユーティリティを使用する手順は、次のとおりです。
環境変数としてOC4J_USERNAME
およびOC4J_PASSWORD
という2つの変数を作成します。
コマンド・プロンプトを起動します。
プロンプトから次のコマンドを入力します。
cd <ORACLE_HOME>\integration\esb\bin
プロンプトから次のコマンドを入力します。
xreftool -shell
このコマンドにより相互参照シェルが起動し、xreftoolコマンドを実行できます。
表8-3に、各種xreftoolコマンドを示します。
xreftoolユーティリティを使用すると、相互参照表を作成、変更および削除できます。相互参照表を作成するには、相互参照シェルで次のコマンドを使用します。
createTable TableName
たとえば、createTable customers
コマンドではcustomers
という相互参照表が作成されます。
注意: 表名と列名には、大/小文字区別がありません。 |
リポジトリに存在する相互参照表の全リストを表示するには、次のxreftoolコマンドを使用します。
listTables
列を追加または削除して、相互参照表を変更できます。表8-4に、相互参照表の変更に使用できる各種xreftoolユーティリティ・コマンドを示します。
表8-4 相互参照表の変更に使用するxreftoolコマンド
機能 | コマンド | 例 |
---|---|---|
相互参照表に1列を追加 |
|
|
相互参照表に複数列を追加 |
|
|
1列の削除 1列を削除すると、その列に対応するデータがデータベースから削除されます。 |
deleteColumn |
|
相互参照表の全列の表示 |
|
|
相互参照表を使用する前に、実行時に移入する必要があります。この操作は、XPath拡張関数を使用して実行できます。
xref:populateXRefRow
関数を使用すると、相互参照列に値を移入できます。この関数では、移入対象の相互参照値である文字列値が戻されます。xref:populateXRefRow
関数の構文は、次のとおりです。
xref:populateXRefRow(xrefTableName as string, xrefReferenceColumnName as string, xrefReferenceValue as string, xrefColumnName as string, xrefValue as string, mode as string) as string
xrefTableName
: 相互参照表の名称。
xrefReferenceColumnName
: 参照列の名称。
xrefReferenceValue
: 参照列名に対応する値。
xrefColumnName
: 移入される列の名称。
xrefValue
: 列に移入される値。
mode
: xref:populateXRefRow
関数の列移入モード。値ADD
、LINK
またはUPDATE
を指定できます。表8-5に、この3つのモードを示します。
表8-5 xref:populateXRefRow関数のモード
モード | 説明 | 例外の原因 |
---|---|---|
ADD |
参照値と追加対象の値を追加します。 たとえば、 |
例外は次の原因で発生する可能性があります。
|
LINK |
既存の参照値に対応する相互参照値を追加します。たとえば、 |
例外は次の原因で発生する可能性があります。
|
UPDATE |
既存の参照列と値のペアに対応する相互参照値を更新します。たとえば、 |
例外は次の原因で発生する可能性があります。
|
表8-6に、xref:populateXRefRow
関数のモードと各モードの例外条件を示します。
表8-6 xref:populateXRefRow関数のモードと結果
モード | 参照値 | 追加される値 | 結果 |
---|---|---|---|
ADD |
なし あり あり |
なし なし あり |
成功 例外 例外 |
LINK |
なし あり あり |
なし なし あり |
例外 成功 例外 |
UPDATE |
なし あり あり |
なし なし あり |
例外 例外 成功 |
xref:populateXRefRow
関数を変換に使用すると、次の手順で相互参照表の列を移入できます。
XSLTマッパー・ダイアログ・ボックスで、「ソース」ペインと「ターゲット」ペインのツリーを開きます。
ソース要素をターゲット要素にドラッグ・アンド・ドロップします。
「コンポーネント・パレット」で、下矢印をクリックして「Advanced Functions」を選択します。
ソース・オブジェクトをターゲット・オブジェクトに接続している線に、「populateXRefRow」をドラッグ・アンド・ドロップします。
接続線上に「populateXRefRow」アイコンが表示されます。
「populateXRefRow」アイコンをダブルクリックします。
図8-4のように、「関数の編集 – populateXRefRow」ダイアログ・ボックスが表示されます。
「関数の編集 – populateXRefRow」ダイアログ・ボックスの各フィールドで次の値を指定します。
「tableName」フィールドに、相互参照表の名称を入力します。
「referenceColumnName」フィールドに、相互参照列の名称を入力します。
「referenceValue」フィールドでは、値を手動で入力するか、[Ctrl]を押しながら[Space]を押してXPathビルディング・アシスタントを起動できます。[↑]および[↓]キーを押して、リスト内でオブジェクトを探し、[Enter]を押してそのオブジェクトを選択します。
「columnName」フィールドに、相互参照列の名称を入力します。
「value」フィールドでは、値を手動で入力するか、[Ctrl]を押しながら[Space]を押してXPathビルディング・アシスタントを起動できます。
「mode」フィールドに、相互参照表の列を移入する際のモード(ADD
など)を入力します。
「OK」をクリックします。
図8-5に、移入後の「関数の編集 – populateXRefRow」ダイアログ・ボックスを示します。
通常、あるシステム内の2つの値を別のシステム内の1つの値に対応付けることができます。たとえば、表8-7のように、SAP_001
およびSAP_0011
の値でEBSとSBLアプリケーションの1つの値を参照します。
相互参照表の1列に複数の値を移入するには、xref:populateXRefRow1M
関数を使用します。xref:populateXRefRow1M
関数の構文は、次のとおりです。
xref:populateXRefRow1M(xrefTableName as string, xrefReferenceColumnName as string, xrefReferenceValue as string, xrefColumnName as string, xrefValue as string, mode as string) as string
xrefTableName
: 相互参照表の名称。
xrefReferenceColumnName
: 参照列の名称。
xrefReferenceValue
: 参照列名に対応する値。
xrefColumnName
: 移入される列の名称。
xrefValue
: 列に移入される値。
mode
: xref:populateXRefRow
関数の列移入モード。値ADD
またはLINK
のいずれかを指定できます。表8-8に、この2つのモードを示します。
表8-8 xref:populateXRefRow1M関数のモード
モード | 説明 | 例外の原因 |
---|---|---|
ADD |
参照値と追加対象の値を追加します。たとえば、 |
例外は次の原因で発生する可能性があります。
|
LINK |
既存の参照値に対応する相互参照値を追加します。たとえば、 |
例外は次の原因で発生する可能性があります。
|
表8-9に、xref:populateXRefRow1M
関数のモードと各モードの例外条件を示します。
表8-9 xref:populateXRefRow1M関数のモードと結果
モード | 参照値 | 追加される値 | 結果 |
---|---|---|---|
ADD |
なし あり あり |
なし なし あり |
成功 例外 例外 |
LINK |
なし あり あり |
なし なし あり |
例外 成功 例外 |
xref:populateXRefRow1M
関数を使用する際の設計時ステップは、「xref:populateXRefRow関数の使用方法」で説明したxref:populateXRefRow
関数に類似しています。
移入後の相互参照表を使用して、値を参照できます。この操作は、XPath拡張関数を使用して実行できます。
xref:lookupXRef
関数を使用すると、参照列の特定の値に対応する値を相互参照列で参照できます。たとえば、次の関数では、表8-2で説明した相互参照表のCommon
列で、SAP
列のSAP_001
値に対応する値を参照します。
xref:lookupXRef("customers","SAP","SAP_001", "Common", true())
xref:lookupXRefRow
関数の構文は、次のとおりです。
xref:lookupXRef(xrefTableName as string, xrefReferenceColumnName as string, xrefReferenceValue as string, xrefColumnName as string, needAnException as boolean) as string
xrefTableName
: 相互参照表の名称。
xrefReferenceColumnName
: 参照列の名称。
xrefReferenceValue
: 参照列名に対応する値。
xrefColumnName
: 値が参照される列の名称。
needAnException
: true
またはfalse
を指定します。
needAnException
パラメータをtrue
に設定した場合、表で参照される値が見つからなければ例外がスローされます。needAnException
パラメータをfalse
に設定した場合、表で参照される値が見つからなければ空の値が戻されます。
次の原因で例外が発生する可能性があります。
指定した名称の相互参照表が見つからない場合
指定した列名が見つからない場合
指定した参照値が空の場合
複数の値が見つかった場合
xref:lookupXRef
関数を使用すると、変換中に次の手順で相互参照表の列を参照できます。
XSLTマッパー・ダイアログ・ボックスで、「ソース」ペインと「ターゲット」ペインのツリーを開きます。
ソース要素をターゲット要素にドラッグ・アンド・ドロップします。
「コンポーネント・パレット」で、下矢印をクリックして「Advanced Functions」を選択します。
ソース・オブジェクトをターゲット・オブジェクトに接続している線に、「lookupXRef」をドラッグ・アンド・ドロップします。
接続線上に「lookupXRef」アイコンが表示されます。
「lookupXRef」アイコンをダブルクリックします。
図8-6のように、「関数の編集 – lookupXRef」ダイアログ・ボックスが表示されます。
「関数の編集 – lookupXRef」ダイアログ・ボックスの各フィールドで次の値を指定します。
「tableName」フィールドに、相互参照表の名称を入力します。
「referenceColumnName」フィールドに、相互参照列の名称を入力します。
「referenceValue」フィールドでは、値を手動で入力するか、[Ctrl]を押しながら[Space]を押してXPathビルディング・アシスタントを起動できます。[↑]および[↓]キーを押して、リスト内でオブジェクトを探し、[Enter]を押してそのオブジェクトを選択します。
「columnName」フィールドに、相互参照列の名称を入力します。
「needAnException」フィールドで、値が見つからない場合に例外を発生させるにはYes、それ以外の場合はNoを入力します。
「OK」をクリックします。
図8-7に、移入後の「関数の編集 – lookupXRef」ダイアログ・ボックスを示します。
xref:lookupXRef1M
関数を使用すると、参照列の特定の値に対応する複数の値を相互参照列で参照できます。この関数では、複数のノードを含むノードセットが戻されます。ノードセット内の各ノードに値が含まれています。
たとえば、次の関数では、表8-7のSAP
列で、EBS
列のEBS_1001
値に対応する複数の値を参照します。
xref:lookupXRef1M("customers","EBS","EBS_1001", "Common", true())
xref:lookupXRefRow1M
関数の構文は、次のとおりです。
xref:lookupXRef1M(xrefTableName as string, xrefReferenceColumnName as string, xrefReferenceValue as string, xrefColumnName as string, needAnException as boolean) as node-set
xrefTableName
: 相互参照表の名称。
xrefReferenceColumnName
: 参照列の名称。
xrefReferenceValue
: 参照列名に対応する値。
xrefColumnName
: 値が参照される列の名称。
needAnException
: true
またはfalse
を指定します。
needAnException
パラメータをtrue
に設定した場合、表で参照される値が見つからなければ例外がスローされます。needAnException
パラメータをfalse
に設定した場合、表で参照される値が見つからなければ空の値が戻されます。
次の原因で例外が発生する可能性があります。
指定した名称の相互参照表が見つからない場合
指定した列名が見つからない場合
指定した参照値が空の場合
xref:lookupXRef1M
関数を使用する際の設計時ステップは、「xref:lookupXRef関数の使用方法」で説明したxref:lookupXRef
関数に類似しています。
xref:markForDelete
関数を使用すると、相互参照表の値を削除できます。列の値には、削除済のマークが付きます。この関数では、削除に成功した場合はtrue
、それ以外の場合はfalse
が戻されます。
相互参照表の行には、2つ以上のマッピングが必要です。そのため、1行にマッピングが2つしかない場合、値の1つに削除マークを付けると、他方の列の値も削除されます。
削除マークが付いている列値は、値が存在しないものとして処理されます。したがって、xref:populateXRefRow
関数をADD
モードで使用して同じ列を移入できます。
ただし、削除マークが付いた列値をxref:populateXRefRow
関数のLINK
モードで参照値として使用すると、エラーが発生します。
xref:markForDelete
関数の構文は、次のとおりです。
xref:markForDelete(xrefTableName as string, xrefColumnName as string, xrefValueToDelete as string) return as boolean
xrefTableName
: 相互参照表の名称。
xrefColumnName
: 値を削除する列の名称。
xrefValueToDelete
: 削除する値。
例外は次の原因で発生する可能性があります。
指定した名称の相互参照表が見つからない場合
指定した列名が見つからない場合
指定した値が空の場合
指定した値が列内で見つからない場合
複数の値が見つかった場合
XSLTマッパー・ダイアログ・ボックスで、「ソース」ペインと「ターゲット」ペインのツリーを開きます。
ソース要素をターゲット要素にドラッグ・アンド・ドロップします。
「コンポーネント・パレット」で、下矢印をクリックして「Advanced Functions」を選択します。
ソース・オブジェクトをターゲット・オブジェクトに接続している線に、「markForDelete」をドラッグ・アンド・ドロップします。
接続線上に「markForDelete」アイコンが表示されます。
「markForDelete」アイコンをダブルクリックします。
図8-8のように、「関数の編集 – markForDelete」ダイアログ・ボックスが表示されます。
「関数の編集 – markForDelete」ダイアログ・ボックスの各フィールドで次の値を指定します。
「tableName」フィールドに、相互参照表の名称を入力します。
「columnName」フィールドに、列の名称を入力します。
「value」フィールドでは、値を手動で入力するか、[Ctrl]を押しながら[Space]を押してXPathビルディング・アシスタントを起動できます。[↑]および[↓]キーを押して、リスト内でオブジェクトを探し、[Enter]を押してそのオブジェクトを選択します。
図8-9に、移入後の「関数の編集 – markForDelete」ダイアログ・ボックスを示します。
「OK」をクリックします。
xrefimportおよびxrefexportユーティリティを使用して、相互参照表をインポートおよびエクスポートできます。ただし、xrefimportおよびxrefexportユーティリティを使用する前に、次の環境変数を作成する必要があります。
DB_URL
: データベースの接続文字列を含みます。
例: jdbc:oracle:thin:@stapm21.us.oracle.com:1521:orcl
DB_USER
: 相互参照表を作成するスキーマのユーザー名。
例: DB_PASSWORD=oraesb
DB_PASSWORD
: DB_USER
変数で指定したユーザーに関連付けられているパスワード。
例: DB_USER=oraesb
注意: OC4J_USERNAME およびOC4J_PASSWORD 環境変数を事前に作成していない場合は、この2つの環境変数も作成する必要があります。 |
以降の各項では、相互参照表のインポート方法とエクスポート方法について説明します。
xrefexportユーティリティを使用すると、相互参照表のメタデータを値とともにエクスポートできます。エクスポートしたデータは、XMLファイルに格納されます。このXMLファイルのベースとなるスキーマの定義は、「相互参照用スキーマ定義(XSD)ファイル」を参照してください。エクスポートする表に値のない列が含まれている場合、エクスポートされたXMLファイルでは、欠落している列値が空のcell
要素で置換されます。
相互参照表をエクスポートするには、次のコマンドを使用します。
xrefexport -file FILENAME -table TABLENAME
FILENAME
およびTABLENAME
パラメータは必須です。FILENAME
パラメータでは、データのエクスポート先ファイルの場所を指定します。TABLENAME
パラメータでは、エクスポートする相互参照表の名称を指定します。
xrefimportユーティリティを使用すると、XMLファイルから相互参照表のメタデータをインポートできます。インポートするXMLファイルは、スキーマに基づく必要があります。スキーマの定義は、「相互参照用スキーマ定義(XSD)ファイル」を参照してください。
相互参照メタデータをインポートするには、次のコマンドを使用します。
xrefimport -file FILENAME [-mode <ignore | overwrite>] [ -generate <columnName>]
次のリストに、xrefimport関数の各種パラメータを示します。
FILENAME
: FILENAME
パラメータでは、データのインポート元ファイルの場所を指定します。
mode
: mode
パラメータでは、既存データとの競合の処理方法を指定します。mode
パラメータでは、値ignore
またはoverwrite
を指定できます。値ignore
は、既存のデータをリポジトリに保持する必要があることを示します。値overwrite
は、既存のデータをXMLファイル内のデータで上書きする必要があることを示します。modeパラメータはオプションであり、競合が存在する場合にのみ使用されます。デフォルト値はignore
です。
generate
: generate
パラメータを使用すると、メタデータのインポート中に1列を自動的に作成できます。たとえば、generate SAP
では、メタデータのインポート中にSAP
列が自動的に作成されます。
例8-1に、相互参照XSDファイルを示します。インポートされた相互参照XMLファイルはすべて、このスキーマ定義ファイルと照合して検証されます。スキーマ定義ファイル内の関数は、すべて次のネームスペースに存在する必要があります。
http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions
例8-1 相互参照XSDファイル
<?xml version="1.0" encoding="UTF-8" ?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xmlns.oracle.com/xref" xmlns:tns="http://xmlns.oracle.com/xref" elementFormDefault="qualified"> <element name="xref" type="tns:xrefType"/> <complexType name="xrefType"> <sequence> <element name="table"> <complexType> <sequence> <element name="columns" type="tns:columnsType" minOccurs="0" maxOccurs="1"/> <element name="rows" type="tns:rowsType" maxOccurs="1" minOccurs="0"/> </sequence> <attribute name="name" use="required"> <simpleType> <restriction base="string"> <minLength value="1"/> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> <complexType name="columnsType"> <sequence> <element name="column" minOccurs="1" maxOccurs="unbounded"> <complexType> <attribute name="name" use="required"> <simpleType> <restriction base="string"> <minLength value="1"/> </restriction> </simpleType> </attribute> </complexType> </element> </sequence> </complexType> <complexType name="rowsType"> <sequence> <element name="row" minOccurs="1" maxOccurs="unbounded"> <complexType> <sequence> <element name="cell" minOccurs="1" maxOccurs="unbounded"> <complexType> <simpleContent> <extension base="string"> <attribute name="colName" use="required"> <simpleType> <restriction base="string"> <minLength value="1"/> </restriction> </simpleType> </attribute> </extension> </simpleContent> </complexType> </element> </sequence> </complexType> </element> </sequence> </complexType> </schema>