ビジネス・オブジェクト動詞の処理

このセクションでは、ビジネス・オブジェクトの動詞を処理する次の点について説明します。

動詞の判別

トップレベルのビジネス・オブジェクト、およびその個々の子ビジネス・オブジェクトのそれぞれに、独自の動詞を含めることができます。したがって、ビジネス・プロセスは、親ビジネス・オブジェクトおよび子ビジネス・オブジェクトに対して異なる動詞が含まれているビジネス・オブジェクトをコネクターに受け渡すことができます。この受け渡しが行われるとき、コネクターは、トップレベルの親ビジネス・オブジェクトの動詞を使用して、ビジネス・オブジェクト全体を処理する方法を判別します。詳細については、動詞の処理を参照してください。

変更後イメージと差分

変更後イメージとは、ビジネス・オブジェクトに対してすべての変更が行われた後のビジネス・オブジェクトの状態のことです。差分とは、キー値および変更されるデータのみが含まれている、更新操作で使用されるビジネス・オブジェクトのことです。コネクターは、ビジネス・オブジェクトから更新対象のビジネス・オブジェクトを受け取るとき、変更後イメージのみをサポートします。したがって、コネクターは更新後の、データの本来あるべき状態をビジネス・オブジェクトが表すことを想定します。

そのため、ビジネス・プロセスで、Update 動詞が含まれているビジネス・オブジェクトをコネクターに送信するとき、コネクターは、データベース内のビジネス・オブジェクトがソース・ビジネス・オブジェクトと完全に一致するように、その現在の表記を変更します。このことを実行するため、コネクターは基本属性を変更し、子ビジネス・オブジェクトを追加または除去します。

例えば、データベース内の Contract 2345 の現在の状態が次のとおりである場合を想定します。

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

更新を処理するため、コネクターは次の変更をデータベースに適用します。

コネクターは、ビジネス・オブジェクトから受け取るそれぞれのビジネス・オブジェクトが変更後イメージを表すことと想定します。したがって、更新のためにコネクターに送信されたそれぞれのビジネス・オブジェクトに有効な既存の子ビジネス・オブジェクトが含まれていることを確認することが重要です。子ビジネス・オブジェクトの基本属性のいずれも変更されなかったとしても、子ビジネス・オブジェクトはソース・ビジネス・オブジェクトに組み込まれる必要があります。

ただし、欠落している子ビジネス・オブジェクトを更新操作時にコネクターが削除できないようにする方法があります。子または子の配列を表す属性の、アプリケーション固有の情報を使用して、ソース・ビジネス・オブジェクトに組み込まれていない子ビジネス・オブジェクトを保持するようにコネクターに指示することができます。この指示を行うには、KEEP_RELATIONSHIPtrue に設定します。詳細については、属性の外部キーの指定を参照してください。

動詞の処理

このセクションでは、ビジネス・プロセスから受け取るビジネス・オブジェクトを作成、検索、更新、または削除する際にコネクターが行うステップを概説します。コネクターは階層ビジネス・オブジェクトを再帰的に処理します。すなわち、コネクターは、すべての個々のビジネス・オブジェクトの処理を完了するまで、それぞれの子ビジネス・オブジェクトごとに同じステップを実行します。

注:
ラッパーであるトップレベルのビジネス・オブジェクトは、create、retrieve、update、および delete 動詞をサポートします。ラッパー・オブジェクトの処理で唯一異なる点は、ラッパー・オブジェクトが処理されずにラッパー・オブジェクトに含まれるオブジェクトのみが処理されるということです。

ビジネス・オブジェクトの比較

下記に概説する処理でのさまざまな時点で、コネクターは 2 つのビジネス・オブジェクトを比較してそれらが同じであるかどうかを確認します。例えば、更新操作時に、コネクターはビジネス・オブジェクトの配列に特定のビジネス・オブジェクトが存在するかどうかを判別します。この検査を行うため、コネクターは、ビジネス・オブジェクトを配列内のそれぞれのビジネス・オブジェクトと比較します。2 つのビジネス・オブジェクトが同一であるためには、次の 2 つの条件を満たす必要があります。

Create 操作

コネクターは、ビジネス・オブジェクトを作成するとき、操作が成功した場合には (操作によってビジネス・オブジェクトに変更が生じたかどうかには関係なく) VALCHANGE という、または操作が失敗した場合には FAIL という状況を戻します。

コネクターは、階層ビジネス・オブジェクトを作成するとき、次のステップを実行します。

  1. 所有権を持って含まれている、それぞれの単一カーディナリティーの子ビジネス・オブジェクトを再帰的にデータベースに挿入します。すなわち、コネクターは、子とその子たちに含まれる、子およびすべての子ビジネス・オブジェクトを作成します。

    ビジネス・オブジェクト定義で属性が単一カーディナリティーを持つ子ビジネス・オブジェクトを表し、その属性が空であると指定される場合、コネクターはその属性を無視します。ただし、ビジネス・オブジェクト定義でその属性が子を表すことが要求されていて、属性が子を表さない場合には、コネクターはエラーを戻し、処理を停止します。

  2. 所有権を持たずに含まれている、それぞれの単一カーディナリティーの子ビジネス・オブジェクトを次のように処理します。
    1. ビジネス・オブジェクトによって受け渡されたキー値を使用して、データベースから子の検索を再帰的に試行する。
    2. 検索が失敗して、データベースに子が現在存在しないことが示された場合には、コネクターはエラーを戻し、処理を停止する。検索が成功した場合には、コネクターは子ビジネス・オブジェクトを再帰的に更新します。

    注:
    子ビジネス・オブジェクトがアプリケーション・データベースにすでに存在するときにこの方法が正しく機能するためには、子ビジネス・オブジェクト内の基本キー属性が Create 操作で正しく相互参照されることを確認する必要があります。子ビジネス・オブジェクトがアプリケーション・データベースにまだ存在しない場合には、基本キー属性を CxBlank に設定します。
  3. トップレベルのビジネス・オブジェクトをデータベースに次のように挿入します。
    1. その外部キー値のそれぞれを、単一カーディナリティーで表された、対応する子ビジネス・オブジェクトの基本キー値に設定する。子ビジネス・オブジェクト内の値は、子の作成時にデータベース・シーケンスあるいはカウンターによって、またはデータベース自体によって設定することができます。したがって、このステップでは、コネクターが親をデータベースに挿入する前に、親の外部キー値が正しいことが確認されます。
    2. データベースによって自動的に設定される、それぞれの属性ごとに、新しい固有の ID 値を生成する。データベース・シーケンスまたはカウンターの名前は、属性のアプリケーション固有の情報に格納されます。関連したデータベース・シーケンスまたはカウンターが属性にある場合には、コネクターによって生成される値がビジネス・プロセスによって受け渡される値を上書きします。データベース・シーケンスまたはカウンターの指定の詳細については、単純属性のアプリケーション固有情報を参照してください。
    3. 属性の値を、属性のアプリケーション固有の情報の CA (CopyAttribute) パラメーターによって指定されたとおりに、別の属性の値にコピーする。CA パラメーターの使用の詳細については、単純属性のアプリケーション固有情報を参照してください。
    4. トップレベルのビジネス・オブジェクトをデータベースに挿入する。

    注:
    ラッパーであるトップレベルのビジネス・オブジェクトは、データベース内に挿入されません。
  4. 親/子関係を子に格納する単一カーディナリティーの子ビジネス・オブジェクトをそれぞれ、次のように処理します。
    1. 子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定する。親の基本キー値は、親の作成時に生成された可能性があります。したがって、この設定によって、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値が正しいことを確認できます。
    2. 子をデータベースに挿入する。
  5. 複数カーディナリティーの子ビジネス・オブジェクトをそれぞれ、次のように処理します。
    1. それぞれの子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定する。親の基本キー値は、親の作成時に生成された可能性があります。したがって、この設定によって、コネクターが子をデータベースに挿入する前に、それぞれの子の外部キー値が正しいことを確認できます。
    2. 複数カーディナリティーの子ビジネス・オブジェクトをそれぞれ、データベースに挿入する。

Retrieve 操作

コネクターは、階層ビジネス・オブジェクトを検索するとき、次のステップを実行します。

  1. すべての子ビジネス・オブジェクトを、ビジネス・プロセスから受け取った、トップレベルのビジネス・オブジェクトから除去します。
  2. トップレベルのビジネス・オブジェクトをデータベースから検索します。

    注:
    ビジネス・オブジェクトは、プレースホルダー属性などの、いずれのデータベース列にも対応しない属性を持つことができます。検索時に、コネクターはトップレベルのビジネス・オブジェクトでそのような属性を変更しません。そのため、そのような属性は、ビジネス・プロセスから受け取った値に設定された状態のままです。子ビジネス・オブジェクトで、検索時にコネクターはそのような属性をそのデフォルト値に設定します。
    注:
    ラッパーであるトップレベルのビジネス・オブジェクトには、ラッパー・オブジェクトの直下にあるオブジェクトの任意の属性値が含まれている必要があります。この値はキーおよびプレースホルダー属性などのオブジェクトの検索に必要となります。ラッパー・オブジェクトにはすべてのキーおよびプレースホルダー属性が取り込まれる必要があります。ラッパーの 1 レベル下のオブジェクトで外部キーとして使用されるラッパー・オブジェクトの単純属性は、ラッパー・オブジェクトのキーとしてマークされる必要があります。
  3. すべての複数カーディナリティーの子ビジネス・オブジェクトを再帰的に検索します。

    注:
    コネクターは、ビジネス・オブジェクトの配列を取り込むとき、一意性を強制しません。一意性の強制は、データベースが行います。データベースが重複した子ビジネス・オブジェクトを戻す場合には、コネクターは重複した子をビジネス・プロセスに戻します。
  4. 子ビジネス・オブジェクトが所有権を持って含まれているか、持たずに含まれているかどうかに関係なく、単一カーディナリティーの子をそれぞれ、再帰的に検索します。
注:
単一カーディナリティーの子ビジネス・オブジェクトはすべて、その処理は、ビジネス・オブジェクトでの検索結果に基づいて、および親ビジネス・オブジェクトが処理される前に、行われます。子オブジェクトの所有権の有無では、処理シーケンスは決定されませんが、処理のタイプは決定されます。

RetrieveByContent 操作

RetrieveByContent 動詞は、トップレベルのビジネス・オブジェクトにのみ適用できます。コネクターは、トップレベルのビジネス・オブジェクト内の属性にのみ基づいて、検索を実行するからです。

トップレベルのビジネス・オブジェクトに RetrieveByContent 動詞が使用されている場合は、非 null 属性のすべて (非キー属性を含みます) が検索基準として使用されます。

複数の行が戻された場合には、コネクターは最初の行をリターン行として使用し、MULTIPLE_HITS を戻します。

注:
RetrieveByContent 動詞はラッパーであるトップレベルのビジネス・オブジェクトには適用されません。

Update 操作

コネクターは、ビジネス・オブジェクトを更新するとき、操作が成功した場合には (操作によってビジネス・オブジェクトに変更が生じたかどうかには関係なく) VALCHANGE という、または操作が失敗した場合には FAIL という状況を戻します。Oracle データベースを処理するとき、コネクターは、データ保全性を確保するために、データベース検索時にデータをロックします。

コネクターは、階層ビジネス・オブジェクトを更新するとき、次のステップを実行します。

  1. ソース・ビジネス・オブジェクトの基本キー値を使用して、対応するエンティティーをデータベースから検索します。検索したビジネス・オブジェクトは、データベース内のデータの現在の状態を正確に表します。
  2. トップレベルのビジネス・オブジェクトの単一カーディナリティーの子をすべて、再帰的に更新します。

    ビジネス・オブジェクト定義で属性は子ビジネス・オブジェクトを表すことが要求される場合には、子は、ソース・ビジネス・オブジェクトおよび検索したビジネス・オブジェクトの両方に存在する必要があります。存在しない場合には、更新は失敗し、コネクターはエラーを戻します。

    コネクターは、所有権を持って含まれている単一カーディナリティーの子を次の方法のいずれかで処理します。

    所有権を持たずに含まれている単一カーディナリティーの子の場合、コネクターは、ソース・ビジネス・オブジェクトに存在するデータベースからすべての子の検索を試行します。コネクターは、子を正常に検索した場合、所有権を持たずに含まれている単一カーディナリティーの子はコネクターによって変更されることはないため、子ビジネス・オブジェクトを取り込みますが、更新はしません。

  3. 親に関係を格納する単一カーディナリティーの子ビジネス・オブジェクトは、親でのそれぞれの外部キー値を、対応する単一カーディナリティーの子ビジネス・オブジェクトの基本キーの値に設定します。直前のステップで単一カーディナリティーの子がデータベースに追加され、新規の固有の ID が生成された可能性があるため、このステップは重要です。
  4. ソース・ビジネス・オブジェクト内の対応する属性に値 CxIgnore が含まれている基本属性を除いて、検索したビジネス・オブジェクトのすべての基本属性を更新します。

    更新されるビジネス・オブジェクトは固有である必要があります。したがって、コネクターは、結果として 1 行のみが処理されることを検証します。複数の行が戻された場合には、コネクターはエラーを戻します。

  5. 親/子関係を子に格納する (複数カーディナリティーおよび単一カーディナリティーの両方とも) それぞれの子のすべての外部キー値を、その対応する親ビジネス・オブジェクトの基本キー値に設定します。(これらの値は一般にデータ・マッピング時に相互参照されています。) ただし、このステップは、コネクターが新規の子を更新する前に、子の中に関係を格納するこれらの子の外部キー値が正しいことを確認するのに重要です。
  6. 検索したビジネス・オブジェクトのそれぞれの複数カーディナリティーの子を次の方法のいずれかで処理します。

注:
ビジネス・オブジェクトは、ソース・ビジネス・オブジェクトで複数カーディナリティーを持って含まれているビジネス・オブジェクトが固有であること (すなわち、同じビジネス・オブジェクトの 2 つ以上のコピーが配列に含まれないこと) を確認する必要があります。コネクターは、ソース配列でビジネス・オブジェクトの複製のコピーを受け取った場合には、ビジネス・オブジェクトを 2 度処理し、予測不能な結果が出る可能性があります。

DeltaUpdate 操作

DeltaUpdate 動詞の処理は、Update 動詞の処理と以下の点で異なります。

  1. Update 動詞が処理される際には更新の前に検索が実行されますが、DeltaUpdate が処理される際には実行されません。
  2. 着信ビジネス・オブジェクトとデータベース内のビジネス・オブジェクトの比較が行われません。
  3. どの子も、各子オブジェクトに設定されている動詞セットに基づいて処理されます。子に動詞セットが設定されていない場合、コネクターはエラーを戻します。

コネクターは、ビジネス・オブジェクトの差分更新時に、VALCHANGEFAIL のいずれかの状況を戻します。操作が正常に終了した場合 (操作によってビジネス・オブジェクトの変更が生じたかどうかを問いません) は VALCHANGE、操作が失敗した場合は FAIL です。

コネクターでは、階層ビジネス・オブジェクトの差分更新時に、以下のステップを実行します。

  1. 親オブジェクトの子のうち、単一カーディナリティーのものすべてを再帰的に処理します。ビジネス・オブジェクト仕様で IsRequired とマークされている子は、インバウンド・オブジェクトに必ず存在していなければなりません。存在しない場合、差分更新は失敗し、コネクターはエラーを戻します。
  2. 親に含まれる外部キー値のうち、単一カーディナリティーの子の属性を参照するものすべてを、それぞれ対応する子の値に設定します。この処理が必要なのは、これ以前のステップで単一カーディナリティーの子がデータベースに追加され、新しいシーケンス値が生成されている可能性があるためです。
  3. 現在処理中のオブジェクトを、SQL UPDATE ステートメントまたはストアード・プロシージャーを使用して更新します。個々のビジネス・オブジェクトのすべての単純属性が更新されます。ただし、インバウンド・ビジネス・オブジェクトで IsIgnore に設定されている属性を除きます。コネクターでは、インバウンド・オブジェクトと現在のオブジェクトを属性レベルで比較して、UPDATE ステートメントに追加する必要がある属性を決定することはありません。つまり、属性はすべて更新されます。更新されるオブジェクトは一意である必要があるため、コネクターは、結果として 1 行のみが処理されることを確認します。複数の行が処理される場合、エラーが戻されます。
  4. 現在のオブジェクトの子のうち、カーディナリティーが N のものすべてで、親の属性を参照する外部キー値のすべてを、それぞれ対応する親の値に設定します。通常、これらの値はデータ・マッピング時に相互参照されます。ただし、これはカーディナリティーが N のコンテナーに含まれる新しい子には該当しないことがあります。ここでの処理により、カーディナリティーが N の子のすべてで、これらの子が更新される前に外部キー値を確実に正しい値にすることができます。
  5. 現在のオブジェクトの、カーディナリティーが N のコンテナーをすべて更新します。

子オブジェクトが処理されるときには、それぞれの子の動詞が取得されて適切な操作が実行されます。DeltaUpdate が処理される際に許可される子の動詞は、Create、Delete、および DeltaUpdate です。

Delete 操作

コネクターは、ビジネス・オブジェクトを削除するとき、操作が成功した場合には SUCCESS という、または操作が失敗した場合には FAIL という状況を戻します。アダプターは、まず親ビジネス・オブジェクトを検索します。次に、親から見て所有関係にある単一カーディナリティーの子のすべてを再帰的に削除してから、親ビジネス・オブジェクト自体を削除します。最後に、カーディナリティーが N の子をすべて削除します。所有関係にない単一カーディナリティーの子は削除されません。操作対象のビジネス・オブジェクトが存在しない場合、コネクターは FAIL を戻します。

コネクターはオブジェクトのアプリケーション固有情報にある状況列名 (SCN) 値によって、論理的な削除も物理的な削除もサポートします。SCN 値が定義されている場合には、コネクターは論理削除を実行します。SCN 値が定義されていない場合には、コネクターは物理削除を実行します。

物理削除

コネクターは、階層ビジネス・オブジェクトを物理的に削除するとき、次のステップを実行します。

  1. 所有権付きで含まれている単一カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。
  2. トップレベルのビジネス・オブジェクトを削除します。
  3. 複数カーディナリティーの子ビジネス・オブジェクトすべてを再帰的に削除します。

注:
ラッパーであるトップレベルのビジネス・オブジェクトは対応するデータベース表を持たないため、データベースから削除されません。ラッパーの単純属性値はすべて無視されます。

論理削除

ビジネス・オブジェクトを論理的に削除するとき、コネクターは次のステップを実行します。

  1. ビジネス・オブジェクトの状況属性をビジネス・オブジェクトのアプリケーション固有の情報で指定された値に設定する UPDATE を発行します。コネクターは、結果として 1 つのデータベース行のみが更新されることを確認します。そうでない場合には、エラーを戻します。
  2. 所有権を持って含まれているすべての単一カーディナリティーの子、およびすべての複数カーディナリティーの子を再帰的に論理削除します。コネクターは、所有権を持たずに含まれている単一カーディナリティーの子を削除しません。

SQL ステートメント

コネクターは、Select、Update、Retrieve、または Delete 操作に対して、単純な SQL ステートメントを使用できます。SQL ステートメントの列名は、属性の AppSpecificInfo プロパティーから生成されます。ビューに記述されていなければ、各クエリーが処理する表は 1 つのみです。

ストアード・プロシージャー

ストアード・プロシージャーとは、論理装置を構成し、特定のタスクを実行する SQL ステートメントのグループです。ストアード・プロシージャーは、データベース・サーバー内のオブジェクトでコネクターが実行する一組の操作または照会をカプセル化します。

コネクターはストアード・プロシージャーを次の環境で呼び出します。

コネクターは、階層ビジネス・オブジェクトを処理するとき、ストアード・プロシージャーを使用して、トップレベルのビジネス・オブジェクトまたはその子ビジネス・オブジェクトのいずれも処理できます。ただし、それぞれの、ビジネス・オブジェクトまたはビジネス・オブジェクトの配列は独自のストアード・プロシージャーを持つ必要があります。

ストアード・プロシージャーの指定

このセクションでは、ビジネス・オブジェクトのストアード・プロシージャーをコネクターに使用させるときに実行しなければならないステップについて説明します。このセクションの内容は、次のとおりです。

ビジネス・オブジェクトへの属性の追加

コネクターが処理する、それぞれのタイプのストアード・プロシージャーごとに、特別な種類の属性をビジネス・オブジェクトに追加する必要があります。これらの属性は、ストアード・プロシージャーのタイプおよび、それを定義するアプリケーション固有の情報のみを表します。これらの属性は、標準基本属性で使用可能なアプリケーション固有の情報パラメーターを使用しません。

使用するストアード・プロシージャーのタイプに従って、属性に名前を付けます。例えば、AfterUpdate および BeforeRetrieve ストアード・プロシージャーをコネクターに使用させるには、AfterUpdateSP および BeforeRetrieveSP 属性を追加します。

コネクターは、次のビジネス・オブジェクト属性名を認識します。

BeforeCreateSP
 AfterCreateSP
 CreateSP
 BeforeUpdateSP
 AfterUpdateSP
 UpdateSP
 BeforeDeleteSP
 AfterDeleteSP
 DeleteSP
 BeforeRetrieveSP
 AfterRetrieveSP
 RetrieveSP
 BeforeRetrieveByContentSP
 AfterRetrieveByContentSP
 RetrieveByContentSP
 BeforeRetrieveUpdateSP
 AfterRetrieveUpdateSP
 RetrieveUpdateSP
 

注:
コネクターに実行させるストアード・プロシージャーのみに対して属性を作成します。アプリケーション固有の情報またはマッピングを使用して、ビジネス・オブジェクトがコネクターに送信される前に、これらの属性の値を指定します。ビジネス・オブジェクトでの以降の呼び出しの値に対する変更を認識させるには、コネクターを再始動する必要があります。

ストアード・プロシージャーの構文

ストアード・プロシージャーを指定するための構文は次のとおりです。

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 パラメーター: ストアード・プロシージャーの実行後にコネクターが入力値として使用し、さらに、値を戻す対象のビジネス・オブジェクト属性のリスト。

注:
StoredProcedureNameRS、およびパラメーターの順序は重要です。パラメーター同士間の順序は重要ではありません。すなわち、ストアード・プロシージャーが各タイプのパラメーターをすべてグループ化しても、またはパラメーターのタイプを混在させても、コネクターには問題ではありません。

同じタイプの複数のパラメーターを一緒にグループ化するときは、値をコロン区切り文字で区切ります。それぞれの値ごとにパラメーターの名前を繰り返す必要はありません。異なるタイプのパラメーターは、セミコロン区切り文字で区切ります。パラメーター値を指定するときは、等号 (=) の左右いずれにもブランク・スペースを入れません。

ストアード・プロシージャーの例

次の例では、2 つの入力属性から値を取得し、4 つの出力属性に値を戻す、CustomerInsert および VendorInsert という名前のストアード・プロシージャーが使用されます。これらの例に、ストアード・プロシージャーの異なる構造を示します。

コネクターは、JDBC ドライバーによってサポートされる単純なデータ型のみをサポートします。

ストアード・プロシージャーの指定

ストアード・プロシージャー名およびそのパラメーター値を指定する方法は 2 つあります。

注:
Create、Update、または Delete 操作を処理するストアード・プロシージャーが、子ビジネス・オブジェクトの配列が含まれている階層ビジネス・オブジェクトで実行される場合には、コネクターはそれぞれの子ビジネス・オブジェクトを個々に処理します。例えば、コネクターは、BeforeCreate ストアード・プロシージャーを実行する場合、この配列を 1 つのユニットとして処理するのではなく、配列内のそれぞれのメンバーを処理します。コネクターは、BeforeRetrieve ストアード・プロシージャーを処理するとき、単一のビジネス・オブジェクトで操作します。コネクターは、AfterRetrieve ストアード・プロシージャーを処理するとき、検索によって戻されたすべてのオブジェクト上で操作します。

ストアード・プロシージャーまたは単純な SQL ステートメントを使用したビジネス・オブジェクトの処理

次の各セクションでは、コネクターがストアード・プロシージャーをどのように処理するのかを説明します。

ビジネス・オブジェクトの Create 操作

Create ストアード・プロシージャーは通常、基本属性をトップレベルのビジネス・オブジェクトに取り込むためにコネクターが使用する値を戻します。コネクターは、Create ストアード・プロシージャー (BeforeCreateCreateAfterCreate) を処理するときに、次のステップを実行します。

  1. BeforeCreateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、BeforeCreate ストアード・プロシージャーを呼び出します。
  2. ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
  3. 単一カーディナリティーの子ビジネス・オブジェクトを作成します。
  4. それぞれのトップレベルのビジネス・オブジェクトの外部キー値を、それぞれの単一カーディナリティーの子ビジネス・オブジェクトの基本キー値に設定します。
  5. CreateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、Create ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを作成します。含まれていない場合には、INSERT ステートメントを作成および実行して、トップレベルのビジネス・オブジェクトを作成します。
  6. Create ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
  7. それぞれの複数カーディナリティーの子の外部キー値をその親の基本キー属性の値に設定します。
  8. 複数カーディナリティーの子ビジネス・オブジェクトを作成します。
  9. AfterCreateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterCreate ストアード・プロシージャーを呼び出します。
  10. ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。

コネクターは、ステップ 10 で戻される値を使用して、ステップ 3 または 5 で作成したビジネス・オブジェクトの値を変更することができます。

ビジネス・オブジェクトの Update 操作

Update ストアード・プロシージャーは通常、基本属性をトップレベルのビジネス・オブジェクトに取り込むためにコネクターが使用する値を戻します。コネクターは、Update ストアード・プロシージャー (BeforeUpdateUpdateAfterUpdate) を処理するときに、次のステップを実行します。

  1. BeforeUpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、BeforeUpdate ストアード・プロシージャーを呼び出します。
  2. BeforeUpdate ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
  3. 単一カーディナリティーの子ビジネス・オブジェクトを更新します。
  4. トップレベルのビジネス・オブジェクトの外部キー値をそれぞれ、単一カーディナリティーを持つ、それぞれの子ビジネス・オブジェクトの基本キー値に設定します。
  5. UpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、Update ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを更新します。含まれていない場合には、UPDATE ステートメントを作成および実行して、トップレベルのビジネス・オブジェクトを更新します。
  6. Update ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。
  7. 複数カーディナリティーの子の外部キー値を、親の対応する基本キー属性内の値を参照するように設定します。
  8. 複数カーディナリティーの子ビジネス・オブジェクトを更新します。
  9. AfterUpdateSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterUpdate ストアード・プロシージャーを呼び出します。
  10. ストアード・プロシージャーが出力パラメーターを介して値を戻した場合には、その値を使用して、ビジネス・オブジェクトで基本属性の値を設定します。

ビジネス・オブジェクトの Delete 操作

Delete ストアード・プロシージャーは、コネクターに値を戻しません。コネクターは、Delete ストアード・プロシージャー (BeforeDeleteDeleteAfterDelete) を処理するときに、次のステップを実行します。

  1. BeforeDeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、BeforeDelete ストアード・プロシージャーを呼び出します。
  2. 単一カーディナリティーの子ビジネス・オブジェクトを削除します。
  3. 複数カーディナリティーの子ビジネス・オブジェクトを削除します。
  4. DeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、Delete ストアード・プロシージャーを呼び出して、トップレベルのビジネス・オブジェクトを削除します。含まれていない場合には、DELETE ステートメントを作成および実行して、トップレベルのビジネス・オブジェクトを作成します。
  5. AfterDeleteSP 属性がビジネス・オブジェクトに含まれているかどうかを検査します。含まれている場合には、AfterDelete ストアード・プロシージャーを呼び出します。

ビジネス・オブジェクトの Retrieve 操作

単純な RETRIEVE 操作の場合、トップレベルのビジネス・オブジェクト、単一カーディナリティーの子、および複数カーディナリティーの子に対してストアード・プロシージャーを使用できます。プロシージャーの順序は次のとおりです。

コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは複数カーディナリティーの子ビジネス・オブジェクトを検索するために一時オブジェクトを作成します。コネクターは、BeforeRetrieve ストアード・プロシージャーを一時ビジネス・オブジェクトに適用します。AfterRetrieve ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。

コネクターは、ビジネス・オブジェクト・メタデータまたはビジネス・オブジェクト上のストアード・プロシージャーから動的に生成された Retrieve 照会を実行した後で、AfterRetrieve ストアード・プロシージャーを実行します。

JDBC 仕様によると、次に示す、3 つのタイプの StoredProcedure 呼び出しがあります。

コネクターは最初の 2 つのタイプをサポートします。コネクターは、StoredProcedure から戻される ResultSet を処理します。

ストアード・プロシージャー構文で、RS=true の場合には、ストアード・プロシージャーからの結果セットが処理されます。RS=false の場合には、結果セットは処理されません。デフォルトでは、RS の値は false です。結果セット値が処理された後で、ストアード・プロシージャー出力変数が処理されます。RS=true の場合には、複数カーディナリティーの子は、関連したストアード・プロシージャーで出力変数を指定できません。

注:
結果セットの処理のサポートは、Retrieve 動詞操作および RetrieveSP に対してのみ提供されています。

Retrieve ストアード・プロシージャー (RetrieveSP) から戻された結果セットの処理

ResultSetMetaData は、ストアード・プロシージャーから戻された結果セットに対して取得されます。結果セット内のすべての列の値が取得され、ビジネス・オブジェクトの対応する属性で設定されます。属性のアプリケーション固有情報の ColumnName プロパティーには、属性を列と突き合わせる ResultSet 列名が含まれている必要があります。

単一カーディナリティーのオブジェクトの場合、対応する結果セットは 1 行のみで構成されます。結果セットで複数行が戻された場合は、エラーが報告されます。

複数カーディナリティーの子の場合、結果セットを介して複数行が戻される可能性があります。戻されるそれぞれの行ごとに、新規のオブジェクトが作成され、コンテナーに追加されます。続いて、コンテナーは、必須属性インデックスで親オブジェクトに追加されます。

ビジネス・オブジェクトの RetrieveByContent 操作

単純な RetrieveByContent 操作の場合、ストアード・プロシージャーはトップレベルのビジネス・オブジェクトおよびその単一カーディナリティーの子に対してのみ使用することができます。すなわち、ストアード・プロシージャーは結果セットまたは複数行を戻すためには使用できません。プロシージャーの順序は次のとおりです。

コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは複数カーディナリティーの子ビジネス・オブジェクトを検索するために一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトの場合、コネクターは、BeforeRetrieveByContent ストアード・プロシージャーを一時ビジネス・オブジェクトに適用します。AfterRetrieveByContent ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。

コネクターは、ビジネス・オブジェクト・メタデータまたはビジネス・オブジェクト上のストアード・プロシージャーから動的に生成された RetrieveByContent 照会を実行した後で、AfterRetrieveByContent ストアード・プロシージャーを実行します。このケースでは、階層ビジネス・オブジェクトの検索がその子ビジネス・オブジェクトも検索したとしても、コネクターは、配列内に存在するすべてのビジネス・オブジェクトで AfterRetrieveByContent ストアード・プロシージャーを実行します。

ビジネス・オブジェクトの Retrieve-for-Update 操作

次のストアード・プロシージャーは、トップレベルのビジネス・オブジェクト上で呼び出され、単純な Retrieve と同様に、すべての子ビジネス・オブジェクトを検索します。

プロシージャーの順序は次のとおりです。

上記のストアード・プロシージャーは、BeforeRetrieve および AfterRetrieve と同じ操作を実行します。上記のストアード・プロシージャーには識別名があるため、別個の属性を作成して、AfterRetrieve および AfterRetrieveUpdate 操作とともに、BeforeRetrieve および BeforeRetrieveUpdate 操作の両方をコネクターに実行させることができます。

コネクターは、単一カーディナリティーの子ビジネス・オブジェクトまたは複数カーディナリティーの子ビジネス・オブジェクトを検索するために一時オブジェクトを作成します。複数カーディナリティーのビジネス・オブジェクトの場合、コネクターは、BeforeRetrieveUpdate ストアード・プロシージャーを一時ビジネス・オブジェクトに適用します。AfterRetrieveUpdate ストアード・プロシージャーは、コンテナーを対象に検索された子オブジェクトのそれぞれに適用されます。

コネクターは、ビジネス・オブジェクト・メタデータまたはビジネス・オブジェクト上のストアード・プロシージャーから動的に生成された RETRIEVE 照会を実行した後で、AfterRetrieveUpdate ストアード・プロシージャーを実行します。このケースでは、階層ビジネス・オブジェクトの検索がその子ビジネス・オブジェクトも検索したとしても、コネクターは、配列内に存在するすべてのビジネス・オブジェクトで AfterRetrieveUpdate ストアード・プロシージャーを実行します。

トランザクション・コミットとロールバック

コネクターは、処理を行うビジネス・オブジェクトを受け取るたびに、トランザクション・ブロックを用意します。そのビジネス・オブジェクトの処理時にコネクターが実行するすべての SQL ステートメントは、トランザクション・ブロック内にカプセル化されます。コネクターは、ビジネス・オブジェクトの処理を完了すると、処理が成功した場合にはトランザクション・ブロックをコミットし、処理でエラーが発生した場合には、トランザクションをロールバックします。

Copyright IBM Corp. 2004