27 データベースでのJavaの使用

JDeveloperでは、OracleデータベースにアクセスするJavaプログラムの作成および実行を可能にする、次のような機能をサポートしています。

この章の内容は次のとおりです。

データベースでのJavaの使用について

データベースでJavaを使用します。SQLJまたはJDBCを使用して、JavaプログラムにSQLを埋め込むことができます。Javaプログラムからデータベース・オブジェクトおよびパッケージにアクセスできます。データベース内のJavaメソッドであるJavaストアド・プロシージャを使用します。

データベースでのJavaの使用には、3つの側面があります。

  • SQLJまたはJDBCの使用。両方とも、JavaプログラムにSQLを埋め込むために使用できます。

  • Javaプログラムからデータベース・オブジェクトおよびPL/SQLパッケージへのアクセス。

  • Javaストアド・プロシージャの使用。これは、データベース内に存在して動作するJavaメソッドです。

SQLJまたはJDBCの選択

JavaプログラムにSQLを埋め込むために、SQLJまたはJDBCのいずれを使用するかを選択します。

JDeveloperでは、JavaプログラムにSQLを埋め込むメカニズムを2種類サポートしています。

  • SQLJ: コンパイル時(静的アプリケーション)に関連するPL/SQL表および列がわかっている場合、SQLJを使用できます。SQLJは、Javaプログラムでプリコンパイル済SQLコードを定義するための業界標準です。

    SQLJを使用すると、JavaコードにSQL文を直接埋め込むことによってJDBCより高いレベルでコーディングできます。JDeveloperにはSQLJプリコンパイラが組み込まれており、これによって、SQLがJavaおよびJDBCコードに変換されます。SQLJとJDeveloperを併用すると、JDBCのみを使用するよりも効率よくアプリケーションを作成およびデバッグできます。

  • JDBC: データベースのアクセスに関するファイングレイン・コントロールが必要な場合、またはデータベース(またはインスタンス)のメタデータについての正確な情報が必要なアプリケーションを開発する場合は、JDBC APIを使用してアプリケーション全体をJava言語で作成します。

プログラムには、JDBCコールとSQLJ文を組み合せて記述できます。これを実行する方法の1つとして、接続コンテキストの共有があります。

SQLJの使用

SQLJは、Javaプログラムに静的なSQL文を組み込むための標準的な方法です。SQLJアプリケーションは移植性が高く、標準のJDBCドライバを使用して様々なベンダーのデータベースにアクセスできます。『Oracle® Database SQLJ開発者ガイド』を参照してください。

SQLJを使用することにより、Javaを使用して、データベースにアクセスするためのアプリケーションを、クライアント側でも中間層でも開発できます。SQLJを使用した開発は素早く効率的で、JDeveloperではSQLJの開発環境を完全にサポートしています。SQLJファイルは、JDeveloperプロジェクト中に作成または含めることができます。SQLJソース・ファイルが含まれているプロジェクトをコンパイルすると、JDeveloperではSQLJトランスレータまたはプリコンパイラが自動的にコールされます。トランスレータは、完全に標準に準拠したJavaソース・コードを作成し、データベースをサポートするためのJDBCメソッドをコールします。その後JDeveloperが、SQLJトランスレータで生成されたJavaをコンパイルします。

Oracle JDBCドライバの使用

JDBCは、Javaプログラムにデータベースへの下位レベル・アクセスを提供します。

Oracle JDBCドライバは、2つの主要カテゴリに分類できます。それぞれの特長は次のとおりです。

  • Javaベース・ドライバ(シン・クライアント/Type 4ドライバ)

    • Javaで完全に実装

    • 高い移植性

    • サーバー・システムからWebブラウザへダウンロード可能

    • TCP/IPプロトコルを使用して接続可能

    • アプレット専用オプション(セキュリティ制限のため)

  • OCIベース・ドライバ(Type 2ドライバ)

    • ネイティブ・メソッド・ライブラリ(OCI DLL)を使用して実装

    • クライアント・システムで使用できるOCIライブラリが必要

    • ブラウザへのダウンロード不可

    • Net8プロトコルを使用して接続可能

    • 高パフォーマンスを実現

    次の図は、JDBCコンポーネントとドライバが、アプレットと同じメモリー領域でどのように実行されるかを示しています。

    図27-1 JDBCコンポーネント

    図27-1の説明が続きます
    「図27-1 JDBCコンポーネント」の説明

次の図は、Oracle JDBC OCIドライバが、Javaアプリケーションとは別のメモリー領域でどのように実行されるかを示しています。これらのJDBCドライバが、個別にロードされているファイルに対してOCIコールを行います。

図27-2 Oracle JDBC OCIドライバ

図27-2の説明が続きます
「図27-2 Oracle JDBC OCIドライバ」の説明

ノート:

JDBCとJDBCドライバという用語を混同しないでください。すべてのJavaアプリケーションは、開発方法または実行環境に関係なく、Oracleへの接続にJDBCレベルのドライバを使用します。ただし、純粋なJDBC APIを使用したコーディングは、Oracle Call Interface (OCI)を使用したデータベース・アプリケーションの開発と同様に、低レベルの開発となります。このため、JDBC APIにはOCIと同様に強力な機能が用意されていますが、コーディングを主体としてアプリケーションを開発する必要があります。

SQLJとJDBC

ここでは、SQLJとJDBCの比較について説明します。SQLJを使用すると、JDBCで直接コーディングするよりも便利な点がいくつかあります。

  • SQLJプログラムでは、JDBCプログラムと比較してコーディングする量がかなり減少します。プログラムが短くなるため、デバッグも簡単になります。

  • SQLJは、コンパイル時にデータベース接続を使用し、コードに対して構文チェックおよびセマンティクス・チェックを行います。

  • SQLJは、問合せ結果やその他の戻りパラメータについて詳細なデータ型チェックを行いますが、JDBCの値は、コンパイル時にチェックなしでSQLとやり取りされます。

  • SQLJを使用すると、SQL文を簡単に操作できます。個別のメソッドを記述して各入力パラメータをバインドし、問合せリストの項目を1つずつ取得するかわりに、Javaのホスト変数を使用するSQL文を1つ記述します。つまりSQLJでは、バインディング機能までサポートします。

ただし、JDBCはSQL文の実行に関するファイングレイン・コントロールを可能にし、真に動的なSQL機能を提供します。アプリケーションで動的な処理が必要な場合(データベースやインスタンスのメタデータを実行時に検出する場合)は、JDBCを使用してください。

SQLJを使用したJavaプログラムでのSQLの埋込み

SQLJを使用してJavaプログラムにSQLを埋め込むには、多数のタスクを実行する必要があります。

SQLファイルの作成方法

新規のSQL (.sql)ファイルを作成し、現在のプロジェクトに追加できます。

SQLファイルを作成するには:

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。
  2. メイン・メニューから、「ファイル」→「新規」を選択して、「新規ギャラリ」を開きます。
  3. 「新規ギャラリ」で、「カテゴリ」ツリーから「データベース層」「データベース・ファイル」を選択します。「項目」リストで「SQLファイル」をダブルクリックします。
  4. 「SQLファイルの作成」ダイアログで、新規ファイルの詳細を指定します。

    作業中に詳細を参照するには、[F1]を押すか、ダイアログ内から「ヘルプ」をクリックします。

  5. 「OK」をクリックします。

現在のプロジェクトに空のSQLファイルが追加され、エディタで開きます。

SQLJクラスの作成方法

新規のSQLJ (.sqlj)ファイルを作成し、現在のプロジェクトに追加します。

新しいSQLJファイルを作成するには:

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。
  2. メイン・メニューから、「ファイル」→「新規」を選択して、「新規ギャラリ」を開きます。
  3. 「カテゴリ」ツリーで「データベース層」を開き、「データベース・ファイル」を選択します。

    作業中に詳細を参照するには、[F1]を押すか、ダイアログ内から「ヘルプ」をクリックします。

  4. 「項目」リストで、「SQLJクラス」をダブルクリックし、「SQLJクラスの作成」ダイアログを開きます。
  5. 「SQLJファイルの作成」ダイアログで、新規ファイルの詳細を指定します。

    作業中に詳細を参照するには、[F1]を押すか、ダイアログ内から「ヘルプ」をクリックします。

  6. 「OK」をクリックします。

スケルトンSQLJクラスが現在のプロジェクトに追加され、編集画面が開きます。

SQLJクラスのコンパイル方法

Java .classファイルにSQLJクラスをコンパイルできます。

SQLJクラスをコンパイルするには:

  1. 「プロジェクト・プロパティ」ダイアログの「コンパイラ」→「SQLJ」ページで、ファイルのコンパイル方法を制御する、プロジェクトのSQLJトランスレータ・オプションを設定します。
  2. 「アプリケーション」ウィンドウで、SQLJクラスを検索して選択します。
  3. クラスを右クリックして「メイク」を選択します。

JDeveloperウィンドウ下部のステータス・バーに、コンパイル結果が表示されます。エラーが発生した場合は、ログ・ウィンドウにリスト表示されます。

名前付きSQLJ接続コンテキストの使用方法

SQLJの実行可能文では、その句のSQL操作が実行されるデータベース接続を示す接続コンテキスト・オブジェクトを指定できます。SQLJ文で接続コンテキスト句を省略した場合、デフォルトの接続コンテキストが使用されます。

SQLJ接続コンテキスト・クラスの宣言方法

接続コンテキストは接続コンテキスト・クラスのオブジェクトの1つで、SQLJの接続宣言を使用して定義します。

コンテキスト・クラスを宣言するには:

  1. コンテキスト・クラスを宣言します。

    名前付き接続コンテキストは必須ではありません。接続コンテキスト名を省略したSQLJ文では、デフォルトの接続コンテキストが使用されます。

    たとえば、この文はコンテキスト・クラスMyConnectionContextを宣言します。

    #sql context MyConnectionContext; 
    

    コンテキスト・クラスはsqlj.runtime.ref.ConnectionContextImplを拡張し、sqlj.runtime.ConnectionContextを実装します。

コンテキスト・クラスを宣言した後、コンテキスト・オブジェクトを作成します。

接続コンテキスト・オブジェクトの作成方法

SQLJ文で使用するためには、まず宣言済接続を作成します。

名前付き接続コンテキストは必須ではありません。接続コンテキスト名を省略したSQLJ文では、デフォルトの接続コンテキストが使用されます。

コンテキスト・オブジェクトを作成するには、文を使用して、接続コンテキスト・クラス(たとえばMyConnectionContext)のインスタンス(たとえばthisCtx)を作成します。

MyConnectionContext thisCtx = new MyConnectionContext (<myPath>, <myUID>, <myPasswd>, autocommit)
SQLJクラスのデバッグ方法

SQLJコードのデバッグは、生成されたJavaコードではなく、SQLJソースを直接デバッグします。

SQLJは、他のソース・コードと同じ方法で、JDeveloperでデバッグされます。SQLJのデバッグ機能に関する項を参照してください。

SQLJトランスレータ・オプションの設定方法

「プロジェクト・プロパティ」ダイアログのコントロールを使用して、SQLJクラスの変換を制御できます。

  • SQLコードの構文チェックおよびセマンティクス・チェックを行います。

  • SQL文の構文とデータ型をチェックします。

  • コンパイル時にJavaおよびSQL式の互換性をテストします。

  • データベース・サーバーへの接続を指定します。

  • 接続コンテキストによって指定されたデータベース・スキーマに対して、SQL文のセマンティクスを確認します。

SQLJトランスレータのオプションを設定するには:

  1. 「アプリケーション」ウィンドウで、SQLJファイルが含まれているプロジェクトを選択します。
  2. 「アプリケーション」→「プロジェクト・プロパティ」→「コンパイラ」を選択し、「SQLJ」を選択します。
  3. SQLJパネルでコンパイル・オプションを設定します。これには次のものがあります。
    • トランスレータの警告を設定するレベル

    • コード生成のタイプ

    • データベース・スキーマに対してSQLセマンティクス・チェックを実行するかどうか

    • SQLJトランスレータで使用する追加オプション

  4. 「OK」をクリックします。

すべてのプロジェクトに対してSQLJトランスレータ・プロパティを設定するには、「アプリケーション」メニューから「デフォルト・プロジェクト・プロパティ」を選択します。

SQLJ接続オプションの使用方法

SQLJ接続オプションは、オンライン・チェックの対象となるデータベース接続を指定します。接続オプションの通常の形式は、次のとおりです。

-option@context=value 

ここで、optionは、次に示した4つのうちのいずれかです。

contextタグは、それぞれの接続コンテキストに対して個別のスキーマを使用できるようにする接続コンテキスト・タイプです。接続コンテキスト・タイプを省略すると、valueは、デフォルトの接続コンテキストを使用するSQL文に対して使用されます。driverオプションには、contextタグを使用できません。

オプションは次のとおりです。

  • user このオプションにはデータベースへ接続するためのユーザー名を指定します。この名前を使用して、SQLJプログラムに埋め込まれたSQL式のセマンティクス解析を行います。これには、ユーザー名が含まれます。たとえば:

    -user=hr
    

    userコマンドライン・オプションには、接続コンテキスト・タイプを含めることができます。たとえば:

    -user@Ctx1=hr
    

    データベース・コンテキストCtx1への接続にユーザー名が必要な場合、SQLJは、Ctx1がタグ付けされたuserオプションを使用します。何も見つからない場合、SQLJはメッセージを発行し、かわりに使用するタグ付けされていないユーザー・オプションを検索します。

    user値を指定することにより、オンライン・チェックの実行が必要であると指示します。userオプションを指定しない場合は、SQLJはセマンティクス解析のためのデータベース接続を行いません。userオプションにはデフォルト値がありません。

    デフォルトで(-user=hrなどを指定して)オンライン・チェックを有効にしている場合に、特定の接続コンテキスト・タイプCtx2に対してオンライン・チェックを行わないようにするには、次のようにユーザー名を明示的に空白にする必要があります。

    -user@Ctx2Z 
    
  • password このオプションには、ユーザーのパスワードを指定します。パスワードを指定しないと、パスワードの入力が要求されます。このオプションは、接続コンテキスト・タイプをタグ付けできます。2つのフォームの例は、次のとおりです。

    -password=hr
    -password@Ctx1=hr 
    
  • url このオプションには、データベース接続を確立するためのJDBC URLを指定します。デフォルトはjdbc:oracle:oci9:@です。このオプションは、接続コンテキスト・タイプをタグ付けできます。たとえば:

    -url=jdbc:oracle:oci8:@ -url@Ctx1=jdbc:oracle:thin:@<local_host>:1521:orcl
    
  • driver このオプションには、JDBCドライバのリストを指定します。これらのドライバは、オンライン解析に対するJDBC接続のURLを解釈するために登録します。デフォルトは、oracle.jdbc.driver.OracleDriverです。たとえば:

    -driver=sun.jdbc.odbc.JdbcOdbcDriver,oracle.jdbc.driver.OracleDriver
    

    このオプションは、接続コンテキスト・タイプをタグ付けできません。

JDBCを使用したJavaプログラムでのSQLの埋込み

JDBCは、Javaプログラムにデータベースへの下位レベル・アクセスを提供します。『Oracle® Database SQLJ開発者ガイド』を参照してください。

JDBCドライバの選択方法

JDBCは各種ドライバをサポートするドライバ・マネージャを使用するため、複数のデータベース・サーバーへの接続が可能です。データベース・アプリケーションをデータ・サーバーに接続するには、適切なJDBCドライバを有効にしておく必要があります。JDeveloperは、Oracle Thin JDBCドライバおよびOCI JDBCドライバを提供します。Oracle用OCIがデフォルトのドライバです。必要に応じて、デフォルト以外のJDBCドライバをインストールしてください。

アプリケーションまたはアプレットに使用するJDBCドライバを選択する場合は、次のことを考慮してください。

  • アプレットを作成する場合には、必ずJDBCシン・ドライバを使用してください。JDBC OCIベースのドライバ・クラスは(C言語の)ネイティブ・メソッドをコールするため、Webブラウザでは機能しません。

    ノート:

    このJDBC Thinドライバとアプレットとを併用する場合、Javaソケットをサポートしているクライアント・ブラウザを使用してください。

  • Oracleクライアント環境用のクライアント・アプリケーションを作成していて、パフォーマンスを最大限にする必要がある場合には、JDBC OCIドライバを選択してください。

  • 中間層として動作するOracleサーバーで実行されるコードの場合、サーバー側シン・ドライバを使用してください。

    ノート:

    JDeveloperは、サーバー側シン・ドライバを提供していません。

  • コードがターゲットのOracleサーバー内で実行される場合、そのサーバーへのアクセスにはサーバー側の内部JDBCドライバを使用してください。リモート・サーバーには、サーバー側シン・ドライバを使用してアクセスできます。

    ノート:

    JDeveloperは、サーバー側シン・ドライバを提供していません。

  • アプリケーションにとってパフォーマンスが重要で、Oracleサーバーのスケーラビリティを最大限に活用する場合や、透過的アプリケーション・フェイルオーバー(TAF)などの拡張可用性機能または中間層の認証などの拡張プロキシ機能が必要な場合には、OCIドライバを選択します。

デフォルト以外のJDBCドライバを使用するためのプロジェクトの変更方法

JDeveloperのプログラミング環境が、デフォルト以外のJDBCドライバを使用できるよう変更されている場合、次のステップで新規ドライバを使用するよう現在のプロジェクトを変更します。

プロジェクトを変更するには:

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。
  2. 「アプリケーション」→「プロジェクト・プロパティ」→「プロファイル」→「開発」→「ライブラリ」 を選択します。
  3. 表示されたリストからドライバのライブラリを選択して、「選択済のライブラリ」リストに転送します。ドライバ・ライブラリは、ドライバの登録時に作成されています。
  4. 必要に応じて、追加したライブラリが他のドライバ・ライブラリより前に表示されるように、選択済のライブラリのリストを並び替えます。これには次のものがあります。
    • Oracle JDBC

    • Enterprise Java Bean

    必要に応じて、追加したライブラリを選択してリストの先頭にドラッグします。

  5. 変更を保存してダイアログを閉じるには、「OK」をクリックします。
JDBC接続のコーディング方法

純粋なJDBCコードでデータベース接続を作成できます。

概要は、『Oracle® Database SQLJ開発者ガイド』を参照してください。

JDBC接続をコーディングするには:

  1. 次の文を使用してJDBCクラスをインポートします。
    import java.sql.*;
    

    この文はすべてのJDBCプログラミングで必要です。

  2. JDBCドライバを登録します。Oracle JDBCドライバを使用しているときに、静的なOracle.connect()メソッドを使用してデフォルト接続を設定するコンストラクタを使用する場合、Oracle JDBCドライバは自動的に登録されます。

    また、Oracle JDBCドライバを使用しているが、Oracle.connect()は使用しない場合、次の文を使用してOracleドライバ・クラスを手動で登録する必要があります。

    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    

    Oracle JDBCドライバを使用しない場合は、適切なドライバ・クラスを登録する必要があります。

    DriverManager.registerDriver(new mydriver.jdbc.driver.MyDriver()); 
    

    どの場合でも、接続URL、ユーザー名およびパスワードの設定が必要です。

  3. 次のように、getConnection()メソッドを使用してデータ・サーバーに接続します。
    Connection conn = DriverManager.getConnection(parameters...);

Javaストアド・プロシージャの使用

Javaストアド・プロシージャは、データベース内に存在し、データベース内で実行されるJavaメソッドです。ストアド・プロシージャは実行可能な形態でRDBMSに格納され、クライアント・メモリー領域ではなくRDBMSメモリー領域で実行されます。このため、ストアド・プロシージャを使用するとデータベース・アプリケーションのパフォーマンスを改善できます。

JDeveloperを使用して、新規ストアド・プロシージャのメソッドをJavaで作成し、Oracleデータベースにデプロイします。JavaクラスをOracleにデプロイする際、ストアド・プロシージャとしてPL/SQLに公開するメソッドを選択できます。メソッドはパッケージとしてまとめてデプロイすることも、個別にデプロイすることもできます。「Javaストアド・プロシージャの開発」を参照してください。

ストアド・プロシージャは、データベース内に存在し、データベース内で実行されるプログラムです。アプリケーション開発者は、ストアド・プロシージャを使用し、データベース・アプリケーションのパフォーマンスを改善できます。ストアド・プロシージャは1度のみコンパイルされ、実行可能な形態で格納されるため、プロシージャ・コールは高速で効率的です。ストアド・プロシージャはRDBMSメモリー領域で実行されるため、複雑なファンクションはクライアントで実行されるルーチンより高速です。また、ストアド・プロシージャを使用してPL/SQL文をグループ化し、これらを1回のコールで実行できます。こうすることでネットワーク・トラフィックが減少し、ラウンドトリップの応答時間が改善されます。共通のストアド・プロシージャを使用したアプリケーションを設計することで、冗長なコーディングを避け、生産性を向上させることができます。

Javaストアド・プロシージャには、一般的な使用に備えてPL/SQLに公開され、Oracleデータベースに格納されているJava public staticメソッドが含まれています。Javaメソッドを公開するには、Javaメソッド名、パラメータ・タイプおよび戻り型を対応するPL/SQLに割り当てるコール仕様を作成します。これにより、Javaストアド・プロシージャを、PL/SQLストアド・プロシージャと同様にアプリケーションから実行できます。クライアント・アプリケーションからコールされると、Javaストアド・プロシージャは引数を受け取り、Javaクラスを参照してJavaの結果値を戻すことができます。

図27-3 Javaストアド・プロシージャのデプロイ

図27-3の説明が続きます
「図27-3 Javaストアド・プロシージャのデプロイ」の説明

任意のJavaクラスをOracleデータベースにデプロイし、クラスの準拠しているメソッドをPL/SQLにストアド・プロシージャとして公開できます。これらのJavaストアド・プロシージャは、PL/SQLストアド・プロシージャと同様にアプリケーションから実行できます。Javaストアド・プロシージャを、アプリケーションの、Oracleデータベースにデプロイされた他の(JavaおよびJava以外の)プロシージャへのエントリ・ポイントとして使用できます。

Javaストアド・プロシージャをOracleデータベースにデプロイおよび公開すると、公開用に選択した各メソッドのPL/SQLラッパーとして機能するコール仕様が生成されます。PL/SQLラッパーにより、SQL*Plus、JDBC、またはその他すべてのOracleのアプリケーション環境からストアド・プロシージャにアクセスできます。

Oracleデータベースへの接続を介して、データベース・スキーマにデプロイしたJavaストアド・プロシージャ・パッケージおよびメソッドのコール仕様(PL/SQLラッパー)をインスペクトできます。PL/SQLブロックとして表示されるのは公開済Javaストアド・プロシージャのみで、デプロイの際にPL/SQLに公開されるのはJavaクラス内のpublic staticメソッドのみです。Javaクラスは公開せずにデプロイすることも可能ですが、その場合には「PL/SQL」ノードに表示されません。

Javaストアド・プロシージャは、公開方法に応じて、スキーマの下にある次のノードのいずれかに表示されます。

  • Packagesフォルダには、パッケージでデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

  • Functionsフォルダには、(値を返す)ファンクションとしてデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

  • Proceduresフォルダには、(値を返さない)プロシージャとしてデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

Javaストアド・プロシージャのコール仕様を表示するには、スキーマ階層で該当するノードを見つけてダブルクリックします。

Javaストアド・プロシージャの作成方法

まず、Javaクラス・ファイルでビジネス・アプリケーション・ロジックを開発し、Javaストアド・プロシージャを作成します。ストアド・プロシージャにするメソッドを、public staticとして宣言します。

Javaクラスでのビジネス・ロジックの追加および編集には、JDeveloperのエディタを使用します。Oracleデータベースへのデプロイ中、クラス・ファイルに含まれるすべてのpublic staticメソッドは、ストアド・プロシージャとしてPL/SQLに公開できます。クラス内のPL/SQLに公開するpublic staticメソッドを選択できます。

JDeveloperでJavaストアド・プロシージャを作成する方法はいくつかあります。

  • 既存のJavaクラスを使用し、Oracleデータベースにデプロイするクラスのpublic staticメソッドを編集します。既存のクラスには、検証またはデータベース・トリガーに使用するpublic staticメソッドが含まれていることがあります。また、クラス内のメソッドは、いくつかのアプリケーションがローカルで使用している場合があります。これらのメソッドをOracleデータベースにデプロイし、データベースから複数のアプリケーションで使用できます。また、デプロイしたメソッドで、既存のPL/SQLストアド・プロシージャおよびファンクションを補足することもできます。

  • ストアド・プロシージャとして公開するよう設計されたメソッドを使用し、新規クラスを作成します。JDeveloperのエディタを使用し、ストアド・プロシージャとして公開するpublic staticメソッドを作成します。業界標準のJavaで作成し、他のアプリケーションのデプロイメント用に元のJavaクラスを使用します。Oracleデータベースでは、このプログラミングで既存のPL/SQLストアド・プロシージャを補足できます。

たとえば、publicクラスGreetingとpublic staticメソッドHello()を使用し、次のJavaパッケージWelcomeを作成します。

package Welcome;
 public class Greeting {
 public static String Hello() {
 return "Hello World!";
 }

Oracleデータベースにこのパッケージをデプロイし、Hello()メソッドを公開する場合、ソース・エディタに表示されるパッケージのコール仕様は次のようになります。

PACKAGE WELCOME AS
FUNCTION HELLO RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'Welcome.Greeting.Hello() return java.lang.String'
END WELCOME;

Javaストアド・プロシージャのデプロイ方法

Javaストアド・プロシージャのデプロイメント・プロファイルを作成し、そのプロファイルの設定を使用して、JDeveloperのクラスと任意のpublic staticメソッド(オプション)をデプロイします。

データベースへのデプロイでは、「デプロイメント・プロファイル」ウィザードおよび次の2つのOracle Databaseユーティリティで提供される情報を使用します。

  • loadjavaにより、ストアド・プロシージャを含むJavaクラスがOracleデータベースにロードされます。

  • publishにより、ロードされたpublic staticメソッドのPL/SQLコール仕様ラッパーが生成されます。公開すると、JavaメソッドをPL/SQLファンクションまたはプロシージャとしてコールできます。

JDeveloperでJavaストアド・プロシージャをデプロイするには:

  1. 必要に応じて、JDeveloperでデータベース接続を作成します。

  2. 必要に応じて、LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルを作成します。

  3. オブジェクトをデプロイします。

LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルの作成方法

LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルは、シンプル・アーカイブ・プロファイルに非常に似ています。ただし、プロファイルの選択したコンテンツがコマンドライン・ツールloadjavaを介してOracleデータベースにアップロードされる点や、Javaストアド・プロシージャの場合にはOracleデータベースに汎用として格納される点が異なります。

ノート:

この作業を完了する前に、JDeveloperでデータベース接続が構成済であることを確認してください。

JDeveloperでLoadjavaまたはJavaストアド・プロシージャのデプロイメント・プロファイルを作成するには:

  1. 「アプリケーション」ウィンドウで、デプロイメント・プロファイルを作成するプロジェクトを選択します。

  2. 「ファイル」→「新規」を選択して「新規ギャラリ」を開きます。

  3. 「カテゴリ」ツリーで「データベース層」を開き、「データベース・ファイル」を選択します。「項目」リストで、「LoadjavaおよびJavaストアド・プロシージャ」をダブルクリックします。

    カテゴリまたは項目が見つからなければ、正しいプロジェクトが選択されていることを確認して、「フィルタ条件」ドロップダウン・リストの「すべてのテクノロジ」を選択します。

  4. 「デプロイメント・プロファイルの作成」ダイアログで、デプロイメント・プロファイルの場所を指定するか、デフォルトを使用します。ファイル拡張子.dbexportが付いたデプロイメント・プロファイル名が設定されます。

  5. 「保存」をクリックし、「LoadjavaおよびJavaストアド・プロシージャ・デプロイメント・プロファイル設定」ダイアログを表示します。各ページの設定を適宜構成し、作業が完了したら「OK」をクリックします。

    新しく作成したstoredProc.dbexportデプロイメント・プロファイルが、「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されます。

  6. 「アプリケーション」ウィンドウでstoredProc.dbexportを選択して右クリックします。使用可能なポップアップ・メニュー・オプションから選択します。

  7. (オプション)ストアド・プロシージャ・パッケージの追加を選択する場合は、ストアド・プロシージャとしてロードするメソッドを選択します。SQLからコール可能な各Javaメソッドには、データベースにメソッドの最上位レベルのエントリ・ポイントを公開するコール仕様が必要です。通常、必要なコール仕様は少数です。JDeveloperでは、このページからコール仕様を生成します。

  8. メソッドを選択して「プリファレンス」をクリックします。

    リスト上のメソッドがグレー表示になっている場合は、このメソッドをJavaストアド・プロシージャとしてデプロイするには問題があることを示しています。詳細は、「指定不可の理由」をクリックしてください。

  9. 必要に応じて「メソッドの設定」を構成します。この設定により、ストアド・プロシージャのカスタマイズに使用されるCREATE PROCEDUREおよびCREATE FUNCTION SQL文の一部をカスタマイズできます。

  10. (オプション)右クリックして「SQL文のプレビュー」を選択し、ダイアログを表示します。このダイアログには、「アプリケーション」ウィンドウで選択した項目のロードに使用するSQL文が表示されます。最上位レベルのプロシージャまたはファンクションの場合は、完全なSQL文が表示されます。パッケージ済プロシージャまたはファンクションの場合は、それに対応するCREATE PACKAGE BODY文の一部を表すSQL文のフラグメントのみが表示されます。

    • (オプション)「PL/SQLパッケージの追加」を選択する場合は、作成を開始するPL/SQLパッケージの名前を入力します。

    • (オプション)右クリックして「SQL文のプレビュー」を選択し、ダイアログを表示します。このダイアログには、「アプリケーション」ウィンドウで選択した項目のロードに使用するSQL文が表示されます。最上位レベルのプロシージャまたはファンクションの場合は、完全なSQL文が表示されます。パッケージ済プロシージャまたはファンクションの場合は、それに対応するCREATE PACKAGE BODY文の一部を表すSQL文のフラグメントのみが表示されます。

    • プロファイルのデプロイ方法は、「Oracleデータベースへのデプロイ」を参照してください。

Oracleデータベースへのデプロイ方法

必要に応じて、次を実行します。

  • JDeveloperでデータベース接続を作成します。

  • LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルを作成します。

ノート:

Oracle9i Databaseリリース2 (9.2)以降にデプロイする場合、「アプリケーション」メニューから利用できる「プロジェクト・プロパティ」ダイアログでコンパイラのターゲットを1.1または1.2に設定してください。

JDeveloperでLoadjavaおよびJavaストアド・プロシージャをデプロイするには:

  1. 「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されるstoredProc.deployを右クリックします。

  2. ポップアップ・メニューで「エクスポート先」を選択し、既存のデータベース接続を1つ選択します。Javaアプリケーションのソース・ファイルが、選択したデータベースに直接アップロードされます。

    または、「接続の作成」を選択し、「データベース接続の作成」ウィザードを表示します。

  3. (オプション)デプロイメント・プロファイルを編集する場合は、「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されているstoredProc.deployを右クリックし、「設定」を選択します。

ノート:

ファイルをコンパイル済ファイルとソース・ファイルの両方としてデプロイしていて、「リゾルバ」ページで-resolveまたは-andresolveを選択した場合、デプロイメント・プロファイルはソース・ファイルのみをアップロードします。これは、loadjavaがアップロードされた.javaソース・ファイルを解決する際、.javaソース・ファイルの.classファイルへのコンパイルも行うためです。Loadjavaデプロイメント・プロファイル設定をプレビューすると、ソース・ファイルのみが表示されます。

Javaストアド・プロシージャのコール方法

SQLのCALL文を使用して、Javaストアド・プロシージャをコールできます。

SQLを使用してJavaストアド・プロシージャをコールするには:

  1. SQL*PlusでJavaストアド・プロシージャをコールするには、次の構文を使用して対話形式でCALL文を実行します。

    CALL [schema_name.][{package_name | object_type_name}][@dblink_name]
     { procedure_name ([param[, param]...])
     | function_name ([param[, param]...]) INTO :host_variable};
    where param represents this syntax: 
    {literal | :host_variable}
    

    ホスト変数(ホスト環境で宣言した変数)には、接頭辞としてコロンを付けます。次の例は、同じCALL文の中でホスト変数を2回使用することはできないことと、パラメータを持たないサブプログラムは空のパラメータ・リストを使用してコールする必要があることを示しています。

    CALL swap(:x, :x); -- illegal, duplicate host variables
     
    CALL balance() INTO :current_balance; -- () required
    

JDBCを使用してJavaストアド・プロシージャをコールするには:

  1. JDBCからコールするJavaストアド・プロシージャは、CallableStatementオブジェクトにカプセル化されている必要があります。

    コール可能文オブジェクトを作成します。

    • コール可能文オブジェクトを宣言します。たとえば:

      private CallableStatement checkIn;
      
    • ストアド・プロシージャのSQLのCALL文への接続に対してprepareCallをコールして、コール可能文オブジェクトを初期化します。たとえば:

      checkIn = connection.prepareCall(quot;{call NPL.CHECKIN(?, ?, ?)}");

    ノート:

    ストアド・プロシージャ内のパラメータの数は、SQLコール内のプレースホルダの数によって表されます。

  2. コール可能文オブジェクトの出力パラメータを登録します。出力パラメータを位置により識別し、その型を宣言するため、それぞれのパラメータに対してregisterOutParameterをコールします。たとえば、2番目のパラメータがSQL INTEGER(Java intにマップ)で、3番目のパラメータがSQL VARCHAR(Java Stringにマップ)の場合、次のようになります。

    newCustomer.registerOutParameter(2, Types.INTEGER); 
    newCustomer.registerOutParameter(3, Types.VARCHAR); 
    
  3. コール可能文オブジェクトを実行します。

    • 入力パラメータを位置により識別し、値を割り当てるために、setメソッドをコールすることにより、コール可能文オブジェクトの入力パラメータを指定します。たとえば、最初のパラメータがintの入力パラメータの場合、次のようになります。

      checkIn.setInt(1, bookID); 
      
    • コール可能文オブジェクトを実行します。たとえば:

      checkIn.execute(); 
      
    • コール可能文オブジェクトの出力パラメータを実行します。位置により出力パラメータを識別し、それぞれのパラメータに対してgetメソッドをコールします。getメソッドにより、対応するJava型の値が返されます。たとえば:

      int daysLate = checkIn.getInt(2); 
      String title = checkIn.getString(3); 
      

SQLJを使用してJavaストアド・プロシージャをコールするには:

  1. 入力および入出力変数を宣言し、初期化します。たとえば、最初のパラメータがintの入力パラメータの場合、次のようになります。

    int bookID = scanID();
    
  2. 出力変数を宣言します。たとえば:

    int daysLate; String title; 
    
  3. SQLJ文でストアド・プロシージャをコールします。文中でパラメータを名前で識別し、それぞれのパラメータに:in、:outまたは:inoutを指定します。たとえば:

    #sql { call NPL.CHECKIN (:in bookID, :out daysLate, :out title)}
    

    戻り値は出力変数および入力変数に割り当てられます。

PL/SQLを使用してJavaストアド・プロシージャをコールするには、次のようにします。

  1. ストアド・プロシージャをコールして引数を渡すには、PL/SQL文のトリガー本体の句でCALL文を使用します。

    CALL文の引数は、次のいずれかです。

    • リテラル値。

    • SQL式(バインド変数ではない)

    • 相関名で修飾される列参照。

    相関名は、列参照の接頭辞です。これらの名前を使用して、参照がトリガーにより処理される行の既存の列値に適用されるか、トリガー・イベントにより供給される値に適用されるかを示します。

    • OLDは、トリガー操作の前の列値を表します。

    • NEWは、トリガー操作により列に割り当てられる値を表します。トリガー操作が発生する前に、トリガー本体でこの値を再定義することが可能です。

    完全なトリガー定義の例を次に示します。

    CREATE TRIGGER check_salary
    BEFORE UPDATE OF salary ON employee
    CALL salaryCheck(:new.job, :old.salary, :new.salary, :old.employee
    

    CREATE TRIGGER check_salary

    BEFORE UPDATE OF salary ON employee

    CALL salaryCheck(:new.job, :old.salary, :new.salary, :old.employeeID)

Javaストアド・プロシージャのテスト方法

パッケージでデプロイしたストアド・プロシージャは、パッケージ名またはデプロイメント時に設定したストアド・プロシージャ名(あるいはその両方)でアクセスします。パッケージ名は、プロジェクトから付けられたデフォルト名、またはデプロイメント時に入力した別の名前です。ストアド・プロシージャ名は、メソッド名から付けられたデフォルト名、またはデプロイメント時に選択した名前です。ストアド・プロシージャは、パッケージを使用せずにデプロイできます。

たとえば、public staticメソッドhello()がJavaパッケージWelcome内でpublicクラスGreetingにあると仮定します。さらに、それがパッケージOpeningsにデプロイされるとします。

public staticメソッドを実行して結果を返すデプロイ済ストアド・プロシージャに、PL/SQL問合せを実行できます。SQL*PlusをJDeveloperから起動するには、接続を右クリックするか「ツール」メニューから選択します。

データベースへの有効な接続を使用して、SQL*Plusクライアントでは次のことが実行されます。

package Welcome;
 public class Greeting {
 public static String Hello() {
 return "Hello World!";
 }
 }

public staticメソッドを実行して結果を返すデプロイ済ストアド・プロシージャに、PL/SQL問合せを実行できます。SQL*PlusをJDeveloperから起動するには、接続を右クリックするか「ツール」メニューから選択します。

データベースへの有効な接続を使用して、SQL*Plusクライアントでは次のことが実行されます。

select Hello() from dual;Hello()

コードを実行すると次が表示されます。

Hello World!

ノート:

ストアド・プロシージャのコール仕様への参照は、package.methodの構文を使用します。メソッドが含まれるクラスの名前はコールの一部ではありません。

(パッケージではなく)個別にデプロイしたストアド・プロシージャは、デプロイメント時に設定したストアド・プロシージャ名でアクセスします。ストアド・プロシージャ名は、メソッド名から付けられたデフォルト名、またはデプロイメント時に選択した名前です。

たとえば、greetingクラスおよびwelcomeパッケージからhelloとしてデプロイしたpublic staticメソッドhello()では、結果を返すデプロイ先のストアド・プロシージャにPL/SQL問合せを実行できます。

前述のhello()メソッドを、サンプル・メソッドと想定します。ただし、今回はパッケージなしでデプロイされたものと想定します。

データベースへの有効な接続を使用して、SQL*Plusクライアントでは次のことが実行されます。

select Openings.Hello() from dual;
 
Openings.Hello()

実行済のコードが表示されます。

Hello World!

Javaストアド・プロシージャのデバッグ方法

データベース接続を介してJavaストアド・プロシージャをデバッグします。

PL/SQLをデバッグするには:

  1. 「ウィンドウ」→「データベース」→「データベース」ウィンドウを選択します。
  2. 「IDE接続」またはアプリケーションを展開し、データベース接続を選択します。
  3. スキーマを開き、オブジェクト・タイプ(たとえば、「パッケージ」)の名前を持つノードを検索して開きます。
  4. ノードで、PL/SQLプログラムを右クリックして「デバッグ」を選択します。
  5. 「PL/SQLのデバッグ」ウィンドウが表示されます。ターゲットとパラメータを選択し、「OK」をクリックします。
  6. JDeveloperでは、プログラムがデバッグされます。ステータス・ウィンドウで、進捗状況と情報を確認します。

Javaストアド・プロシージャの削除方法

ストアド・プロシージャを削除するには:

  1. 「ウィンドウ」→「データベース」→「データベース」ウィンドウを選択します。
  2. 「IDE接続」またはアプリケーションを展開し、データベース接続を選択します。
  3. 接続を開き、スキーマを選択します。
  4. スキーマを開き、削除するオブジェクトを探します。Javaストアド・プロシージャは、公開方法に応じて、次のノードのいずれかに表示されます。
    • Packagesフォルダには、パッケージでデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

    • Functionsフォルダには、(値を返す)ファンクションとしてデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

    • Proceduresフォルダには、(値を返さない)プロシージャとしてデプロイされたJavaストアド・プロシージャのコール仕様が含まれます。

  5. オブジェクトを選択し、右クリックしてポップアップ・メニューを表示し、「削除」を選択します。