JVMは、次世代の企業規模のアプリケーションを低コストで作成するために必要な機能をすべて備えています。重要な機能は、ストアド・プロシージャのサポートです。ストアド・プロシージャを使用すると、ビジネス・ロジックをサーバー・レベルで実装できるため、アプリケーションのパフォーマンス、スケーラビリティおよびセキュリティが向上します。この章の内容は、次のとおりです。ストアド・プロシージャとランタイム・コンテキストストアド・プロシージャの利点Javaストアド・プロシージャの手順ストアド・プロシージャとランタイム・コンテキストストアド・プロシージャは、SQLに対して公開され、一般的に使用できるようにデータベースに格納されるJavaメソッドです。Javaメソッドを公開するには、Javaメソッド名、パラメータ・タイプおよび戻り型を、対応するSQLにマップするコール仕様を記述します。別の実行レイヤーが追加されるラッパーとは異なり、コール仕様では、Javaメソッドの存在が公開されます。したがって、コール仕様を使用してメソッドをコールすると、ランタイム・システムによって、最小限のオーバーヘッドでコールがディスパッチされます。ストアド・プロシージャは、クライアント・アプリケーションからコールされると、引数を受け入れ、Javaクラスを参照し、Javaの結果値を戻すことができます。図5-1では、様々なアプリケーションからコールされているストアド・プロシージャを示しています。JVMは、すべてのJavaメソッドをストアド・プロシージャとして実行できます。ランタイム・コンテキストには、次のものが含まれます。ファンクションおよびプロシージャデータベース・トリガーオブジェクト・リレーショナル・メソッドファンクションおよびプロシージャファンクションとプロシージャは、一連の文をカプセル化した名前付きのブロックです。これらは、モジュール化されたメンテナンスが容易なアプリケーションを作成するために使用できる構成単位となります。一般的に、プロシージャは処理の実行に使用し、ファンクションは値の計算に使用します。したがって、戻り値がvoidのJavaメソッドの場合は、プロシージャのコール仕様を使用し、値を戻すメソッドの場合は、ファンクションのコール仕様を使用します。トップレベルおよびパッケージレベルのPL/SQLファンクションおよびプロシージャのみをコール仕様として使用できます。PACKAGE文を使用してファンクションとプロシージャを定義すると、これらはデータベースに格納され、一般的に使用可能になります。ファンクションおよびプロシージャとして公開されたJavaメソッドは、明示的に起動する必要があります。これらのメソッドには引数を指定でき、次の文やプログラムからコール可能です。SQLデータ操作言語(DML)文SQLのCALL文PL/SQLのブロック、サブプログラムおよびパッケージデータベース・トリガーデータベース・トリガーは、特定の表またはビューに関連付けられたストアド・プロシージャです。Databaseによってトリガーが自動的にコールされます。トリガーは次の3つの部分で構成されています。トリガー・イベント(通常はDML操作)オプションのトリガー制約トリガー・アクションイベントが発生すると、トリガーがコールされます。トリガーのCALL文によって、Javaメソッドがそのメソッドのコール仕様を使用してコールされてアクションが実行されます。データベース・トリガーは、複雑なビジネス・ルールの実施、列値の自動取得、無効なトランザクションの防止、イベントの透過的な記録、トランザクションの監査および統計情報の収集に使用されます。オブジェクト・リレーショナル・メソッドSQLオブジェクト型は、属性と呼ばれる一連の変数と、メソッドと呼ばれる一連の操作をカプセル化したユーザー定義のコンポジット・データ型で、Javaで作成できます。一連の属性で構成されたデータ構造は、publicです。プログラミングの慣例として、アプリケーションでこれらの属性が直接操作されず、提供される一連のメソッドが使用されることを確認する必要があります。SQLオブジェクト型として、実在のオブジェクトに対応する抽象テンプレートを作成できます。テンプレートでは、オブジェクトがアプリケーション環境で必要とする属性とメソッドのみを指定します。実行時(データ構造に値を割り当てるとき)に、オブジェクト型のインスタンスを作成します。インスタンスは必要な数だけ作成できます。通常、オブジェクト型は、発注書などのビジネス・エンティティに対応します。項目の変数値を格納するには、オブジェクト型ではVARRAYまたはネストした表(あるいはその両方)を使用できます。発注書のオブジェクト型に明細項目の変数値を格納できます。ストアド・プロシージャの利点ストアド・プロシージャにはいくつかの利点があります。この項では次の利点について説明します。相互運用性レプリケーションセキュリティパフォーマンスストアド・プロシージャは、一度コンパイルされて実行可能な形式で格納されています。そのため、プロシージャ・コールが迅速かつ効率的に処理されます。実行可能コードは自動的にキャッシュされ、ユーザー間で共有されます。この結果、メモリー要件や起動時のオーバーヘッドが低減します。SQL文をグループ化することによって、ストアド・プロシージャではそれらを1回のコールで処理できます。この結果、ネットワークの通信量が減少し、ラウンドトリップの応答時間が短縮されます。ストアド・プロシージャを使用すると、サーバーのコンピューティング資源を利用できます。計算専用プロシージャをクライアントからサーバーに移動すると、サーバーでより高速に実行できます。ストアド・ファンクションにより、サーバー内でアプリケーション・ロジックが実行されるため、パフォーマンスが向上します。生産性と使いやすさ共通のストアド・プロシージャのセットの周囲にアプリケーションを設計することによって、冗長なコーディングを回避し、生産性を向上させることができます。ストアド・プロシージャを使用するとデータベースの機能を拡張できます。ストアド・プロシージャの作成には、希望に応じてJava統合開発環境(IDE)を使用できます。Interface(OCI)、Pro*C/C++およびJDeveloperなどのプログラム・インタフェースや開発ツールによりコールできます。このようなストアド・プロシージャへの広範囲にわたるアクセス方法によって、アプリケーション間でビジネス・ロジックを共有できます。ビジネス・ルールを実装するストアド・プロシージャは、様々なクライアント・サイド・アプリケーションからコールできるため、そのすべてのアプリケーションがビジネス・ルールを共有できます。サーバーのJava機能を利用する一方で、任意のプログラム・インタフェース用のアプリケーションを引き続き作成できます。スケーラビリティデータベースのJavaは、Oracleデータベースのスケーラブルなセッション・モデルを継承します。ストアド・プロシージャでは、サーバー上のアプリケーション処理を独立することによってスケーラビリティが向上します。スケーラブルなアプリケーションの開発に役立ちます。妥当性チェックが実施されているストアド・プロシージャは、どのアプリケーションでも使用できます。ストアド・プロシージャの定義が変更された場合、影響を受けるのはそのプロシージャのみで、プロシージャをコールするアプリケーションには影響しません。このため、メンテナンスおよび拡張が容易になります。1つのプロシージャをサーバー上でメンテナンスする方が、様々なクライアント・コンピュータ上のコピーをメンテナンスするより簡単です。Databaseで、JavaはJava言語仕様(JLS)に完全に準拠し、汎用のオブジェクト指向プログラミング言語の利点をすべて提供します。PL/SQLと同様に、JavaではOracleデータへのフル・アクセスが提供されています。そのため、PL/SQLで作成されるプロシージャはすべてJavaで作成できます。Javaストアド・プロシージャはPL/SQLストアド・プロシージャによって補完されます。通常、プロシージャ型の拡張機能を必要とするSQLプログラマはPL/SQLを使用することが多く、Oracleデータに簡単にアクセスする必要があるJavaプログラマはJavaをよく使用します。Databaseを使用すると、JavaとPL/SQL間の高度な相互運用性が実現します。Javaアプリケーションは埋込み型のJDBCドライバを使用してPL/SQLストアド・プロシージャをコールできます。PL/SQLアプリケーションはJavaストアド・プロシージャを直接コールできます。Databaseのあるインスタンスから別のインスタンスにレプリケートできます。この機能により、ストアド・プロシージャを使用して基本的なビジネス・ルール・セットを実装できます。ストアド・プロシージャは、一度作成すると、レプリケートして、企業内の作業グループや支店に配布できます。この方法で、個々のサーバーではなく中央のサーバーでポリシーを改訂できます。セキュリティセキュリティの範囲は広く、次のものが含まれます。Databaseでは、すべてのクラスがセキュアなデータベースにロードされるため、アントラステッドな状態になります。ユーザーがクラスおよびオペレーティング・システム・リソースにアクセスするには、適切なパーミッションが必要です。同様に、すべてのストアド・プロシージャは他のユーザーから保護されています。ストアド・プロシージャにアクセスする必要があるユーザーに、EXECUTEデータベース権限を付与できます。ユーザーに対しては、定義者権限で実行されるストアド・プロシージャのみからOracleデータの操作を許可することによって、Oracleデータへのアクセスを制限できます。データベースの表を更新するプロシージャへのアクセスは許可しても、その表自体へのアクセスは拒否することもできます。Javaアプリケーションのセキュリティ」Javaストアド・プロシージャの手順Javaストアド・プロシージャは、PL/SQLストアド・プロシージャと同じ方法で実行できます。DMLコールの結果としてコールされることが一般的なため、通常はデータベース操作の結果として実行されます。Javaストアド・プロシージャをコールするには、コール仕様を使用して公開する必要があります。Databaseインスタンスにロードし、SQLに対して公開する必要があります。ロードと公開は別のタスクです。多くのJavaクラスは、他のJavaクラスからのみ参照されるため公開されることはありません。Javaストアド・プロシージャを自動的にロードするには、loadjavaツールを使用します。Databaseインスタンスにロードします。IDE、イントラネットまたはインターネットからアップロードできます。Javaストアド・プロシージャを作成、ロードおよびコールする手順は、次のとおりです。JAVA文を使用できます。DatabaseにJavaクラス・ファイルをロードできます。IDEを使用してクラスを作成するか、または必要に応じた既存のクラスを再利用します。Databaseでは、多数のJava開発ツールおよびクライアント・サイドのプログラム・インタフェースがサポートされます。IDEで開発されたプログラムを使用できます。次の例では、publicクラスOscarを作成します。Wildeの引用句を戻すquote()という単一のメソッドがあります。}}クラスをOscar.javaとして保存します。Javaコンパイラを使用して、次のように、.javaファイルをクライアント・システム上でコンパイルします。Oscar.javaコンパイラによって、Javaバイナリ・ファイル(この例の場合はOscar.class)が出力されます。Databaseインスタンスにロードでき、これらはJavaスキーマ・オブジェクトとして格納されます。loadjavaツールはコマンドラインまたはアプリケーションから実行でき、リゾルバなどいくつかのオプションを指定できます。OCIドライバを使用してデータベースに接続します。ユーザー名とパスワードを指定する必要があります。デフォルトでは、クラスOscarはユーザーのログインするスキーマ(この場合はscott)にロードされます。passwordquote()メソッドをコールすると、サーバーはリゾルバを使用して、Stringなどのサポート・クラスを検索します。この場合はデフォルトのリゾルバが使用されます。デフォルトのリゾルバは最初に現行スキーマ内、次に、すべてのコアなJavaクラス・ライブラリが常駐しているSYSスキーマ内を検索します。必要に応じて、別のリゾルバを指定できます。Databaseに公開するコール仕様を記述する必要があります。通常、必要となるコール仕様は少数です。JDeveloperを使用してこれらのコール仕様を生成できます。次のSQL*Plusの例では、データベースに接続した後、quote()メソッド用のトップレベルのコール仕様を定義します。ストアド・プロシージャのコールJavaストアド・プロシージャは、JDBC、SQLJ、およびコール仕様にアクセスできるすべてのサード・パーティ言語からコールできます。SQLのCALL文を使用すると、トップレベル(たとえば、SQL*Plus)からストアド・プロシージャをコールできます。ストアド・プロシージャはデータベース・トリガーからもコールできます。次の例では、SQL*Plusのホスト変数を宣言します。VARCHAR2(50);この後で、oscar_quote()ファンクションを次のようにコールします。temptation.関連項目:第7章「ストアド・プロシージャのコール」また、Javaクラスはojvmjavaツールを使用してコールすることもできます。ストアド・プロシージャのデバッグ(必要な場合)ストアド・プロシージャのデバッグは必須です。Javaストアド・プロシージャは、別のコンピュータにあるサーバー上でリモートで実行されます。JDKデバッガ(jdb)はリモートのJavaプログラムをデバッグできません。そのため、データベースにロードする前にクライアント・コンピュータでストアド・プロシージャをデバッグする必要があります。