プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle JDeveloperによるアプリケーションの開発
12c (12.2.1.2)
E82660-01
目次へ移動
目次

前
前へ
次
次へ

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

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

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

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

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

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

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

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

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ドライバを使用して様々なベンダーのデータベースにアクセスできます。

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

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

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コンポーネント

    この図は周囲のテキストで説明しています

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

図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文で使用するためには、まず宣言済接続コンテキストを作成する必要があります。

コンテキスト・オブジェクトを作成するには、次のようにします。

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

    たとえば、この文を使用して、接続コンテキスト・クラスMyConnectionContextのインスタンスthisCtxを作成します。

    MyConnectionContext thisCtx = new MyConnectionContext (myPath, myUID, myPasswd, autocommit

SQLJクラスのデバッグ方法

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

SQLJは、他のソース・コードと同じ方法で、JDeveloperでデバッグされます。

詳細は、『Oracle® Database 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 Beans

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

  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を使用したOracleオブジェクトおよびPL/SQLパッケージへのアクセス

を使用して、JavaプログラムからOracleオブジェクトおよびPL/SQLパッケージにアクセスします。Oracleオブジェクト型、参照型およびコレクション型の強い型指定のJavaクラスへのマッピングを指定およびカスタマイズすることが可能です

JavaプログラムからOracleオブジェクトおよびPL/SQLパッケージにアクセスするには、JPublisherを使用します。JPublisherでは、Oracleオブジェクト型、参照型およびコレクション型の強い型指定のJavaクラスへのマッピングを指定およびカスタマイズすることが可能です。

また、PL/SQLパッケージで宣言されているストアド・プロシージャをSQLJプログラムでコールする場合、JPublisherを使用して、そのパッケージに対するSQLJラッパー・クラスを生成します。SQLJラッパー・クラスにより、作成したSQLJプログラムから直接PL/SQLストアド・プロシージャをコールし、プロシージャと値をやり取りできます。

Javaを使用してOracleオブジェクトおよびPL/SQLパッケージにアクセスするには、次のようにします。

  1. データベースに、目的のオブジェクト・データ型(Oracleオブジェクト)とPL/SQLパッケージを作成します。Oracleデータベースで使用するカスタム・クラスやインタフェースではoracle.sql.CustomDatumインタフェースを実装することをお薦めします。
  2. JPublisherを使用してソース・コードを生成します。ソース・コードとはOracleオブジェクト、PL/SQLパッケージ、ユーザー定義型、REF型などを表すJavaファイルおよびSQLJファイルを意味します。
  3. これらのクラスをアプリケーション・コードにインポートします。
  4. 生成したクラスのメソッドを使用して、Oracleオブジェクトとその属性にアクセスして操作します。
  5. すべてのクラス(生成したコードと、各自のコード)をコンパイルします。SQLJコンパイラにより .sqljファイルが、JavaまたはSQLJコンパイラにより .javaファイルがコンパイルされます。
  6. コンパイルしたアプリケーションを実行します。

このプロセスを次の図に示します。

図27-3 OracleオブジェクトおよびPL/SQLパッケージ

この図は周囲のテキストで説明しています

JPublisherの使用方法

では、JavaプログラムからOracleオブジェクトおよびPL/SQLパッケージにアクセスできることにより、生産性が向上します。Oracleオブジェクト型、参照型およびコレクション型(VARRAYまたはネストした表)の強い型指定のJavaクラスへのマッピングを指定およびカスタマイズすることが可能です

JPublisher

JPublisherにより、使用するJavaプログラムからOracleオブジェクトおよびPL/SQLパッケージにアクセスできるため、生産性が向上します。JPublisherでは、Oracleオブジェクト型、参照型およびコレクション型(VARRAYまたはネストした表)の強い型指定のJavaクラスへのマッピングを指定およびカスタマイズすることが可能です。

PL/SQLパッケージで宣言されているストアド・プロシージャをSQLJプログラムでコールする場合、JPublisherを使用して、そのパッケージに対するSQLJラッパー・クラスを生成します。SQLJラッパー・クラスにより、作成したSQLJプログラムから直接PL/SQLストアド・プロシージャをコールし、プロシージャと値をやり取りできます。

詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。

オブジェクト型およびJPublisherについて

JPublisherを使用すると、Java言語アプリケーションでOracleデータベースにおけるユーザー定義のオブジェクト型を使用できるようになります。使用可能なオブジェクトは、ユーザー定義のオブジェクト、VARRAY、ネストした表、索引付き表またはオブジェクト型へのREFです。Java言語アプリケーションでオブジェクト・データにアクセスする場合、Javaの形式でデータを表す必要があります。JPublisherでは、オブジェクト型とJavaクラスとのマッピング、およびオブジェクト属性型とそれに対応するJava型とのマッピングを作成することで、これを容易にしています。

マッピングは、次の両方により決定されます。

  • 選択されたJavaマッピング・オプション。

  • オブジェクトのデータ型のカテゴリ。

また、JPublisherは、オブジェクトの各属性に対するgetおよびsetアクセッサ・メソッドを生成し、オプションでオブジェクトの各ストアド・プロシージャに対するラッパー・メソッドを生成します。ラッパー・メソッドは、データベースで実行されるストアド・プロシージャをコールするメソッドです。元のオブジェクト・メソッドがstaticの場合でも、JPublisherにより生成されるラッパー・メソッドは常にインスタンス・メソッドになります。

次の表は、JPublisherがオブジェクトに対して生成するJavaクラスの型をまとめたものです。


表27-1 SQL型からJavaクラスへのマッピング

SQL型 Javaクラス・マッピング

ユーザー定義オブジェクト型

オブジェクトの各属性をgetおよびsetするアクセッサ・メソッドと、オブジェクトのストアド・プロシージャをコールするラッパー・メソッド(オプション)を含むJavaクラス

VARRAY

ネストした表

索引付き表。

次のものをgetおよびsetできるJavaクラス

  • 配列全体

  • 配列のサブセット

  • 配列の各要素

オブジェクト型へのREF

REFが参照するオブジェクトをgetおよびsetするJavaクラス


JPublisherにより生成されたクラスは、oracle.sql.CustomDatumインタフェースまたはjava.sql.SQLDataインタフェースを実装します。いずれのインタフェースも、データベースとJavaプログラム間でのオブジェクト型インスタンスの転送を可能にします。oracle.sql.CustomDatumインタフェースを使用することをお薦めします。

PL/SQLパッケージおよびJPublisherについて

PL/SQLパッケージ中のストアド・プロシージャを、Javaアプリケーションからコールする場合があります。ストアド・プロシージャは、PL/SQL内で実装することも、PL/SQLに公開されたJavaメソッドにすることもできます。Javaの引数およびメソッドは、ストアド・プロシージャに渡され、返されます。

これを容易にするには、パッケージに各サブプログラムのラッパー・メソッドを含むクラスを作成するよう、JPublisherで指定します。サブプログラムごとに生成されたラッパー・メソッドは、元のメソッドが静的であっても、オブジェクト・メソッドと同様に必ずインスタンス・メソッドとなります。JPublisherにより生成されるラッパー・メソッドは、PL/SQLストアド・プロシージャをJavaコードからコールする、あるいはJavaストアド・プロシージャをクライアントJavaプログラムからコールする簡単な方法を提供します。

JPublisherでは、個々のパッケージを選択、またはスキーマ内の全パッケージを選択する場合はPackagesノードを選択することで、選択したパッケージのJavaラッパーを生成できます。パッケージに属さないサブプログラムを含むPL/SQLコードをコールした場合、JPublisherではパッケージに属さない各サブプログラムに対するラッパー・メソッドを含む単一クラスを生成します。

PL/SQLファンクションでは、Javaを生成する対象のPL/SQLファンクションが1つまたは複数のいずれの場合でも、JPublisherでは1つのクラスを生成します。ファンクションが1つの場合、クラスにはそのファンクションに対する1つのラッパー・メソッドが含まれます。ファンクションが複数の場合、クラスにはファンクションごとに1つのラッパー・メソッドが含まれます。

PL/SQLプロシージャでは、Javaを生成する対象のPL/SQLプロシージャが1つまたは複数のいずれの場合でも、JPublisherでは1つのクラスを生成します。プロシージャが1つの場合、クラスにはそのプロシージャに対する1つのラッパー・メソッドが含まれます。プロシージャが複数の場合、クラスにはプロシージャごとに1つのラッパー・メソッドが含まれます。

Javaマッピング・オプション

データ型のカテゴリに選択するマッピング・オプションにより、オブジェクト型とPL/SQLパッケージをJavaクラスに変換する際にJPublisherで使用する型マッピングのセットが決まります。

  • オブジェクト型の場合、JPublisherはオブジェクトの属性と、オブジェクトによって組み込まれるすべてのメソッドの引数と結果に対してマッピングを適用します。マッピングにより、生成されるアクセッサ・メソッドがサポートする型、すなわちgetメソッドにより返される型と、setメソッドにより要求される型が制御されます。

  • PL/SQLパッケージの場合、JPublisherは、メソッドの引数と結果に対してマッピングを適用します。

  • コレクション型(ネストした表とVARRAY)の場合、JPublisherはコレクションの要素型に対してマッピングを適用します。

  • ユーザー定義型(usertypesカテゴリ)の場合、JPublisherではCustomDatumクラスまたはSQLDataクラスを生成し、コレクション型とREF型に対するコードを生成します。

次のマッピング・オプションから選択できます。

  • データをPL/SQL形式で表すOracleマッピング

  • 単純なデータ型をJavaのプリミティブ・データ型として表すJDBCマッピング

  • 単純なデータ型をJavaラッパー・クラスとして表すObject JDBCマッピング

  • 共通のクラスを使用してすべての数値型を表すBigDecimalマッピング

詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。

ビルトイン型のマッピング

構文: jpub.builtintypes={jdbc|oracle}

builtintypesパラメータ(およびこれに相当するJPublisherウィザードの「ビルトイン型」)は、LOBおよびBFILE型(lobtypesパラメータで制御)と様々な数値型(numbertypesパラメータで制御)を除く、すべてのビルトイン・データベース型の型マッピングを制御します。次の表に、builtintypesパラメータの影響を受けるデータベース型と、それらのbuiltintypes=oracleおよびbuiltintypes=jdbc (デフォルト)の場合のJava型マッピングを示します。


表27-2 ビルトイン型のマッピング

PL/SQLデータ型 Oracleマッピング・クラス JDBCマッピング

CHAR

CHARACTER

LONG

STRING

VARCHAR

VARCHAR2

oracle.sql.CHAR

java.lang.String

RAW

LONG RAW

oracle.sql.RAW

byte[ ]

DATE

oracle.sql.DATE

java.sql.Timestamp


LOB型のマッピング

構文: lobtypes={jdbc|oracle}

lobtypesパラメータ(およびそれに相当するJPublisherウィザードの「LOB型」)は、LOB型の型マッピングを制御します。次の表に、これらの型がどのようにlobtypes=oracle(デフォルト)およびlobtypes=jdbcに割り当てられるかを示します。


表27-3 LOB型のマッピング

PL/SQLデータ型 Oracleマッピング・クラス JDBCマッピング・クラス

CLOB

oracle.sql.CLOB

java.sql.CLOB

BLOB

oracle.sql.BLOB

java.sql.BLOB


BFILE型はマッピングが1つしかないため、この表には出ていません。oracle.sql.BFILEクラスがないため、常にjava.sql.BFILEに割り当てられます。

数値型のマッピング

構文: jpub.numbertypes={jdbc|objectjdbc|bigdecimal|oracle}

numbertypesパラメータ(およびそれに相当するJPublisherウィザードの数値型)では、数値PL/SQL型の型マッピングを制御します。次の4つから選択できます。

  • jdbcマッピングは、大部分の数値データベース型をintfloatなどのJavaプリミティブ型に、DECIMALおよびNUMBERjava.math.BigDecimalに割り当てます。

  • objectjdbcマッピング(デフォルト)は、大部分の数値データベース型をjava.lang.Integerjava.lang.FloatなどのJavaラッパー・クラスに、DECIMALおよびNUMBERjava.math.BigDecimalに割り当てます。

  • bigdecimalマッピングは、すべての数値データベース型をjava.math.BigDecimalに割り当てます。oracleマッピングは、すべての数値データベース型をoracle.sql.NUMBERに割り当てます。

  • oracleマッピングは、すべての数値データベース型をoracle.sql.NUMBERに割り当てます。

次の表に、numbertypesオプションの影響を受けるPL/SQL型と、それらのnumbertypes=jdbcおよびnumbertypes=objectjdbc (デフォルト)のJava型マッピングを示します。


表27-4 数値型のマッピング

PL/SQLデータ型 JDBCマッピング・クラス Object JDBCマッピング

BINARY_INTEGER

INT

INTEGER

NATURAL

NATURALN

PLS_INTEGER

POSITIVE

POSITIVEN

SIGNTYPE

int

java.lang.Integer

SMALLINT

short

java.lang.Float

REAL

float

java.lang.Double


ユーザー定義型のマッピング

構文: jpub.usertypes={oracle|jdbc}

usertypesパラメータ(およびそれに相当するJPublisherウィザードの「ユーザー定義型」)は、JPublisherがユーザー定義型に対してCustomDatumクラスとSQLDataクラスのいずれを生成するかを、次のように制御します。

  • usertypes=oracle (デフォルト)の場合、JPublisherでは、オブジェクトコレクションおよびREFの各型に対しCustomDatumクラスを生成します。

  • usertypes=jdbcの場合、JPublisherでは、オブジェクト型に対しSQLDataクラスを生成します。コレクション型またはREF型に対しては何も生成しません。すべてのコレクション型にはjava.sql.Array、すべてのREF型にはjava.sql.Refを使用してください。

JPublisherの出力

JPublisherは、変換する各オブジェクト型に対してJavaクラスを生成します。各オブジェクト型ごとに、クラス・コードに対してtype.javaファイル(または、ラッパー・メソッドが要求された場合はtype.sqljファイル)が、Java型のREFクラス・コードに対してtypeRef.javaファイルが生成されます。たとえば、PL/SQLオブジェクト型EMPLOYEEを定義した場合、employee.javaファイルおよびemployeeRef.javaファイルが生成されます。

変換するコレクション型(ネストした表またはVARRAY)ごとに、JPublisherでは、type.javaファイルが生成されます。ネストした表の場合、生成されたクラスには、ネストした表を配列全体としてgetおよびsetするメソッドと、表の各要素をgetおよびsetするメソッドが含まれます。JPublisherは、CustomDatumクラスの生成時にはコレクション型を変換しますが、SQLDataクラスの生成時には変換しません。JPublisherは、ネストした表またはVARRAYにはtypeRef.javaファイルを生成しません。PL/SQLではこれらの型に対してREFが生成できないためです。

PL/SQLパッケージの場合、JPublisherはラッパー・メソッドを含むクラスをSQLJファイルとして生成します。またサーバーで実行される関連パッケージ・メソッドをコールするメソッド・ラッパーも、クラスに生成します。これは、「メソッドの組込み」オプションで指定します。

注意:

リリース8.1.6以上では、ストアド・プロシージャをコールするためにJPublisherで生成されるラッパー・メソッドは、SQLJのみです。JPublisherで生成され、ラッパー・メソッドを含むクラスは、SQLJを使用してコンパイルしてください。

プロパティ・ファイル

プロパティ・ファイルは、使用頻度の高いパラメータ、またはJPublisherウィザードでは指定できないパラメータを指定できる、オプションのテキスト・ファイルです。JPublisherのデフォルトの結果のみ必要とする場合は、プロパティ・ファイルは不要なので注意してください。

プロパティ・ファイルはJPublisherウィザードで指定します。

プロパティ・ファイルでは、1行につき1つ(必ず1つのみ)のパラメータおよびそれに関連付けられた値を指定します。各パラメータ名には接頭辞「jpub.」を付ける必要があり、行内で空白文字は使用できません。プロパティ・ファイルでは、propsパラメータ以外の任意のパラメータが使用可能です。JPublisherは、リストの始めから最後まで、パラメータを順に処理します。2回以上パラメータを指定した場合は、最後に出現する値が使用されます。

プロパティ・ファイルに指定するパラメータは、次のとおりです。

jpub.case=lower
jpub.package=package1
jpub.numbertypes=jdbc
jpub.lobtypes=jdbc
jpub.builtintypes=jdbc
jpub.usertypes=jdbc
jpub.omit_schema_names
jpub.methods=true
jpub.input=mySchema.txt
jpub.sql=employee:oracleEmployee

JPublisherで生成されるクラスの強化方法

JPublisherにより生成されたカスタムJavaクラスは、メソッドおよび一時フィールドを追加することで機能を強化できます。次に例を示します。

  • クラスを拡張します。すなわち、JPublisherで生成されるクラスをスーパークラスとして扱い、その機能を拡張するサブクラスを記述し、このサブクラスにオブジェクト型を割り当てます。

  • JPublisherで生成されるクラスにより提供される機能を生成されたクラスの型に定義されたフィールドに委任する、新規クラスを記述します。

  • クラスにメソッドを追加します。今後JPublisherを実行してクラスを再生成する予定がある場合、この処理はお薦めしません。変更後のクラスを再生成すると、その変更(つまり追加したメソッド)は元の状態に上書きされます。JPublisherの処理を他のファイルに出力した場合でも、ファイルに変更を反映する必要があります。

JPublisherで生成されるクラスの拡張方法

JPublisherウィザードの「宣言名」フィールドと「使用名」フィールドにより、生成するクラスを自由に拡張できます。「宣言名」フィールドには、指定したデータベース・オブジェクトからJPublisherで生成するクラスの名前を入力します。「使用名」フィールドには、そのデータベース・オブジェクトを表すためにJavaプログラムで使用するクラスの名前を入力します。

「使用名」と「宣言名」が異なるオブジェクト型を公開する場合、JPublisherによりdeclaration_name.sqljファイルおよびuse_nameRef.javaファイル(use_nameはJavaプログラムでのオブジェクト型)が作成されます。

JPublisherでこの処理を行うには、declaration_nameを拡張するクラスuse_nameが記述されていることが必要です。このクラスを提供しない場合、use_nameRef.javaファイルはコンパイルされません。

たとえば、JPublisherでPL/SQLオブジェクト型ADDRESSからクラスJAddressを生成すると想定します。また、ADDRESSオブジェクトを表すクラス、MyAddressも記述済であるとします。ここではMyAddressは、JAddressにより提供される機能を拡張する、またはJAddressフィールドを持つものです。

この場合は、データベース・ブラウザでADDRESSを選択し、右クリックで「Javaを生成」を選択します。JPublisherウィザードで、「宣言名」フィールドにJAddressを、「使用名」フィールドにMyAddressを入力します。JPublisherによりカスタムJavaクラスJAddressが生成され、ADDRESSオブジェクトが(JAddressクラスではなく) MyAddressクラスに割り当てられます。JAddressではなく、MyAddressに対する参照クラスも生成されます。

JPublisherでは、次のように生成するコードを変更します。

  • JAddressRefではなく、MyAddressRefというREFクラスを生成します。

  • データベース型がADDRESSの属性を表すために、JAddressクラスではなくMyAddressクラスを使用します。このような状況は、JPublisherにより生成されたクラス、またはユーザーにより記述されたクラスで発生します。

  • データベース型がADDRESSVARRAYおよびネストした表要素を表すために、JAddressクラスではなくMyAddressクラスを使用します。

  • データベース型がADDRESSのJavaオブジェクトの作成にCustomDatumFactoryインタフェースを使用する際、JAddressファクトリではなくMyAddressファクトリを使用します。このような状況は、JPublisherにより生成されたクラスと、ユーザーにより記述されたクラスの両方で発生します。

ユーザーが作成するクラス(MyAddress.javaなど)には、次のような機能が必要です。

  • 引数を持たないコンストラクタが必要です。適切に初期化したオブジェクトを容易に構築するには、スーパークラスのコンストラクタを明示的にまたは暗黙的に起動します。

  • このクラスはCustomDatumインタフェースを実装する必要があります。スーパークラスからtoDatum()メソッドを継承するのが最も簡単な方法です。

  • 同じクラスまたは別のクラスにおけるCustomDatumFactoryインタフェースの実装も必要です。たとえば、CustomDatumを実装するクラスEmployee、およびCustomDatumFactoryを実装するクラスEmployeeFactoryなどが考えられます。

JPublisherオプション

JPublisherオプションは、スキーマの次のようなタイプのPL/SQLサブプログラムに対して設定できます。

JPublisherオプションの設定方法

JPublisherオプションは、スキーマの次のようなタイプのPL/SQLサブプログラムに対して設定できます。

  • 関数

  • パッケージ本体

  • パッケージ

  • プロシージャ

詳細は、『Oracle® Database JPublisherユーザーズ・ガイド』を参照してください。

スキーマでPL/SQLサブプログラムにJPublisherオプションを設定するには、次のようにします。

  1. Connection Managerでスキーマを参照して、該当するサブプログラム・タイプのノードを選択します。

  2. 右クリックし、「Javaを生成」を選択して、「JPublisher」ウィザードを起動します。詳細は、[F1]を押すか、ウィザード内で「ヘルプ」をクリックしてください。

パッケージのクラスおよびメソッドのラッパー・メソッドの生成方法

「JPublisher」ウィザードで「メソッドの組込み」を選択し、JPublisherのmethodsオプションを設定します。

methodsオプションの値により、JPublisherでPL/SQLパッケージのクラスと、パッケージおよびオブジェクト型内のメソッドのラッパー・メソッドを生成するかどうかが決まります。

選択した場合、JPublisherによりPL/SQLのクラスおよびメソッドが生成されます。これはデフォルト動作です。

選択しない場合、PL/SQLのクラスおよびメソッドは生成されません。

生成された名前からのスキーマ名の省略方法

「JPublisher」ウィザードで「スキーマ名の省略」を選択し、JPublisherのomit_schema_namesオプションを設定します。

omit_schema_namesオプションの値により、JPublisherで生成される特定のオブジェクト型およびPL/SQLラッパーの名前にスキーマ名を含めるかどうかが決まります。JPublisherで生成されるオブジェクト型またはラッパーの名前にスキーマ名が含まれていない場合、JPublisherで生成されたコードを実行する際に、現在の接続に関連付けられているスキーマでその型またはラッパーが参照されます。このため、JPublisherで生成されるクラスは、JPublisher起動時に使用されていた接続以外の接続で使用できます。ただし、この型またはパッケージは、2つのスキーマでの宣言が同一である必要があります。

選択した場合、JPublisherで生成されるすべてのオブジェクト型もしくはラッパー名は、次のいずれかの場合にかぎりスキーマ名で修飾されます。

  • JPublisherの接続先以外のスキーマでオブジェクト型またはラッパーを宣言する場合

  • プロパティ・ファイルまたはINPUTファイルにおいて、スキーマ名付きでオブジェクト型またはラッパーを宣言する場合

つまり、他のスキーマからのオブジェクト型またはラッパーでは、それを識別するためのスキーマ名が必要ということであり、プロパティ・ファイルまたはINPUTファイルで型またはパッケージにスキーマ名を使用した場合、omit_schema_namesオプションはオーバーライドされます。

選択しない場合、JPublisherで生成されるすべてのオブジェクト型もしくはラッパー名は、スキーマ名で修飾されます。これはデフォルト動作です。

生成されたクラスのパッケージ名の設定方法

packageオプションは、JPublisherで生成されるJavaパッケージの名前を指定します。パッケージの名前は、各Javaファイルのパッケージ宣言で表示されます。ディレクトリ構造にもパッケージ名が反映されます。sqlオプションの後にINPUTファイルで明示的なパッケージ名を使用すると、packageオプションに指定された値がオーバーライドされます。

パッケージ・オプションを設定するには、次のようにします。

  1. 「JPublisher」ウィザードで「パッケージ」フィールドに名前を入力し、JPublisherのpackageオプションを設定します。

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

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

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

詳細は、『Oracle® Database JPublisherユーザーズ・ガイド』のJavaストアド・プロシージャの開発に関する項を参照してください。

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

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

図27-4 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データベース・ユーティリティで提供される情報を使用します。

  • 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ストアド・プロシージャとしてデプロイするには問題があることを示しています。詳細は、「指定不可の理由」をクリックしてください。

    詳細は、『Oracle® Database JPublisherユーザーズ・ガイド』の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. オブジェクトを選択し、右クリックしてポップアップ・メニューを表示し、「削除」を選択します。