このセクションでは、ビジネス・オブジェクトの動詞の処理における以下の点について説明します。
- 動詞の判別では、コネクターがそれぞれのソース・ビジネス・オブジェクトごとに使用する動詞を決定する方法を説明します。
- 変更後イメージと差分では、用語を定義し、コネクターが変更後イメージを扱う方法を説明します。
- 動詞の処理では、ビジネス・オブジェクトを作成、検索、更新および削除を行う際に、コネクターが実行するステップを説明します。
- SQL ステートメントでは、コネクターが単純な SQL ステートメントを使用して選択、更新、検索、または削除の操作を行う方法を説明します。
- ストアード・プロシージャーでは、コネクターがストアード・プロシージャーを使用する方法を説明します。
- トランザクション・コミットとロールバックでは、コネクターがトランザクション・ブロックを使用する方法を簡単に説明します。
最上位ビジネス・オブジェクト、およびその子にあたる個別ビジネス・オブジェクトには、それぞれ別々に動詞を格納することができます。したがって、親ビジネス・オブジェクトと子ビジネス・オブジェクトで動詞が異なるビジネス・オブジェクトが、統合ブローカーからコネクターに渡される場合があります。この場合、コネクターでは、最上位の親ビジネス・オブジェクトの動詞を参照して、ビジネス・オブジェクト全体をどのように処理するかを決定します。詳細については、動詞の処理を参照してください。
変更後イメージとは、すべての変更が行われた後のビジネス・オブジェクトの状態のことです。差分とは、更新操作で使用される、キー値および変更対象のデータのみを含むビジネス・オブジェクトのことです。コネクターは変更後イメージのみをサポートしているため、更新用のビジネス・オブジェクトを受信した場合には、そのビジネス・オブジェクトが、データの更新後のあるべき状態を表していると見なします。
したがって、統合ブローカーからビジネス・オブジェクトが Update 動詞とともに送信された場合、コネクターは、そのビジネス・オブジェクトのデータベースにおける現在の表現を変更して、ソース・ビジネス・オブジェクトに厳密に一致させます。これを行うため、コネクターは、単純属性の値の変更や、子ビジネス・オブジェクトの追加または除去を実行します。
例えば、データベース内の Contract 2345 の現在の状態が次のとおりである場合を想定します。

さらに、統合ブローカーが、次に示すビジネス・オブジェクトをコネクターに受け渡すと想定します。

コネクターは、更新処理を行うため、次の変更をデータベースに適用します。
- Contract ビジネス・オブジェクト (最上位) および Address ビジネス・オブジェクトの単純属性の更新
- Phone ビジネス・オブジェクトの作成
- 子ビジネス・オブジェクト A、B、F、および G の単純属性の更新
- 子ビジネス・オブジェクト C、D、および E の削除
- 子ビジネス・オブジェクト H、I、および J の作成
コネクターでは、統合ブローカーから受信した各ビジネス・オブジェクトについても、変更後イメージを表していると見なされます。このため、このコネクターに送信されるどの更新用ビジネス・オブジェクトにも、既存の有効な子ビジネス・オブジェクトのすべてが含まれるよう注意する必要があります。子ビジネス・オブジェクトの中に単純属性がまったく変更されていないものがある場合にも、その子ビジネス・オブジェクトがソース・ビジネス・オブジェクトに含まれていなければなりません。
ただし、一部のコネクターについては、更新操作時に欠落している子ビジネス・オブジェクトが削除されるのを防ぐ方法があります。子 (または子の配列) を表す属性のアプリケーション固有情報を使用して、コネクターに対し、ソース・ビジネス・オブジェクトに含まれない子ビジネス・オブジェクトを保持するよう指示することができます。これを行うには、KEEP_RELATIONSHIP を true に設定します。詳細については、属性の外部キーの指定を参照してください。
このセクションでは、コネクターが統合ブローカーから受信したビジネス・オブジェクトを作成、検索、更新、または削除するときに実行するステップについて、概説します。コネクターでは、階層ビジネス・オブジェクトを再帰的に処理します。つまり、個別ビジネス・オブジェクトがすべて処理されるまで、同じステップを子ビジネス・オブジェクトごとに実行します。
- 注:
- ラッパーである最上位ビジネス・オブジェクトは、create、retrieve、update、および delete 動詞をサポートします。ラッパー・オブジェクトの処理で唯一異なる点は、ラッパー・オブジェクトが処理されずにラッパー・オブジェクトに含まれるオブジェクトのみが処理されるということです。
以下に概説する処理のさまざまなポイントで、コネクターは 2 つのビジネス・オブジェクトを比較し、それらが同一であるかどうかを確認します。例えば、更新操作時には、ビジネス・オブジェクトの配列内に、特定のビジネス・オブジェクトが存在するかどうかを判定します。コネクターは、この検査を行うため、その特定のビジネス・オブジェクトを配列内のビジネス・オブジェクトのそれぞれと比較します。2 つのビジネス・オブジェクトが同一であるのは、次の 2 つの条件が満たされている場合です。
- 比較されている 2 つのビジネス・オブジェクトのタイプが一致していること。例えば、Customer ビジネス・オブジェクトと Contact ビジネス・オブジェクトの属性がすべて一致している場合でも、これらのビジネス・オブジェクトが同一であると見なされることはありません。
- 2 つのビジネス・オブジェクトの、対応するキー属性のすべてに、同一の値が格納されていること。あるキー属性が両方のビジネス・オブジェクトで CxIgnore に設定されている場合、コネクターでは、それらのキー属性を同一と見なします。しかし、あるキー属性が一方のビジネス・オブジェクトでは CxIgnore に設定されており、もう一方のビジネス・オブジェクトではこの値に設定されていない場合には、それらのビジネス・オブジェクトは同一ではありません。
コネクターは、ビジネス・オブジェクトの作成時に、2 つの状況のいずれかを戻します。戻される状況は、操作が正常に終了した場合 (操作によってビジネス・オブジェクトの変更が生じたかどうかを問いません) は VALCHANGE、操作が失敗した場合は FAIL です。
コネクターでは、階層ビジネス・オブジェクトの作成時に、以下のステップを実行します。
- 所有関係にある単一カーディナリティーの子ビジネス・オブジェクトのすべてを、データベース内に再帰的に挿入します。つまり、コネクターは、子ビジネス・オブジェクトおよびその子孫にあたるビジネス・オブジェクトのすべてを作成します。
ビジネス・オブジェクト定義上ある属性がある単一カーディナリティーの関係の子ビジネス・オブジェクトを表すものとされている場合に、その属性が空になっていると、コネクターはその属性を無視します。ただし、ビジネス・オブジェクト定義上、その属性が子を表すことが必須であるにもかかわらず、子を表していない場合には、コネクターはエラーを戻して処理を停止します。
- 所有関係にない単一カーディナリティーの子ビジネス・オブジェクトを、次のようにしてすべて処理します。
- 統合ブローカーから渡されたキー値を使用して、データベース内で子の検索を再帰的に試行します。
- 検索に失敗した場合 (子がデータベースに現存しないことを意味します)、コネクターはエラーを戻して処理を停止します。検索に成功した場合、コネクターは子ビジネス・オブジェクトを再帰的に更新します。
- 注:
- アプリケーションのデータベースに子ビジネス・オブジェクトがすでに存在する場合、このアプローチが正しく機能するようにするため、子ビジネス・オブジェクトの基本キー属性が作成操作時に正しく相互参照されるようにしなければなりません。アプリケーションのデータベースに子ビジネス・オブジェクトが存在していない場合は、基本キー属性を CxBlank に設定してください。
- 最上位ビジネス・オブジェクトを、次のようにしてデータベース内に挿入します。
- 最上位ビジネス・オブジェクトの外部キー値を、対応する単一カーディナリティーの関係にある子ビジネス・オブジェクトの基本キー値に設定します。子ビジネス・オブジェクトの値は、データベース・シーケンスまたはカウンター、あるいはデータベース自体によって、子ビジネス・オブジェクトの作成時に設定される場合があります。そのため、このステップでは、コネクターが親をデータベースに挿入する前に、親の外部キー値を正しいものにします。
- データベースによって自動的に設定される属性のそれぞれに対して、新しい固有 ID 値を生成します。データベース・シーケンスまたはカウンターの名前は、属性のアプリケーション固有情報に格納されています。属性にデータベース・シーケンスまたはカウンターが関連付けられている場合、コネクターによって生成された値により、統合ブローカーから渡された値が上書きされます。データベース・シーケンスまたはカウンターの指定については、単純属性のアプリケーション固有情報の UID=AUTO を参照してください。
- 属性のアプリケーション固有情報に含まれる CA (CopyAttribute) パラメーターの指定に従って、属性間で値をコピーします。CA パラメーターの使用については、単純属性のアプリケーション固有情報の CA=set_attr_name を参照してください。
- 最上位ビジネス・オブジェクトをデータベース内に挿入します。
- 注:
- ラッパーである最上位ビジネス・オブジェクトは、データベース内に挿入されません。
- 単一カーディナリティーの子ビジネス・オブジェクトのうち、親/子関係を子に保管するものすべてを、次のようにして処理します。
- 子の外部キー値を、親に含まれる対応する基本キー属性値を参照するように設定します。親の基本キー値は、親の作成時に生成されている可能性があります。そのため、ここでは、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値を正しいものにします。
- 子をデータベースに挿入します。
- 複数カーディナリティーの子ビジネス・オブジェクトのすべてを、次のようにして処理します。
- それぞれの子の外部キー値を、親に含まれる対応する基本キー属性値を参照するように設定します。親の基本キー値は、親の作成時に生成されている可能性があります。そのため、ここでは、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値を正しいものにします。
- 複数カーディナリティーの子ビジネス・オブジェクトのすべてを、データベースに挿入します。
コネクターでは、階層ビジネス・オブジェクトの検索時に、以下のステップを実行します。
- 統合ブローカーで受信した最上位ビジネス・オブジェクトから、すべての子ビジネス・オブジェクトを削除します。
- 最上位ビジネス・オブジェクトを、データベース内で検索します。
- 検索の結果戻された行が 1 つの場合、コネクターは処理を継続します。
- 検索の結果戻された行がない場合 (目的の最上位ビジネス・オブジェクトがデータベース内に存在しないことを意味します)、コネクターは BO_DOES_NOT_EXIST を戻します。
- 検索の結果戻された行が複数ある場合、コネクターは FAIL を戻します。
- 注:
- ビジネス・オブジェクトには、どのデータベース列にも対応しない属性 (プレースホルダー属性など) が含まれていることがあります。コネクターが、検索時に最上位ビジネス・オブジェクトのそのような属性を変更することはありません (それらの属性は、統合ブローカーから受信した値に設定されたまま保持されます)。子ビジネス・オブジェクトのそのような属性については、検索時にコネクターによってデフォルト値に設定されます。
- 注:
- ラッパーである最上位ビジネス・オブジェクトには、ラッパー・オブジェクトの直下にあるオブジェクトのすべての属性値が含まれている必要があります。この値はキーおよびプレースホルダー属性などのオブジェクトの検索に必要となります。ラッパー・オブジェクトにはすべてのキーおよびプレースホルダー属性が取り込まれる必要があります。ラッパーの 1 レベル下のオブジェクトで外部キーとして使用されるラッパー・オブジェクトの単純属性は、ラッパー・オブジェクトのキーとしてマークされる必要があります。
- 複数カーディナリティーの子ビジネス・オブジェクトのすべてを、再帰的に検索します。
- 注:
- コネクターは、ビジネス・オブジェクトの配列を検索するときに、一意性を保証しません。一意性の保証は、データベース側で行われなければなりません。データベースから戻された子ビジネス・オブジェクトに重複があると、コネクターは、それらの重複する子を戻します。
- 単一カーディナリティーの子を、所有関係にあるかどうかを問わず、すべて再帰的に検索します。
- 注:
- 単一カーディナリティーの子ビジネス・オブジェクトは、すべて、親ビジネス・オブジェクト内での出現順序に従って、親ビジネス・オブジェクトが処理される前に処理されます。子ビジネス・オブジェクトが所有されているかいないかは、処理シーケンスの決定には関係がありません。ただし、処理のタイプの決定には関係があります。
RetrieveByContent 動詞は、最上位ビジネス・オブジェクトに対してのみ適用できます。これは、最上位ビジネス・オブジェクトのみに含まれる属性を基に、コネクターによる検索が実行されるからです。
最上位ビジネス・オブジェクトに RetrieveByContent 動詞が使用されている場合は、非ヌル属性のすべて (非キー属性を含みます) が検索基準として使用されます。
複数の行が戻された場合、コネクターは最初の行を結果行として使用します。また、MULTIPLE_HITS を戻します。
- 注:
- RetrieveByContent 動詞はラッパーである最上位ビジネス・オブジェクトには適用されません。
コネクターは、ビジネス・オブジェクトの更新時に、2 つの状況のいずれかを戻します。戻される状況は、操作が正常に終了した場合 (操作によってビジネス・オブジェクトの変更が生じたかどうかを問いません) は VALCHANGE、操作が失敗した場合は FAIL です。コネクターは、Oracle データベースを操作する場合、データを検索している間、データ保全性を確保するためにデータをロックします。
コネクターでは、階層ビジネス・オブジェクトの更新時に、以下のステップを実行します。
- ソース・ビジネス・オブジェクトの基本キー値を使用して、データベース内の対応するエンティティーを検索します。検索されたビジネス・オブジェクトは、データベース内のデータの現在の状態を正確に表したものです。
- 最上位ビジネス・オブジェクトの子のうち、単一カーディナリティーのものすべてを再帰的に更新します。
ビジネス・オブジェクト定義上、ある属性がある子ビジネス・オブジェクトを表すことが必須である場合には、その子ビジネス・オブジェクトがソース・ビジネス・オブジェクトと検索されたビジネス・オブジェクトの両方に存在している必要があります。存在しない場合、更新は失敗し、コネクターはエラーを戻します。
コネクターでは、所有関係にある単一カーディナリティーの子を、次のいずれかの方法で処理します。
- ソース・ビジネス・オブジェクトおよび検索したビジネス・オブジェクトの両方に子が存在する場合、コネクターは、データベース内の既存の子を更新するのではなく、既存の子を削除して新規の子を作成します。
- その子がソース・ビジネス・オブジェクトには存在するにもかかわらず、検索されたビジネス・オブジェクトには存在しない場合は、データベース内にその子を再帰的に作成します。
- その子が検索されたビジネス・オブジェクトには存在するにもかかわらず、ソース・ビジネス・オブジェクトには存在しない場合は、データベース内のその子を再帰的に削除します。削除タイプが物理的であるか、論理的であるかはChildUpdatePhyDelete プロパティーの値に依存します。
所有関係にない単一カーディナリティーの子に関しては、コネクターは、ソース・ビジネス・オブジェクトに存在するそのような子のすべてを、データベースから検索しようとします。コネクターは、目的の子ビジネス・オブジェクトの検索に成功すると、その子ビジネス・オブジェクトを移植します。しかし、所有関係にない単一カーディナリティーの子ビジネス・オブジェクトは、コネクターによって変更されないものであるため、更新は行いません。
- 関係を親に保管する単一カーディナリティーの子ビジネス・オブジェクトに関しては、親に存在する外部キー値のそれぞれを、対応する単一カーディナリティーの子ビジネス・オブジェクトの基本キー値に設定します。このステップが必要なのは、これ以前のステップで単一カーディナリティーの子がデータベースに追加され、新しい固有 ID が生成されている可能性があるためです。
- 検索されたビジネス・オブジェクトの単純属性のすべてを更新します。ただし、ソース・ビジネス・オブジェクト内の対応する属性に値 CxIgnore が含まれるものを除きます。
更新されるビジネス・オブジェクトは一意である必要があるため、コネクターは、結果として 1 行のみが処理されることを確認します。1 つ以上の行が戻されている場合、コネクターはエラーを戻します。
- 親/子関係を子に保管する子ビジネス・オブジェクト (複数カーディナリティーであるか、単一カーディナリティーであるかを問いません) のそれぞれにおいて、外部キー値のすべてを、対応する親ビジネス・オブジェクトの基本キー値に設定します。(InterChange Server Express を統合ブローカーとして使用する場合は、通常、これらの値はデータ・マッピング時に相互参照されます。)
ただし、関係を子に保存する新しい子の外部キー値を、コネクターがそれらの子を更新する前に正しいものにするためには、このステップが重要です。
- 検索されたビジネス・オブジェクトの複数カーディナリティーの子のそれぞれを、次のいずれかの方法で処理します。
- その子がソース・ビジネス・オブジェクトの配列と検索されたビジネス・オブジェクトの配列の両方に存在する場合は、データベース内でその子を再帰的に更新します。
- その子がソース・ビジネス・オブジェクトの配列には存在しても、検索されたビジネス・オブジェクトの配列には存在しない場合は、データベース内でその子を再帰的に作成します。
- その子が検索されたビジネス・オブジェクトの配列には存在しても、ソース・ビジネス・オブジェクトの配列には存在しない場合は、データベースからその子を再帰的に削除します。ただし、親に含まれている、その子を表す属性のアプリケーション固有情報で、KEEP_RELATIONSHIP が true に設定されている場合を除きます。この場合、コネクターは、データベースからその子を削除しません。詳細については、属性の外部キーの指定を参照してください。削除タイプが物理的であるか、論理的であるかはChildUpdatePhyDelete プロパティーの値に依存します。
- 注:
- 統合ブローカーでは、ソース・ビジネス・オブジェクト内の複数カーディナリティーの関係にあるビジネス・オブジェクトがそれぞれ一意であること (つまり、ある配列に同一のビジネス・オブジェクトが複数含まれていないこと) を確認する必要があります。受信ソース・ビジネス・オブジェクトにおいて、1 つの配列に同じビジネス・オブジェクトが重複して存在していると、コネクターはそのビジネス・オブジェクトを 2 回処理します。これにより、予期しない結果が発生する可能性があります。
DeltaUpdate 動詞の処理は、Update 動詞の処理と以下の点で異なります。
- Update 動詞が処理される際には更新の前に検索が実行されますが、DeltaUpdate が処理される際には実行されません。
- 着信ビジネス・オブジェクトとデータベース内のビジネス・オブジェクトの比較が行われません。
- どの子も、各子オブジェクトに設定されている動詞セットに基づいて処理されます。子に動詞セットが設定されていない場合、コネクターはエラーを戻します。
コネクターは、ビジネス・オブジェクトの差分更新時に、VALCHANGE と FAIL のいずれかの状況を戻します。操作が正常に終了した場合 (操作によってビジネス・オブジェクトの変更が生じたかどうかを問いません) は VALCHANGE、操作が失敗した場合は FAIL です。
コネクターでは、階層ビジネス・オブジェクトの差分更新時に、以下のステップを実行します。
- 親オブジェクトの子のうち、単一カーディナリティーのものすべてを再帰的に処理します。ビジネス・オブジェクト定義で IsRequired が true に設定されている子は、インバウンド・オブジェクトに必ず存在していなければなりません。存在しない場合、差分更新は失敗し、コネクターはエラーを戻します。
- 親に含まれる外部キー値のうち、単一カーディナリティーの子の属性を参照するものすべてを、それぞれ対応する子の値に設定します。この処理が必要なのは、これ以前のステップで単一カーディナリティーの子がデータベースに追加され、新しいシーケンス値が生成されている可能性があるためです。
- 現在処理中のオブジェクトを、SQL UPDATE ステートメントまたはストアード・プロシージャーを使用して更新します。個々のビジネス・オブジェクトのすべての単純属性が更新されます。ただし、インバウンド・ビジネス・オブジェクトで IsIgnore に設定されている属性を除きます。コネクターでは、インバウンド・オブジェクトと現在のオブジェクトを属性レベルで比較して、UPDATE ステートメントに追加する必要がある属性を決定することはありません。つまり、属性はすべて更新されます。更新されるオブジェクトは一意である必要があるため、コネクターは、結果として 1 行のみが処理されることを確認します。複数の行が処理される場合、エラーが戻されます。
- 現在のオブジェクトの子のうち、カーディナリティーが N のものすべてで、親の属性を参照する外部キー値のすべてを、それぞれ対応する親の値に設定します。通常、これらの値はデータ・マッピング時に相互参照されます。ただし、これはカーディナリティーが N のコンテナーに含まれる新しい子には該当しないことがあります。ここでの処理により、カーディナリティーが N の子のすべてで、これらの子が更新される前に外部キー値を確実に正しい値にすることができます。
- 現在のオブジェクトの、カーディナリティーが N のコンテナーをすべて更新します。
子オブジェクトが処理されるときには、それぞれの子の動詞が取得されて適切な操作が実行されます。DeltaUpdate が処理される際に許可される子の動詞は、Create、Delete、および DeltaUpdate です。
- 子で Create 動詞が検出された場合、その子が所有関係にある子であれば、データベースにその子が作成されます。所有関係にない子に関しては、検索により、データベースに存在するかどうかが確認されます。
- 子で Delete 動詞が検出された場合、その子は削除されます。
- 子で DeltaUpdate 動詞が検出された場合、データベースでその子が更新されます。
コネクターは、ビジネス・オブジェクトの削除時には、操作に成功すると状況 SUCCESS を戻し、失敗すると状況 FAIL を戻します。アダプターは、まず親ビジネス・オブジェクトを検索します。次に、親から見て所有関係にある単一カーディナリティーの子のすべてを再帰的に削除してから、親ビジネス・オブジェクト自体を削除します。最後に、カーディナリティーが N の子をすべて削除します。所有関係にない単一カーディナリティーの子は削除されません。操作対象のビジネス・オブジェクトが存在しない場合、コネクターは FAIL を戻します。
コネクターはオブジェクトのアプリケーション固有情報にある 状況列名 (SCN) 値によって、論理的な削除も物理的な削除もサポートします。SCN 値が定義されている場合は、論理削除を実行します。SCN 値が定義されていない場合は、物理削除を実行します。
コネクターでは、階層ビジネス・オブジェクトの物理削除時に、以下のステップを実行します。
- 所有権付きで含まれている単一カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。
- 最上位ビジネス・オブジェクトを削除します。
- 複数カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。
- 注:
- ラッパーである最上位ビジネス・オブジェクトは対応するデータベース表を持たないため、データベースから削除されません。ラッパーの単純属性値はすべて無視されます。
ビジネス・オブジェクトの論理削除時には、コネクターは以下のステップを実行します。
- UPDATE を発行して、ビジネス・オブジェクトの状況属性を、ビジネス・オブジェクトのアプリケーション固有情報に指定されている値に設定します。コネクターでは、結果として 1 つのデータベース行だけが更新されることを確認します。それ以外の場合は、エラーを戻します。
- 所有関係にある単一カーディナリティーの子のすべて、および複数カーディナリティーの子のすべてに対し、論理削除を再帰的に実行します。コネクターは、所有関係にない単一カーディナリティーの子は削除しません。
コネクターでは、単純な SQL ステートメントを使用して、選択、更新、検索、または削除の操作を行うことができます。SQL ステートメント用の列名は、属性の AppSpecificInfo プロパティーから取得されます。各照会は、ビューに送付されていない限り、複数の表にまたがることはできません。
ストアード・プロシージャーとは、複数の SQL ステートメントのグループであり、1 つの論理単位を形成して特定のタスクを実行します。ストアード・プロシージャーは、コネクターがオブジェクトに対して実行する一連の操作または照会を、データベース・サーバー内にカプセル化したものです。
コネクターは、次の目的でストアード・プロシージャーを呼び出します。
- ビジネス・オブジェクトを処理する前に、操作準備処理を行う。
- ビジネス・オブジェクトを処理した後で、操作後処理を行う。
- 単純な INSERT、RETRIEVE、UPDATE、または DELETE ステートメントを使用せずにビジネス・オブジェクトに対して一連の操作を実行する。
コネクターでは、階層ビジネス・オブジェクトを処理するときに、ストアード・プロシージャーを使用して、最上位ビジネス・オブジェクトまたは任意の子ビジネス・オブジェクトを処理することができます。ただし、ビジネス・オブジェクト (またはビジネス・オブジェクトの配列) には、ストアード・プロシージャーが個別に用意されていなければなりません。
このセクションでは、コネクターからビジネス・オブジェクトに対してストアード・プロシージャーを使用する場合に、実行する必要があるステップについて説明します。このセクションの内容は、次のとおりです。
コネクターが処理されるストアード・プロシージャーがどのタイプでも、ビジネス・オブジェクトには特殊な種類の属性を追加しなければなりません。この属性は、ストアード・プロシージャーのタイプと、ストアード・プロシージャーを定義するアプリケーション固有情報のみを表します。標準的な単純属性で使用できるアプリケーション固有情報用のパラメーターは、これらの属性では使用しません。
使用されるストアード・プロシージャーのタイプに応じて属性を指定してください。例えば、コネクターに AfterUpdate および BeforeRetrieve ストアード・プロシージャーを使用させる場合には、AfterUpdateSP および BeforeRetrieveSP 属性を追加します。
コネクターでは、以下のビジネス・オブジェクト属性名が認識されます。
BeforeCreateSP
AfterCreateSP
CreateSP
BeforeUpdateSP
AfterUpdateSP
UpdateSP
BeforeDeleteSP
AfterDeleteSP
DeleteSP
BeforeRetrieveSP
AfterRetrieveSP
RetrieveSP
BeforeRetrieveByContentSP
AfterRetrieveByContentSP
RetrieveByContentSP
BeforeRetrieveUpdateSP
AfterRetrieveUpdateSP
RetrieveUpdateSP
- 注:
- コネクターに実行させるストアード・プロシージャーについてのみ、属性を作成してください。コネクターにビジネス・オブジェクトが送信される前に、これらの属性の値を指定するには、アプリケーション固有情報またはマッピング (InterChange Server Express を統合ブローカーとして使用する場合のみ) を使用します。これらの値に変更が加えられた場合に、それ以後のビジネス・オブジェクトに対するストアード・プロシージャーの呼び出しのためにコネクターにその変更を認識させるには、コネクターを再始動する必要があります。
ストアード・プロシージャーを指定するための構文
SPN=StoredProcedureName;RS=true|false[;IP=Attribute_Name1[:Attribute_Name2[:...]]]
[;OP=Attribute_Name1| RS[:Attribute_Name2| RS[:...]]]
[;IO=Attribute_Name1[:Attribute_Name2[:...]]]
ここで、以下のように説明されます。
- StoredProcedureName
- ストアード・プロシージャーの名前。
- RS
- ストアード・プロシージャーが結果セットを戻す場合は true、それ以外の場合は false。デフォルトは false です。この値が true である場合、属性のアプリケーション固有情報に含まれる ColumnName プロパティーは、結果セットの該当するカラムを指します。RS が出力パラメーター・リストの一部である場合は、その特定のパラメーターが結果セットを戻します。1 つの結果セット OUT パラメーターのみがサポートされます。複数の結果セットが OUT パラメーターとして戻された場合は、最初の結果セットのみが戻され、その他の結果セットはすべて無視されます。現在、この機能は Oracle 8i 以上、および Oracle JDBC ドライバーを使用するストアード・プロシージャーについてのみサポートされます。データベース内のストアード・プロシージャーの場合、対応するパラメーターは REFCURSOR タイプを戻します。
- IP
- 入力パラメーター。コネクターがストアード・プロシージャーの処理時に入力値として使用する値が格納されているビジネス・オブジェクト属性のリスト。
- OP
- 出力パラメーター。コネクターがストアード・プロシージャーの実行後に戻り値を格納するビジネス・オブジェクト属性のリスト。結果セットの記述については、RS を参照してください。
- IO
- 入出力パラメーター。コネクターが入力値として使用し、コネクターがストアード・プロシージャーの実行後に戻り値を格納するビジネス・オブジェクト属性のリスト。
- 注:
- StoredProcedureName、RS、およびパラメーターの間での順序は重要ですが、パラメーター同士の間での順序は重要ではありません。つまり、ストアード・プロシージャーのパラメーターがタイプ別にまとめて並べられていても、タイプによる区別なく並べられていても、コネクターの動作に違いは生じません。
複数の同じタイプのパラメーターがまとめて並べられている場合は、その値をコロンで区切ります。パラメーター名をそれぞれの値の前に繰り返す必要はありません。タイプの異なるパラメーターの間は、セミコロンで区切ります。パラメーターの値を指定するときには、等号 (=) の前後どちらにも、空白を入れません。
以下の例では、CustomerInsert および VendorInsert というストアード・プロシージャーを示します。これらのストアード・プロシージャーは、2 つの入力属性から値を取得して、4 つの出力属性に値を戻します。これらの例では、ストアード・プロシージャーの構造が異なっています。
- 同じタイプのパラメーターがまとめて並べられているものは、次のとおりです (IP、IP、OP、OP、OP、OP、IO)。
SPN=CustomerInsert;RS=false;IP=LastName:FirstName;OP=CustomerName:
CustomerID:ErrorStatus:ErrorMessage;IO=VendorID
- 同じタイプのパラメーターがまとめて並べられていないものは、次のとおりです (IP、OP、OP、OP、IP、IO、OP)。
SPN=VendorInsert;RS=false;IP=LastName;OP=CustomerName:
CustomerID:ErrorStatus;IP=FirstName;IO=VendorID;OP=ErrorMessage
コネクターは JDBC ドライバーがサポートする単純データ型のみをサポートします。
ストアード・プロシージャー名とパラメーター値を指定するには、2 つの方法があります。
- 属性の AppSpecificInfo プロパティー
ストアード・プロシージャーを指定するテキストの長さが 4000 バイト以下である場合は、属性の AppSpecificInfo プロパティーにその値を指定できます。このプロパティーを使用すると、コネクターがビジネス・オブジェクトのポーリングを実行済みである (つまり、ビジネス・オブジェクトがアプリケーション・イベントを表している) か、あるいはビジネス・オブジェクトを統合ブローカーからの要求として受信済みであるかに関係なく、ストアード・プロシージャーを指定することができます。
次の例では、アプリケーション固有情報を使用したストアード・プロシージャーの指定を示します。この場合、MaxLength プロパティーに指定されている値は、ストアード・プロシージャーにとって重要ではありません。
[Attribute]
Name = BeforeCreateSP
Type = String
MaxLength = 15
IsKey = false
IsRequired = false
AppSpecificInfo =SPN=ContactInsert;IP=LastName:FirstName;OP=CustomerName:
CustomerID:ErrorStatus:ErrorMessage
[End]
- 属性の値 (InterChange Server
Express を統合ブローカーとして使用する場合にのみ関係)
ストアード・プロシージャーを指定するテキストの長さが 4000 バイトを超える場合は、ストアード・プロシージャーの指定にマッピングを使用する必要があります。マッピングを使用したストアード・プロシージャーの指定は、ビジネス・オブジェクトが統合ブローカーからの要求を表している場合に限り可能です。つまり、コネクターがイベントをポーリングしている場合は、ストアード・プロシージャーの指定に属性の値を使用できません。
ストアード・プロシージャーを指定するテキストの長さが 4000 バイトを超えているため、ストアード・プロシージャーの指定にマッピングを使用する場合は、MaxLength プロパティーの値をテキスト全体の長さに合わせて必ず拡張してください。
- 注:
- 作成、更新、または削除操作を処理するストアード・プロシージャーが、子ビジネス・オブジェクトの配列が含まれる階層ビジネス・オブジェクトに対して実行されると、コネクターは各子ビジネス・オブジェクトを個別に処理します。例えば、コネクターは、BeforeCreate ストアード・プロシージャーを実行する場合、子ビジネス・オブジェクトの配列をまとめて処理せずに、その配列に含まれるメンバーをそれぞれ処理します。BeforeRetrieve ストアード・プロシージャーを処理する場合には、単一のビジネス・オブジェクトを操作します。AfterRetrieve ストアード・プロシージャーを処理する場合には、検索によって戻されたビジネス・オブジェクトのすべてを操作します。
以下のセクションでは、コネクターでのストアード・プロシージャーの処理方法について説明します。
Create ストアード・プロシージャーは、通常、コネクターが最上位ビジネス・オブジェクトの単純属性を設定するために使用する値を戻します。コネクターは、Create ストアード・プロシージャー (BeforeCreate、Create、AfterCreate) の処理時に以下のステップを実行します。
- ビジネス・オブジェクトが BeforeCreateSP 属性を含むかどうかをチェックします。含まれている場合、BeforeCreate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値をビジネス・オブジェクトの単純属性の値の設定に使用します。
- 単一カーディナリティーの子ビジネス・オブジェクトを作成します。
- 最上位ビジネス・オブジェクトの外部キー値のそれぞれを、単一カーディナリティーの子オブジェクトのそれぞれの基本キー値に設定します。
- ビジネス・オブジェクトが CreateSP 属性を含むかどうかをチェックします。含まれている場合、Create ストアード・プロシージャーを呼び出して、最上位ビジネス・オブジェクトを作成します。含まれていない場合は、INSERT ステートメントを作成して実行することにより、最上位ビジネス・オブジェクトを作成します。
- Create ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値をビジネス・オブジェクトの単純属性の値の設定に使用します。
- 複数カーディナリティーの子のそれぞれの外部キー値を、それらの親の基本キー属性の値に設定します。
- 複数カーディナリティーの子ビジネス・オブジェクトを作成します。
- ビジネス・オブジェクトが AfterCreateSP 属性を含むかどうかをチェックします。含まれている場合、AfterCreate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値を、ビジネス・オブジェクトの単純属性の値の設定に使用します。
コネクターはステップ 10 で戻された値を使用して、ステップ 3 またはステップ 5 で作成したビジネス・オブジェクトの値を変更できます。
Update ストアード・プロシージャーは、通常、コネクターが最上位ビジネス・オブジェクトの単純属性を設定するために使用する値を戻します。コネクターは、Update ストアード・プロシージャー (BeforeUpdate、Update、AfterUpdate) の処理時に以下のステップを実行します。
- ビジネス・オブジェクトが BeforeUpdateSP 属性を含むかどうかをチェックします。含まれている場合、BeforeUpdate ストアード・プロシージャーを呼び出します。
- BeforeUpdate ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値をビジネス・オブジェクトの単純属性の値の設定に使用します。
- 単一カーディナリティーの子ビジネス・オブジェクトを更新します。
- 最上位ビジネス・オブジェクトの外部キー値のそれぞれを、単一カーディナリティーの子オブジェクトのそれぞれの基本キー値に設定します。
- ビジネス・オブジェクトが UpdateSP 属性を含むかどうかをチェックします。含まれている場合、Update ストアード・プロシージャーを呼び出して、最上位ビジネス・オブジェクトを更新します。含まれていない場合は、UPDATE ステートメントを作成して実行することにより、最上位ビジネス・オブジェクトを更新します。
- Update ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値をビジネス・オブジェクトの単純属性の値の設定に使用します。
- 複数カーディナリティーの子の外部キー値を、親に含まれる対応する基本キー属性値を参照するように設定します。
- 複数カーディナリティーの子ビジネス・オブジェクトを更新します。
- ビジネス・オブジェクトが AfterUpdateSP 属性を含むかどうかをチェックします。含まれている場合、AfterUpdate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーから出力パラメーターを介して値が戻されれば、その値をビジネス・オブジェクトの単純属性の値の設定に使用します。
Delete ストアード・プロシージャーは、コネクターに値を戻しません。コネクターは、Delete ストアード・プロシージャー (BeforeDelete、Delete、AfterDelete) の処理時に以下のステップを実行します。
- ビジネス・オブジェクトが BeforeDeleteSP 属性を含むかどうかをチェックします。含まれている場合、BeforeDelete ストアード・プロシージャーを呼び出します。
- 単一カーディナリティーの子ビジネス・オブジェクトを削除します。
- 複数カーディナリティーの子ビジネス・オブジェクトを削除します。
- ビジネス・オブジェクトが DeleteSP 属性を含むかどうかをチェックします。含まれている場合、Delete ストアード・プロシージャーを呼び出して、最上位ビジネス・オブジェクトを削除します。含まれていない場合、DELETE ステートメントを作成して実行します。
- ビジネス・オブジェクトが AfterDeleteSP 属性を含むかどうかをチェックします。含まれている場合、AfterDelete ストアード・プロシージャーを呼び出します。
単純な検索操作を行う場合には、最上位ビジネス・オブジェクトや単一カーディナリティーの子の他、複数カーディナリティーの子に対しても、ストアード・プロシージャーを使用することができます。ストアード・プロシージャーの順序は、次のとおりです。
- BeforeRetrieve
- Retrieve
- AfterRetrieve
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトや複数カーディナリティーの子ビジネス・オブジェクトの検索の際に、一時オブジェクトを作成します。コネクターは、BeforeRetrieve ストアード・プロシージャーを一時ビジネス・オブジェクトに適用します。また、このコンテナー用に検索された子オブジェクトのそれぞれには、AfterRetrieve ストアード・プロシージャーが適用されます。
AfterRetrieve ストアード・プロシージャーが実行されるのは、ビジネス・オブジェクトのメタデータから動的に生成された Retrieve 照会または同名のストアード・プロシージャーが、ビジネス・オブジェクトに対して実行された後です。
JDBC の仕様によると、StoredProcedure 呼び出しには、次の 3 つのタイプがあります。
- {call <spName>(?,?,?)}
- {call <spName>}
- {?= call <spName>(?,?,?)}
コネクターでは、最初の 2 つのタイプがサポートされています。StoredProcedure から戻される ResultSet を処理します。
ストアード・プロシージャーの構文に RS=true と指定されている場合は、ストアード・プロシージャーから戻された結果セットが処理されます。RS=false の場合は、結果セットは処理されません。デフォルトでは、RS の値は false です。結果セットの値の処理が終了されてから、ストアード・プロシージャーの出力変数が処理されます。RS=true と指定されている場合、複数カーディナリティーの子では、関連するストアード・プロシージャーの出力変数を指定できません。
- 注:
- 結果セットの処理のサポートは、Retrieve 動詞操作および RetrieveSP に対してのみ提供されています。
Retrieve ストアード・プロシージャーから戻された結果セットに対し、ResultSetMetaData が取得されます。結果セット内のすべての列の値が取得され、ビジネス・オブジェクト内の対応する属性に格納されます。属性のアプリケーション固有情報の ColumnName プロパティーには、属性を列と突き合わせる ResultSet 列名が含まれている必要があります。
単一カーディナリティーのオブジェクトに関しては、対応する結果セットは 1 行のみで構成されています。複数の行が結果セット内に含まれて戻された場合、エラーが報告されます。
複数カーディナリティーの子に関しては、結果セットを介して複数の行が戻される場合があります。戻された行ごとに新しいオブジェクトが作成され、コンテナーに追加されます。このコンテナーは、その後親オブジェクトの必須属性索引に追加されます。
単純な「RetrieveByContent」操作を行う場合には、最上位ビジネス・オブジェクトとその単一カーディナリティーの子に対してのみ、ストアード・プロシージャーを使用することができます。つまり、結果セットまたは複数の行を戻すためにストアード・プロシージャーを使用することはできません。ストアード・プロシージャーの順序は、次のとおりです。
- BeforeRetrieveByContent
- RetrieveByContent
- AfterRetrieveByContent
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトや複数カーディナリティーの子ビジネス・オブジェクトの検索の際に、一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトに関しては、BeforeRetrieveByContent ストアード・プロシージャーが一時ビジネス・オブジェクトに適用されます。また、このコンテナー用に検索された子オブジェクトのそれぞれには、AfterRetrieveByContent ストアード・プロシージャーが適用されます。
AfterRetrieveByContent ストアード・プロシージャーが実行されるのは、ビジネス・オブジェクトのメタデータから動的に生成された RetrieveByContent 照会または同名のストアード・プロシージャーが、ビジネス・オブジェクトに対して実行された後です。このとき、階層ビジネス・オブジェクトの検索でもそのビジネス・オブジェクトの子ビジネス・オブジェクトが検索されるにもかかわらず、コネクターは、配列内のすべてのビジネス・オブジェクトに対して AfterRetrieveByContent ストアード・プロシージャーを実行します。
以下のストアード・プロシージャーが最上位ビジネス・オブジェクトに対して呼び出され、単純な Retrieve と同じ方法で、子ビジネス・オブジェクトのすべてを検索します。
ストアード・プロシージャーの順序は、次のとおりです。
- BeforeRetrieveUpdate
- RetrieveUpdate
- AfterRetrieveUpdate
これらのストアード・プロシージャーは、BeforeRetrieve および AfterRetrieve と同じ操作を実行します。これらの名前は異なっているため、別個の属性を作成して、コネクターに BeforeRetrieve 操作および BeforeRetrieveUpdate 操作を実行させるとともに、AfterRetrieve 操作および AfterRetrieveUpdate 操作を実行させることができます。
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトや複数カーディナリティーの子ビジネス・オブジェクトの検索の際に、一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトに関しては、BeforeRetrieveUpdate ストアード・プロシージャーが一時ビジネス・オブジェクトに適用されます。また、このコンテナー用に検索された子オブジェクトのそれぞれには、AfterRetrieveUpdate ストアード・プロシージャーが適用されます。
AfterRetrieveUpdate ストアード・プロシージャーが実行されるのは、ビジネス・オブジェクトのメタデータから動的に生成された RETRIEVE 照会または同名のストアード・プロシージャーが、ビジネス・オブジェクトに対して実行された後です。このとき、階層ビジネス・オブジェクトの検索でもそのビジネス・オブジェクトの子ビジネス・オブジェクトが検索されるにもかかわらず、コネクターは、配列内のすべてのビジネス・オブジェクトに対して AfterRetrieveUpdate ストアード・プロシージャーを実行します。
コネクターは、処理すべきビジネス・オブジェクトを受信すると、必ずトランザクション・ブロックを開始します。コネクターがそのビジネス・オブジェクトを処理するときに実行する SQL ステートメントのすべてが、そのトランザクション・ブロック内にカプセル化されます。コネクターは、そのビジネス・オブジェクトの処理に成功した場合には、処理の終了後、そのトランザクション・ブロックをコミットします。エラーが発生した場合は、トランザクションをロールバックします。
