5.1 ストアド・プロシージャとランタイム・コンテキスト

ストアド・プロシージャは、SQLに対して公開され、一般的に使用できるようにデータベースに格納されるJavaメソッドです。Javaメソッドをパブリッシュするには、Javaメソッド名、パラメータの型およびSQLの対応部分への戻り型をマップするコール仕様を記述します。

別の実行レイヤーが追加されるラッパーとは異なり、コール仕様では、Javaメソッドの存在が公開されます。したがって、コール仕様を使用してメソッドをコールすると、ランタイム・システムによって、最小限のオーバーヘッドでコールがディスパッチされます。

ストアド・プロシージャは、クライアント・アプリケーションからコールされると、引数を受け入れ、Javaクラスを参照し、Javaの結果値を戻すことができます。

図5-1では、様々なアプリケーションからコールされているストアド・プロシージャを示しています。

図5-1 ストアド・プロシージャのコール

図5-1の説明が続きます
「図5-1 ストアド・プロシージャのコール」の説明

グラフィカル・ユーザー・インタフェース(GUI)のメソッドを除いて、Oracle JVMは、すべてのJavaメソッドをストアド・プロシージャとして実行できます。ランタイム・コンテキストには、次のものが含まれます。

5.1.1 ファンクションおよびプロシージャ

ファンクションとプロシージャは、一連の文をカプセル化した名前付きのブロックです。これらは、モジュール化されたメンテナンスが容易なアプリケーションを作成するために使用できる構成単位となります。

一般的に、プロシージャは処理の実行に使用し、ファンクションは値の計算に使用します。したがって、戻り値がvoidのJavaメソッドの場合は、プロシージャのコール仕様を使用し、値を戻すメソッドの場合は、ファンクションのコール仕様を使用します。

トップレベルおよびパッケージレベルのPL/SQLファンクションおよびプロシージャのみをコール仕様として使用できます。SQLのCREATE FUNCTIONCREATE PROCEDUREまたはCREATE PACKAGE文を使用してファンクションとプロシージャを定義すると、これらはデータベースに格納され、一般的に使用可能になります。

ファンクションおよびプロシージャとして公開されたJavaメソッドは、明示的に起動する必要があります。これらのメソッドには引数を指定でき、次の文やプログラムからコール可能です。

  • SQLデータ操作言語(DML)文

  • SQLのCALL

  • PL/SQLのブロック、サブプログラムおよびパッケージ

5.1.2 データベース・トリガー

データベース・トリガーは、特定の表またはビューに関連付けられたストアド・プロシージャです。指定されたDML操作で表またはビューが変更されるたびに、Oracle Databaseによってトリガーが自動的にコールされます。

トリガーは次の3つの部分で構成されています。

  • トリガー・イベント(通常はDML操作)

  • オプションのトリガー制約

  • トリガー・アクション

イベントが発生すると、トリガーがコールされます。トリガーのCALL文によって、Javaメソッドがそのメソッドのコール仕様を使用してコールされてアクションが実行されます。

データベース・トリガーは、複雑なビジネス・ルールの実施、列値の自動取得、無効なトランザクションの防止、イベントの透過的な記録、トランザクションの監査および統計情報の収集に使用されます。

5.1.3 オブジェクト・リレーショナル・メソッド

SQLオブジェクト型は、属性と呼ばれる一連の変数と、メソッドと呼ばれる一連の操作をカプセル化したユーザー定義のコンポジット・データ型で、Javaで作成できます。一連の属性で構成されたデータ構造は、publicです。ただし、プログラミングの慣例として、アプリケーションでこれらの属性が直接操作されず、提供される一連のメソッドが使用されることを確認する必要があります。

SQLオブジェクト型として、実在のオブジェクトに対応する抽象テンプレートを作成できます。テンプレートでは、オブジェクトがアプリケーション環境で必要とする属性とメソッドのみを指定します。実行時(データ構造に値を割り当てるとき)に、オブジェクト型のインスタンスを作成します。インスタンスは必要な数だけ作成できます。

通常、オブジェクト型は、発注書などのビジネス・エンティティに対応します。項目の変数値を格納するには、オブジェクト型ではVARRAYまたはネストした表(あるいはその両方)を使用できます。

たとえば、発注書のオブジェクト型に明細項目の変数値を格納できます。