ストアド・プロシージャの使用について

ADF Business Componentsでは、ビジネス・ロジックからすべてのJDBC文を実行できます。たとえば、エンティティ・オブジェクトからストアド・プロシージャをコールできます。これには、次のような場合が考えられます。

通常、エンティティ・オブジェクトからストアド・プロシージャをコールするには、次のようにします。

  1. ストアド・プロシージャのコールを含むPL/SQLブロックを使用してJDBC CallableStatementを作成します。
  2. 変数をバインドします。
  3. 文を実行します。
  4. OUTパラメータの値を取得します(オプション)。
  5. 文をクローズします。

CallableStatementを作成するには、次のようなコードを使用します。

 DBTransaction tr = getDBTransaction();
 CallableStatement st = tr.createCallableStatement(...);    

文を作成したら、標準のJDBC APIを使用して後のステップを実行します。

多くの場合、Oracleデータベースを使用するアプリケーション開発者は、データベース内のPL/SQLパッケージを利用して、ビジネス・ロジックを集中管理したり、表のデータへのアクセスを制御したりします。一般的な手順は次のとおりです。

  1. ユーザーが表を直接操作できないよう、表のすべての権限を取り消します。
  2. パブリック・プロシージャを含むPL/SQLパッケージを作成し、表の行の選択、更新、挿入および削除を行うAPIを提供します。
  3. パッケージにEXECUTE権限を付与します。

デフォルトのDMLをデータベース表に対して直接実行するかわりに、エンティティ・オブジェクトを直接マップして、このようなストアド・プロシージャAPIと対話させることができます。

ストアド・プロシージャをコールするには、oracle.jbo.server.EntityImplクラスの次の2つのメソッドを使用します。このメソッドは、エンティティ・オブジェクト・クラスでオーバーライドする必要があります。

これらのメソッドを使用すると、ストアド・プロシージャをADF Business Componentsモデルに統合できます。つまり、フレームワークによって提供されるデフォルトの動作を使用するかわりに、独自のカスタム・ロジックを実装できます。

エンティティ・オブジェクトがDML操作を実行するデフォルトの方法をオーバーライドするには、doDML()メソッドをオーバーライドします。doDML()メソッドは、データベースでエンティティ・オブジェクト・タイプのインスタンスの挿入、更新または削除を実行する必要があるときに常にフレームワークでコールされます。フレームワークは、操作フラグを引数としてdoDML()メソッドに渡すことで、実行する操作を指定します。

カスタムのdoDML()メソッドは、操作フラグがDML_INSERT、DML_UPDATEまたはDML_DELETEのどれと一致するかを確認し、そのフラグに応じた処理を実行する必要があります。ストアド・プロシージャをコールするには、前述したCallableStatementを作成し、該当するプロシージャをコールします。たとえば、パッケージのinsert_rowprocedureが順序から割り当てられた主キー値を返す場合など、プロシージャが変更された列値をPL/SQL OUT変数で返す場合、返されたパラメータ値をJDBC文から取得し、populateAndNotifyChanged()メソッドを使用してそれらの値をエンティティ・オブジェクトの属性値に移入する必要があります。

ストアド・プロシージャをコールするのは簡単ですが、ストアド・プロシージャにより表のデータが変更された場合、プログラムで必要であれば、これらの変更がエンティティ・キャッシュに反映されるようにする必要があります。つまり、プログラム上、データベース内の変更された値の一部またはすべての再取得が必要な場合を判断する必要があります。エンティティ・オブジェクトは、ヘルパー・ビュー・オブジェクトを使用して、データベースの再問合せを行えます。またはdoSelect()を使用して変更内容を取得できます。


関連項目
ストアド・プロシージャのコール