ビジネス・オブジェクト動詞の処理
このセクションでは、ビジネス・オブジェクトの動詞を処理する次の点について説明します。
- 動詞の判別。それぞれの個々のソース・ビジネス・オブジェクトごとに使用する動詞を
コネクターがどのように判別するのかを説明します。
- 変更後イメージと差分。用語を定義し、コネクターが変更後イメージをどのように処理するのかを説明します。
- 動詞の処理。ビジネス・オブジェクトを作成、検索、更新、または削除する際にコネクターが行うステップについて説明します。
- ストアード・プロシージャー。ストアード・プロシージャーをコネクターがどのように使用するのかを説明します。
- トランザクション・コミットとロールバック。トランザクション・ブロックをコネクターがどのように使用するのかを簡単に
説明します。
動詞の判別
トップレベルのビジネス・オブジェクト、およびその個々の子ビジネス・オブジェクトのそれぞれに、独自の動詞を含めることができます。したがって、ビジネス・プロセスは、親ビジネス・オブジェクトおよび子ビジネス・オブジェクトに対して異なる動詞が含まれているビジネス・オブジェクトを
コネクターに受け渡すことができます。この受け渡しが行われるとき、コネクターは、トップレベルの親ビジネス・オブジェクトの動詞を使用して、ビジネス・オブジェクト全体を処理する方法を判別します。詳細については、動詞の処理を参照してください。
変更後イメージと差分
変更後イメージとは、ビジネス・オブジェクトに対してすべての変更が行われた後の
ビジネス・オブジェクトの状態のことです。差分とは、キー値および変更されるデータのみが含まれている、更新操作で使用されるビジネス・オブジェクトのことです。コネクターは、ビジネス・オブジェクトから更新対象のビジネス・オブジェクトを受け取るとき、変更後イメージのみをサポートします。したがって、コネクターは更新後の、データの本来あるべき状態をビジネス・オブジェクトが表すことを想定します。
そのため、ビジネス・プロセスで、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 つの条件を満たす必要があります。
- 比較するビジネス・オブジェクトのタイプが同じでなければならない。例えば、Customer ビジネス・オブジェクト
と Contact ビジネス・オブジェクトは、それらの属性のすべてが完全に同じであっても、同一とは見なされません。
- 2 つのビジネス・オブジェクトのすべての対応するキー属性に同一の値が含まれていなければならない。両方の
ビジネス・オブジェクトでキー属性が CxIgnore に設定されている場合には、コネクターはそれらを同一であると見なします。ただし、一方のビジネス・オブジェクトでキー属性が CxIgnore に設定されていても、他の一方のビジネス・オブジェクトで設定されていない場合には、これらのビジネス・オブジェクトは同一ではありません。
Create 操作
コネクターは、ビジネス・オブジェクトを作成するとき、操作が成功した場合には (操作によってビジネス・オブジェクトに変更が生じたかどうかには関係なく) VALCHANGE という、または操作が失敗した場合には FAIL という状況を戻します。
コネクターは、階層ビジネス・オブジェクトを作成するとき、次のステップを実行します。
- 所有権を持って含まれている、それぞれの単一カーディナリティーの子ビジネス・オブジェクトを
再帰的にデータベースに挿入します。すなわち、コネクターは、子とその子たちに含まれる、子およびすべての子ビジネス・オブジェクトを作成します。
ビジネス・オブジェクト定義で属性が単一カーディナリティーを持つ子ビジネス・オブジェクトを表し、その属性が空であると指定される場合、コネクターはその属性を無視します。ただし、ビジネス・オブジェクト定義でその属性が子を表すことが要求されていて、属性が子を表さない場合には、コネクターはエラーを戻し、処理を停止します。
- 所有権を持たずに含まれている、それぞれの単一カーディナリティーの子ビジネス・オブジェクトを次のように処理します。
- ビジネス・オブジェクトによって受け渡されたキー値を使用して、データベースから子の検索を再帰的に試行する。
- 検索が失敗して、データベースに子が現在存在しないことが示された場合には、コネクターはエラーを戻し、処理を停止する。検索が成功した場合には、コネクターは子ビジネス・オブジェクトを再帰的に更新します。
注:
子ビジネス・オブジェクトがアプリケーション・データベースにすでに存在するときに
この方法が正しく機能するためには、子ビジネス・オブジェクト内の基本キー属性が Create 操作で正しく相互参照されることを
確認する必要があります。子ビジネス・オブジェクトがアプリケーション・データベースにまだ存在しない場合には、基本キー属性を CxBlank に設定します。
- トップレベルのビジネス・オブジェクトをデータベースに次のように挿入します。
- その外部キー値のそれぞれを、単一カーディナリティーで表された、対応する子ビジネス・オブジェクトの基本キー値に設定する。子ビジネス・オブジェクト内の値は、子の作成時にデータベース・シーケンスあるいはカウンターによって、またはデータベース自体によって設定することができます。したがって、このステップでは、コネクターが親をデータベースに挿入する前に、親の外部キー値が正しいことが確認されます。
- データベースによって自動的に設定される、それぞれの属性ごとに、新しい固有の ID 値を生成する。データベース・シーケンスまたはカウンターの名前は、属性のアプリケーション固有の情報に格納されます。関連したデータベース・シーケンスまたはカウンターが属性にある場合には、コネクターによって生成される値がビジネス・プロセスによって受け渡される値を上書きします。データベース・
シーケンスまたはカウンターの指定の詳細については、単純属性のアプリケーション固有情報を参照してください。
- 属性の値を、属性のアプリケーション固有の情報の CA (CopyAttribute) パラメーターによって指定されたとおりに、別の属性の値にコピーする。CA パラメーターの使用の詳細については、単純属性のアプリケーション固有情報を参照してください。
- トップレベルのビジネス・オブジェクトをデータベースに挿入する。
注:
ラッパーであるトップレベルのビジネス・オブジェクトは、データベ
ース内に挿入されません。
- 親/子関係を子に格納する単一カーディナリティーの子ビジネス・オブジェクトをそれぞれ、次のように処理します。
- 子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定する。親の基本キー値は、親の作成時に生成された可能性があります。したがって、この設定によって、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値が正しいことを確認できます。
- 子をデータベースに挿入する。
- 複数カーディナリティーの子ビジネス・オブジェクトをそれぞれ、次のように処理します。
- それぞれの子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定する。親の基本キー値は、親の作成時に生成された可能性があります。したがって、この設定によって、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値が正しいことを確認できます。
- 複数カーディナリティーの子ビジネス・オブジェクトをそれぞれ、データベースに挿入する。
Retrieve 操作
コネクターは、階層ビジネス・オブジェクトを検索するとき、次のステップを実行します。
- すべての子ビジネス・オブジェクトを、ビジネス・プロセスから受け取った、トップレベルのビジネス・オブジェクトから除去します。
- トップレベルのビジネス・オブジェクトをデータベースから検索します。
- 検索が 1 行を戻す場合には、コネクターは処理を続行します。
- 検索がゼロ行を戻して、トップレベルのビジネス・オブジェクトがデータベースに存在しないことが示された場合には、コネクターは BO_DOES_NOT_EXIST を戻します。
- 検索が複数の行を戻す場合には、コネクターは FAIL を戻します。
注:
ビジネス・オブジェクトは、プレースホルダー属性などの、いずれのデータベース列にも対応しない属性を持つことができます。検索時に、コネクターはトップレベルのビジネス・オブジェクトでそのような属性を変更しません。そのため、そのような属性は、ビジネス・プロセスから受け取った値に設定された状態のままです。子ビジネス・オブジェクトで、検索時にコネクターはそのような属性をそのデフォルト値に設定します。
注:
ラッパーであるトップレベルのビジネス・オブジェクトには、ラッパー
・オブジェクトの直下にあるオブジェクトの任意の属性値が含まれている必要があ
ります。この値はキーおよびプレースホルダー属性などのオブジェクトの検索に必要
となります。ラッパー・オブジェクトにはすべてのキーおよびプレースホルダー属性
が取り込まれる必要があります。ラッパーの 1 レベル下のオブジェクトで外部キーとして使用されるラッパー・
オブジェクトの単純属性は、ラッパー・オブジェクトのキーとしてマークされる必
要があります。
- すべての複数カーディナリティーの子ビジネス・オブジェクトを再帰的に検索します。
注:
コネクターは、ビジネス・オブジェクトの配列を取り込むとき、一意性を強制しません。一意性の強制は、データベースが行います。データベースが重複した子ビジネス・オブジェクトを
戻す場合には、コネクターは重複した子をビジネス・プロセスに戻します。
- 子ビジネス・オブジェクトが所有権を持って含まれているか、持たずに含まれているかどうかに関係なく、単一カーディナリティーの子をそれぞれ、再帰的に検索します。
注:
単一カーディナリティーの子ビジネス・オブジェクトはすべて、その処理は、ビジネス・オブジェクトでの検索結果に基づいて、および親ビジネス・オブジェクトが処理される前に、行われます。子オブジェクトの所有権の有無では、処理シーケンスは決定されませんが、処理のタイプは決定されます。
RetrieveByContent 操作
RetrieveByContent 動詞は、トップレベルのビジネス・オブジェクトにのみ適用できます。コネクターは、トップレベルのビジネス・オブジェクト内の属性にのみ基づいて、検索を実行するからです。
トップレベルのビジネス・オブジェクトに RetrieveByContent 動詞が使用されている場合は、非 null 属性のすべて (非キー属性を含みます) が検索基準として使用されます。
複数の行が戻された場合には、コネクターは最初の行をリターン行として使用し、MULTIPLE_HITS を戻します。
注:
RetrieveByContent 動詞はラッパーであるトップレベルのビジネス・オブジェ
クトには適用されません。
Update 操作
コネクターは、ビジネス・オブジェクトを更新するとき、操作が成功した場合には (操作によってビジネス・オブジェクトに変更が生じたかどうかには関係なく) VALCHANGE という、または操作が失敗した場合には FAIL という状況を戻します。Oracle データベースを処理するとき、コネクターは、データ保全性を確保するために、データベース検索時にデータをロックします。
コネクターは、階層ビジネス・オブジェクトを更新するとき、次のステップを実行します。
- ソース・ビジネス・オブジェクトの基本キー値を使用して、対応するエンティティーをデータベースから検索します。検索したビジネス・オブジェクトは、データベース内のデータの現在の状態を正確に表します。
- 検索が失敗して、トップレベルのビジネス・オブジェクトがデータベースに存在しないことが示された場合には、コネクターは BO_DOES_NOT_EXIST を戻し、更新は失敗します。
注:
ラッパーであるトップレベルのビジネス・オブジェクトはデータベース内に存
在する必要はありません。ただし、ラッパー・オブジェクトの直下にあるオブジェクトのすべての属性値が含まれている必要があ
ります。この値はキーおよびプレースホルダー属性などのオブジェクトの検索に必
要となります。ラッパー・オブジェクトにはすべてのキーおよびプレースホルダー属性
が取り込まれる必要があります。ラッパーの 1 レベル下のオブジェクトで外部キーとして使用されるラッパー・
オブジェクトの単純属性は、ラッパー・オブジェクトのキーとしてマークされる必
要があります。
- 検索が成功した場合には、コネクターは、検索したビジネス・オブジェクトをソース・ビジネス・オブジェクトと比較して、データベースで変更を要求する子ビジネス・オブジェクトはどれかを判別します。ただし、コネクターは、ソース・ビジネス・オブジェクトの基本属性内の値を検索したビジネス・オブジェクト内の値と
比較しません。コネクターは、すべての非キー基本属性の値を更新します。
トップレベルのビジネス・オブジェクト内のすべての基本属性がキーを表す場合には、コネクターはトップレベルのビジネス・オブジェクトに対して更新照会を生成しません。この場合、コネクターは警告をログに記録し、ステップ 2 に進みます。
- トップレベルのビジネス・オブジェクトの単一カーディナリティーの子をすべて、再帰的に更新します。
ビジネス・オブジェクト定義で属性は子ビジネス・オブジェクトを表すことが要求される場合には、子は、ソース・ビジネス・オブジェクトおよび検索したビジネス・オブジェクトの両方に存在する必要があります。存在しない場合には、更新は失敗し、コネクターはエラーを戻します。
コネクターは、所有権を持って含まれている単一カーディナリティーの子を次の方法のいずれかで処理します。
- ソース・ビジネス・オブジェクトおよび検索したビジネス・オブジェクトの両方に子が存在する場合、コネクターは、データベース内の既存の子を更新するのではなく、既存の子を削除して新規の子を作成します。
- ソース・ビジネス・オブジェクトには子が存在するが、検索したビジネス・オブジェクトには子が存在しない場合には、コネクターはそれをデータベースで再帰的に作成します。
- 検索したビジネス・オブジェクトには子が存在するが、ソース・ビジネス・オブジェクトには子が存在しない場合には、コネクターはそれをデータベースから再帰的に削除します。削除のタイプ (物理または論理) は、その ChildUpdatePhyDelete プロパティーの値によって決まります。
所有権を持たずに含まれている単一カーディナリティーの子の場合、コネクターは、ソース・ビジネス・オブジェクトに存在するデータベースからすべての子の検索を試行します。コネクターは、子を正常に検索した場合、所有権を持たずに含まれている単一カーディナリティーの子はコネクターによって変更されることはないため、子ビジネス・オブジェクトを取り込みますが、更新はしません。
- 親に関係を格納する単一カーディナリティーの子ビジネス・オブジェクトは、親でのそれぞれの外部キー値を、対応する単一カーディナリティーの子ビジネス・オブジェクトの基本キーの値に設定します。直前のステップで
単一カーディナリティーの子がデータベースに追加され、新規の固有の ID が生成された可能性があるため、このステップは重要です。
- ソース・ビジネス・オブジェクト内の対応する属性に値 CxIgnore が含まれている基本属性を除いて、検索したビジネス・オブジェクトのすべての基本属性を更新します。
更新されるビジネス・オブジェクトは固有である必要があります。したがって、コネクターは、結果として 1 行のみが処理されることを検証します。複数の行が戻された場合には、コネクターはエラーを戻します。
- 親/子関係を子に格納する (複数カーディナリティーおよび単一カーディナリティーの両方とも) それぞれの子の
すべての外部キー値を、その対応する親ビジネス・オブジェクトの基本キー値に設定します。(InterChange Server Express が
統合ブローカーとして使用される場合には、これらの値は一般にデータ・マッピング時に相互参照されています。)ただし、このステップは、コネクターが新規の子を更新する前に、子の中に関係を格納するこれらの子の外部キー値が正しいことを確認するのに重要です。
- 検索したビジネス・オブジェクトのそれぞれの複数カーディナリティーの子を次の方法のいずれかで処理します。
- ソース・ビジネス・オブジェクトの配列および検索したビジネス・オブジェクトの配列の両方に子が存在する場合には、コネクターはそれをデータベースで再帰的に更新します。
- ソース配列には子が存在するが、検索したビジネス・オブジェクトの配列には子が存在しない場合には、コネクターはそれをデータベースで再帰的に作成します。
- 検索したビジネス・オブジェクトの配列には子が存在するが、ソース配列には子が存在しない場合には、親にある子を表す属性の、アプリケーション固有の情報で KEEP_RELATIONSHIP が true に設定されていないとき、コネクターはその子をデータベースから再帰的に削除します。このケースでは、コネクターは子をデータベースから削除しません。詳細については、属性の外部キーの指定を参照してください。削除のタイプ (物理または論理) は、その ChildUpdatePhyDelete プロパティーの値によって決まります。
注:
ビジネス・オブジェクトは、ソース・ビジネス・オブジェクトで複数カーディナリティーを持って含まれているビジネス・オブジェクトが
固有であること (すなわち、同じビジネス・オブジェクトの 2 つ以上のコピーが配列に含まれないこと) を
確認する必要があります。コネクターは、ソース配列でビジネス・オブジェクトの複製のコピーを受け取った場合には、ビジネス・オブジェクトを 2 度処理し、予測不能な結果が出る可能性があります。
DeltaUpdate 操作
DeltaUpdate 動詞の処理は、Update 動詞の処理と以下の点で異なります。
- Update 動詞が処理される際には更新の前に検索が実行されますが、DeltaUpdate が処理される際には実行されません。
- 着信ビジネス・オブジェクトとデータベース内のビジネス・オブジェクトの比較が行われません。
- どの子も、各子オブジェクトに設定されている動詞セットに基づいて処理されます。子に動詞セットが設定されていない場合、コネクターはエラーを戻します。
コネクターは、ビジネス・オブジェクトの差分更新時に、VALCHANGE と FAIL のいずれかの状況を戻します。操作が正常に終了した場合 (操作によってビジネス・オブジェクトの変更が生じたかどうかを問いません) は VALCHANGE、操作が失敗した場合は FAIL です。
コネクターでは、階層ビジネス・オブジェクトの差分更新時に、以下のステップを実行します。
- 親オブジェクトの子のうち、単一カーディナリティーのものすべてを再帰的に処理します。ビジネス・オブジェクト仕様で IsRequired とマークされている子は、インバウンド・オブジェクトに必ず存在していなければなりません。存在しない場合、差分更新は失敗し、コネクターはエラーを戻します。
- 親に含まれる外部キー値のうち、単一カーディナリティーの子の属性を参照するものすべてを、それぞれ対応する子の値に設定します。この処理が必要なのは、これ以前のステップで単一カーディナリティーの子がデータベースに追加され、新しいシーケンス値が生成されている可能性があるためです。
- 現在処理中のオブジェクトを、SQL UPDATE ステートメントまたはストアード・プロシージャーを使用して更新します。個々のビジネス・オブジェクトのすべての単純属性が更新されます。ただし、インバウンド・ビジネス・オブジェクトで IsIgnore に設定されている属性を除きます。コネクターでは、インバウンド・オブジェクトと現在のオブジェクトを属性レベルで比較して、UPDATE ステートメントに追加する必要がある属性を決定することはありません。つまり、属性はすべて更新されます。更新されるオブジェクトは一意である必要があるため、コネクターは、結果として 1 行のみが処理されることを確認します。複数の行が処理される場合、エラーが戻されます。
- 現在のオブジェクトの子のうち、カーディナリティーが N のものすべてで、親の属性を参照する外部キー値のすべてを、それぞれ対応する親の値に設定します。通常、これらの値はデータ・マッピング時に相互参照されます。ただし、これはカーディナリティーが N のコンテナーに含まれる新しい子には該当しないことがあります。ここでの処理により、カーディナリティーが N の子のすべてで、これらの子が更新される前に外部キー値を確実に正しい値にすることができます。
- 現在のオブジェクトの、カーディナリティーが N のコンテナーをすべて更新します。
子オブジェクトが処理されるときには、それぞれの子の動詞が取得されて適切な操作が実行されます。DeltaUpdate が処理される際に許可される子の動詞は、Create、Delete、および DeltaUpdate です。
- 子で Create 動詞が検出された場合、その子が所有関係にある子であれば、データベースにその子が作成されます。所有関係にない子に関しては、検索により、データベースに存在するかどうかが確認されます。
- 子で Delete 動詞が検出された場合、その子は削除されます。
- 子で DeltaUpdate 動詞が検出された場合、データベースでその子が更新されます。
Delete 操作
コネクターは、ビジネス・オブジェクトを削除するとき、操作が成功した場合には SUCCESS という、または操作が失敗した場合には FAIL という状況を戻します。アダプターは、まず親ビジネス・オブジェクトを検索します。次に、親から見て所有関係にある単一カーディナリティーの子のすべてを再帰的に削除してから、親ビジネス・オブジェクト自体を削除します。最後に、カーディナリティーが N の子をすべて削除します。所有関係にない単一カーディナリティーの子は削除されません。操作対象のビジネス・オブジェクトが存在しない場合、コネクターは FAIL を戻します。
コネクターはオブジェクトのアプリケーション固有情報にある状況列名 (SCN) 値によって、論理的な削除も物理的な削除もサポートします。SCN 値が定義されている場合には、コネクターは論理削除を実行します。SCN 値が定義されていない場合には、コネクターは物理削除を実行します。
物理削除
コネクターは、階層ビジネス・オブジェクトを物理的に削除するとき、次のステップを実行します。
- 所有権付きで含まれている単一カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。
- トップレベルのビジネス・オブジェクトを削除します。
- 複数カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。
注:
ラッパーであるトップレベルのビジネス・オブジェクトは対応するデータベース表
を持たないため、データベースから削除されません。ラッパーの単純属性値はすべて無視されます。
論理削除
ビジネス・オブジェクトを論理的に削除するとき、コネクターは次のステップを実行します。
- ビジネス・オブジェクトの状況属性をビジネス・オブジェクトのアプリケーション固有の情報で指定された値に
設定する UPDATE を発行します。コネクターは、結果として 1 つのデータベース行のみが
更新されることを確認します。そうでない場合には、エラーを戻します。
- 所有権を持って含まれているすべての単一カーディナリティーの子、およびすべての複数カーディナリティーの子を再帰的に論理削除します。コネクターは、所有権を持たずに含まれている単一カーディナリティーの子を削除しません。
SQL ステートメント
コネクターは、Select、Update、Retrieve、または Delete 操作に対して、単純な SQL ステートメントを使用できます。SQL ステートメントの列名は、属性の AppSpecificInfo プロパティーから生成されます。ビューに記述されていなければ、各クエリーが処理する表は 1 つのみです。
ストアード・プロシージャー
ストアード・プロシージャーとは、論理装置を構成し、特定のタスクを実行する SQL ステートメントのグループです。ストアード・プロシージャーは、データベース・サーバー内のオブジェクトでコネクターが実行する一組の操作または照会をカプセル化します。
コネクターはストアード・プロシージャーを次の環境で呼び出します。
- ビジネス・オブジェクトを処理する前に、操作前プロセスを実行する。
- ビジネス・オブジェクトを処理した後に、操作後プロセスを実行する。
- 単純な 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
BeforeDeltaUpdateSP
AfterDeltaUpdateSP
DeltaUpdateSP
注:
コネクターに実行させるストアード・プロシージャーのみに対して属性を作成します。アプリケーション固有の情報または
マッピング (統合ブローカーとして 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
- Input パラメーター: ストアード・プロシージャーの実行時にコネクターが入力値として使用する値の
ビジネス・オブジェクト属性のリスト。
- OP
- Output パラメーター: ストアード・プロシージャーの実行後にコネクターが値を戻す対象の
ビジネス・オブジェクト属性のリスト。結果セットの記述については、RS を参照してください。
- IO
- InputOutput パラメーター: ストアード・プロシージャーの実行後にコネクターが入力値として使用し、さらに、値を戻す対象のビジネス・オブジェクト属性のリスト。
注:
StoredProcedureName、RS、およびパラメーターの順序は重要です。パラメーター同士間の順序は重要ではありません。すなわち、ストアード・プロシージャーが各タイプのパラメーターをすべて
グループ化しても、またはパラメーターのタイプを混在させても、コネクターには問題ではありません。
同じタイプの複数のパラメーターを一緒にグループ化するときは、値をコロン区切り文字で区切ります。それぞれの値ごとにパラメーターの名前を繰り返す必要はありません。異なるタイプのパラメーターは、セミコロン区切り文字で区切ります。パラメーター値を指定するときは、等号 (=) の左右いずれにもブランク・スペースを入れません。
ストアード・プロシージャーの例
次の例では、2 つの入力属性から値を取得し、4 つの出力属性に
値を戻す、CustomerInsert および VendorInsert という
名前のストアード・プロシージャーが使用されます。これらの例に、ストアード・プロシージャーの異なる構造を示します。
- 同じタイプのパラメーターが一緒にグループ化されます (IP、IP、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 プロパティー
ストアード・プロシージャーを指定するテキストの長さが 4 キロバイト以下の場合には、属性の 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 を使用するときにのみ該当)
ストアード・プロシージャーを指定するテキストの長さが 4 キロバイトより大きい場合には、マッピングを使用してストアード・プロシージャーを指定する必要があります。ビジネス・オブジェクトが
統合ブローカー要求を表す場合にのみ、マッピングを使用してストアード・プロシージャーを指定できます。すなわち、コネクターがイベントに対してポーリングしているときは、属性の値を使用して
ストアード・プロシージャーを指定することはできません。
ストアード・プロシージャーのテキストの長さが 4 キロバイトより大きく、マッピングを使用して
それを指定する場合には、フル・テキストを収めることができるように MaxLength プロパティーの値を
拡張することを忘れないでください。
注:
Create、Update、または Delete 操作を処理するストアード・プロシージャーが、子ビジネス・オブジェクトの配列が含まれている階層ビジネス・オブジェクトで実行される場合には、コネクターはそれぞれの子ビジネス・オブジェクトを個々に処理します。例えば、コネクターは、BeforeCreate ストアード・プロシージャーを実行する場合、この配列を 1 つのユニットとして処理するのではなく、配列内のそれぞれのメンバーを処理します。コネクターは、BeforeRetrieve ストアード・プロシージャーを処理するとき、単一のビジネス・オブジェクトで操作します。コネクターは、AfterRetrieve ストアード・プロシージャーを
処理するとき、検索によって戻されたすべてのオブジェクト上で操作します。
ストアード・プロシージャーまたは単純な SQL ステートメントを使用したビジネス・オブジェクトの処理
次の各セクションでは、コネクターがストアード・プロシージャーをどのように処理するのかを説明します。
ビジネス・オブジェクトの Create 操作
Create ストアード・プロシージャーは通常、基本属性をトップレベルのビジネス・オブジェクトに取り込むためにコネクターが使用する
値を戻します。コネクターは、Create ストアード・プロシージャー (BeforeCreate、Create、AfterCreate) を
処理するときに、次のステップを実行します。
- BeforeCreateSP 属性がビジネス・オブジェクトに含まれているかどうかを
検査します。含まれている場合には、BeforeCreate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
- 単一カーディナリティーの子ビジネス・オブジェクトを作成します。
- それぞれのトップレベルのビジネス・オブジェクトの外部キー値を、それぞれの単一カーディナリティーの子ビジネス・オブジェクトの基本キー値に設定します。
- CreateSP 属性がビジネス・オブジェクトに含まれているかどうかを
検査します。含まれている場合には、Create ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを作成します。含まれていない場合には、INSERT ステートメントを
作成および実行して、トップレベルのビジネス・オブジェクトを作成します。
- Create ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
- それぞれの複数カーディナリティーの子の外部キー値をその親の基本キー属性の値に設定します。
- 複数カーディナリティーの子ビジネス・オブジェクトを作成します。
- AfterCreateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterCreate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
コネクターは、ステップ 10 で戻される値を使用して、ステップ 3 または 5 で作成したビジネス・オブジェクトの値を変更することができます。
ビジネス・オブジェクトの Update 操作
Update ストアード・プロシージャーは通常、基本属性をトップレベルのビジネス・オブジェクトに取り込むためにコネクターが使用する
値を戻します。コネクターは、Update ストアード・プロシージャー (BeforeUpdate、Update、AfterUpdate) を
処理するときに、次のステップを実行します。
- BeforeUpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを
検査します。含まれている場合には、BeforeUpdate ストアード・プロシージャーを呼び出します。
- BeforeUpdate ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
- 単一カーディナリティーの子ビジネス・オブジェクトを更新します。
- トップレベルのビジネス・オブジェクトの外部キー値をそれぞれ、単一カーディナリティーを持つ、それぞれの子ビジネス・オブジェクトの基本キー値に設定します。
- UpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、Update ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを更新します。含まれていない場合には、UPDATE ステートメントを
作成および実行して、トップレベルのビジネス・オブジェクトを更新します。
- Update ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
- 複数カーディナリティーの子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定します。
- 複数カーディナリティーの子ビジネス・オブジェクトを更新します。
- AfterUpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterUpdate ストアード・プロシージャーを呼び出します。
- ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
ビジネス・オブジェクトの Delete 操作
Delete ストアード・プロシージャーは、コネクターに値を戻しません。コネクターは、Delete ストアード・プロシージャー (BeforeDelete、Delete、AfterDelete) を処理するときに、次のステップを実行します。
- BeforeDeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを
検査します。含まれている場合には、BeforeDelete ストアード・プロシージャーを呼び出します。
- 単一カーディナリティーの子ビジネス・オブジェクトを削除します。
- 複数カーディナリティーの子ビジネス・オブジェクトを削除します。
- DeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを
検査します。含まれている場合には、Delete ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを削除します。含まれていない場合には、DELETE ステートメントを
作成および実行して、トップレベルのビジネス・オブジェクトを作成します。
- AfterDeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterDelete ストアード・プロシージャーを呼び出します。
ビジネス・オブジェクトの Retrieve 操作
単純な RETRIEVE 操作の場合、トップレベルのビジネス・オブジェクト、単一カーディナリティーの子、および
複数カーディナリティーの子に対してストアード・プロシージャーを使用できます。プロシージャーの順序は次のとおりです。
- BeforeRetrieve
- Retrieve
- AfterRetrieve
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは
複数カーディナリティーの子ビジネス・オブジェクトを検索するために
一時オブジェクトを作成します。コネクターは、BeforeRetrieve ストアード・プロシージャーを
一時ビジネス・オブジェクトに適用します。AfterRetrieve ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。
コネクターは、ビジネス・オブジェクト・メタデータまたはビジネス・オブジェクト上のストアード・プロシージャーから
動的に生成された Retrieve 照会を実行した後で、AfterRetrieve ストアード・プロシージャーを実行します。
JDBC 仕様によると、次に示す、3 つのタイプの StoredProcedure 呼び出しがあります。
- {call <spName>(?,?,?)}
- {call <spName>}
- {?= call <spName>(?,?,?)}
コネクターは最初の 2 つのタイプをサポートします。コネクターは、StoredProcedure から
戻される ResultSet を処理します。
ストアード・プロシージャー構文で、RS=true の場合には、ストアード・プロシージャーからの結果セットが処理されます。RS=false の場合には、結果セットは処理されません。デフォルトでは、RS の値は false です。結果セット値が処理された後で、ストアード・プロシージャー出力変数が処理されます。RS=true の場合には、複数カーディナリティーの子は、関連したストアード・プロシージャーで出力変数を指定できません。
注:
結果セットの処理のサポートは、Retrieve 動詞操作および RetrieveSP に対してのみ提供されています。
Retrieve ストアード・プロシージャー (RetrieveSP) から戻された結果セットの処理
ResultSetMetaData は、ストアード・プロシージャーから戻された結果セットに対して取得されます。結果セット内のすべての列の値が取得され、ビジネス・オブジェクトの対応する属性で設定されます。属性のアプリケーション固有情報の ColumnName プロパティーには、属性を列と
突き合わせる ResultSet 列名が含まれている必要があります。
単一カーディナリティーのオブジェクトの場合、対応する結果セットは 1 行のみで構成されます。結果セットで複数行が戻された場合は、エラーが報告されます。
複数カーディナリティーの子の場合、結果セットを介して複数行が戻される可能性があります。戻されるそれぞれの行ごとに、新規のオブジェクトが作成され、コンテナーに追加されます。続いて、コンテナーは、必須属性インデックスで親オブジェクトに追加されます。
ビジネス・オブジェクトの RetrieveByContent 操作
単純な RetrieveByContent 操作の場合、ストアード・プロシージャーはトップレベルのビジネス・オブジェクトおよびその単一カーディナリティーの子に対してのみ
使用することができます。すなわち、ストアード・プロシージャーは結果セットまたは複数行を戻すためには
使用できません。プロシージャーの順序は次のとおりです。
- BeforeRetrieveByContent
- RetrieveByContent
- AfterRetrieveByContent
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは
複数カーディナリティーの子ビジネス・オブジェクトを検索するために
一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトの場合、コネクターは、BeforeRetrieveByContent ストアード・プロシージャーを一時ビジネス・オブジェクトに
適用します。AfterRetrieveByContent ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。
コネクターは、ビジネス・オブジェクト・メタデータまたはビジネス・オブジェクト上の
ストアード・プロシージャーから動的に生成された RetrieveByContent 照会を
実行した後で、AfterRetrieveByContent ストアード・プロシージャーを実行します。このケースでは、階層ビジネス・オブジェクトの検索がその子ビジネス・オブジェクトも検索したとしても、コネクターは、配列内に存在するすべてのビジネス・オブジェクトで AfterRetrieveByContent ストアード・プロシージャーを実行します。
ビジネス・オブジェクトの Retrieve-for-Update 操作
次のストアード・プロシージャーは、トップレベルのビジネス・オブジェクト上で呼び出され、単純な Retrieve と同様に、すべての子ビジネス・オブジェクトを検索します。
プロシージャーの順序は次のとおりです。
- BeforeRetrieveUpdate
- RetrieveUpdate
- AfterRetrieveUpdate
上記のストアード・プロシージャーは、BeforeRetrieve および AfterRetrieve と
同じ操作を実行します。上記のストアード・プロシージャーには
識別名があるため、別個の属性を作成して、AfterRetrieve および AfterRetrieveUpdate 操作と
ともに、BeforeRetrieve および BeforeRetrieveUpdate 操作の両方をコネクターに実行させることができます。
コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは
複数カーディナリティーの子ビジネス・オブジェクトを検索するために
一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトの場合、コネクターは、BeforeRetrieveUpdate ストアード・プロシージャーを一時ビジネス・オブジェクトに
適用します。AfterRetrieveUpdate ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。
コネクターは、ビジネス・オブジェクト・メタデータまたは
ビジネス・オブジェクト上のストアード・プロシージャーから動的に生成された RETRIEVE 照会を
実行した後で、AfterRetrieveUpdate ストアード・プロシージャーを実行します。このケースでは、階層ビジネス・オブジェクトの検索がその子ビジネス・オブジェクトも検索したとしても、コネクターは、配列内に存在するすべてのビジネス・オブジェクトで AfterRetrieveUpdate ストアード・プロシージャーを実行します。
トランザクション・コミットとロールバック
コネクターは、処理を行うビジネス・オブジェクトを受け取るたびに、トランザクション・ブロックを用意します。そのビジネス・オブジェクトの処理時に
コネクターが実行するすべての SQL ステートメントは、トランザクション・ブロック内にカプセル化されます。コネクターは、ビジネス・オブジェクトの処理を完了すると、処理が成功した場合にはトランザクション・ブロックをコミットし、処理でエラーが発生した場合には、トランザクションをロールバックします。
