この章の内容は次のとおりです。
データベースでのJavaの使用には、3つの側面があります。
SQLJまたはJDBCの使用。両方とも、JavaプログラムにSQLを埋め込むために使用できます。
Javaプログラムからデータベース・オブジェクトおよびPL/SQLパッケージへのアクセス。
Javaストアド・プロシージャの使用。これは、データベース内に存在して動作するJavaメソッドです。
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は、Javaプログラムに静的なSQL文を組み込むための標準的な方法です。SQLJアプリケーションは移植性が高く、標準のJDBCドライバを使用して様々なベンダーのデータベースにアクセスできます。
SQLJを使用することにより、Javaを使用して、データベースにアクセスするためのアプリケーションを、クライアント側でも中間層でも開発できます。SQLJを使用した開発は素早く効率的で、JDeveloperではSQLJの開発環境を完全にサポートしています。SQLJファイルは、JDeveloperプロジェクト中に作成または含めることができます。SQLJソース・ファイルが含まれているプロジェクトをコンパイルすると、JDeveloperではSQLJトランスレータまたはプリコンパイラが自動的にコールされます。トランスレータは、完全に標準に準拠したJavaソース・コードを作成し、データベースをサポートするためのJDBCメソッドをコールします。その後JDeveloperが、SQLJトランスレータで生成されたJavaをコンパイルします。
詳細は、『Oracle® Database SQLJ開発者ガイド』を参照してください。
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は、コンパイル時にデータベース接続を使用し、コードに対して構文チェックおよびセマンティクス・チェックを行います。
SQLJは、問合せ結果やその他の戻りパラメータについて詳細なデータ型チェックを行いますが、JDBCの値は、コンパイル時にチェックなしでSQLとやり取りされます。
SQLJを使用すると、SQL文を簡単に操作できます。個別のメソッドを記述して各入力パラメータをバインドし、問合せリストの項目を1つずつ取得するかわりに、Javaのホスト変数を使用するSQL文を1つ記述します。つまりSQLJでは、バインディング機能までサポートします。
ただし、JDBCはSQL文の実行に関するファイングレイン・コントロールを可能にし、真に動的なSQL機能を提供します。アプリケーションで動的な処理が必要な場合(データベースやインスタンスのメタデータを実行時に検出する場合)は、JDBCを使用してください。
SQLJを使用してJavaプログラムにSQLを埋め込むには、多数のタスクを実行する必要があります。
新規のSQL (.sql)ファイルを作成し、現在のプロジェクトに追加できます。
SQLファイルを作成するには、次のようにします。
現在のプロジェクトに空のSQLファイルが追加され、エディタで開きます。
新規のSQLJ (.sqlj)ファイルを作成し、現在のプロジェクトに追加します。
新しいSQLJファイルを作成するには、次のようにします。
スケルトンSQLJクラスが現在のプロジェクトに追加され、編集画面が開きます。
Java .class
ファイルにSQLJクラスをコンパイルできます。
SQLJクラスをコンパイルするには、次のようにします。
JDeveloperウィンドウ下部のステータス・バーに、コンパイル結果が表示されます。エラーが発生した場合は、ログ・ウィンドウにリスト表示されます。
SQLJの実行可能文では、その句のSQL操作が実行されるデータベース接続を示す接続コンテキスト・オブジェクトを指定できます。SQLJ文で接続コンテキスト句を省略した場合、デフォルトの接続コンテキストが使用されます。
接続コンテキストは接続コンテキスト・クラスのオブジェクトの1つで、SQLJの接続宣言を使用して定義します。
コンテキスト・クラスを宣言するには、次のようにします。
コンテキスト・クラスを宣言した後、コンテキスト・オブジェクトを作成します。
SQLJコードのデバッグは、生成されたJavaコードではなく、SQLJソースを直接デバッグします。
SQLJは、他のソース・コードと同じ方法で、JDeveloperでデバッグされます。
詳細は、『Oracle® Database SQLJ開発者ガイド』を参照してください。
「プロジェクト・プロパティ」ダイアログのコントロールを使用して、SQLJクラスの変換を制御できます。
SQLコードの構文チェックおよびセマンティクス・チェックを行います。
SQL文の構文とデータ型をチェックします。
コンパイル時にJavaおよびSQL式の互換性をテストします。
データベース・サーバーへの接続を指定します。
接続コンテキストによって指定されたデータベース・スキーマに対して、SQL文のセマンティクスを確認します。
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プログラムにデータベースへの下位レベル・アクセスを提供します。
詳細は、『Oracle® Database SQLJ開発者ガイド』を参照してください。
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ドライバを選択します。
JDeveloperのプログラミング環境が、デフォルト以外のJDBCドライバを使用できるよう変更されている場合、次の手順で新規ドライバを使用するよう現在のプロジェクトを変更します。
プロジェクトを変更するには、次のようにします。
を使用して、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パッケージにアクセスするには、次のようにします。
oracle.sql.CustomDatum
インタフェースを実装することをお薦めします。 .sqlj
ファイルが、JavaまたはSQLJコンパイラにより .java
ファイルがコンパイルされます。 このプロセスを次の図に示します。
図27-3 OracleオブジェクトおよびPL/SQLパッケージ
では、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マッピング |
---|---|---|
|
|
|
|
|
|
|
|
|
LOB型のマッピング
構文: lobtypes={jdbc|oracle}
lobtypesパラメータ(およびそれに相当するJPublisherウィザードの「LOB型」)は、LOB型の型マッピングを制御します。次の表に、これらの型がどのようにlobtypes=oracle
(デフォルト)およびlobtypes=jdbc
に割り当てられるかを示します。
表27-3 LOB型のマッピング
PL/SQLデータ型 | Oracleマッピング・クラス | JDBCマッピング・クラス |
---|---|---|
|
|
|
|
|
|
BFILE型はマッピングが1つしかないため、この表には出ていません。oracle.sql.BFILE
クラスがないため、常にjava.sql.BFILE
に割り当てられます。
数値型のマッピング
構文: jpub.numbertypes={jdbc|objectjdbc|bigdecimal|oracle}
numbertypes
パラメータ(およびそれに相当するJPublisherウィザードの数値型)では、数値PL/SQL型の型マッピングを制御します。次の4つから選択できます。
jdbc
マッピングは、大部分の数値データベース型をint
やfloat
などのJavaプリミティブ型に、DECIMAL
およびNUMBER
をjava.math.BigDecimal
に割り当てます。
objectjdbc
マッピング(デフォルト)は、大部分の数値データベース型をjava.lang.Integer
やjava.lang.Float
などのJavaラッパー・クラスに、DECIMAL
およびNUMBER
をjava.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マッピング |
---|---|---|
|
|
|
|
|
|
|
|
|
ユーザー定義型のマッピング
構文: 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は、変換する各オブジェクト型に対して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により生成されたカスタムJavaクラスは、メソッドおよび一時フィールドを追加することで機能を強化できます。次に例を示します。
クラスを拡張します。すなわち、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により生成されたクラス、またはユーザーにより記述されたクラスで発生します。
データベース型がADDRESS
のVARRAY
およびネストした表要素を表すために、JAddress
クラスではなくMyAddress
クラスを使用します。
データベース型がADDRESS
のJavaオブジェクトの作成にCustomDatumFactory
インタフェースを使用する際、JAddress
ファクトリではなくMyAddress
ファクトリを使用します。このような状況は、JPublisherにより生成されたクラスと、ユーザーにより記述されたクラスの両方で発生します。
ユーザーが作成するクラス(MyAddress.java
など)には、次のような機能が必要です。
引数を持たないコンストラクタが必要です。適切に初期化したオブジェクトを容易に構築するには、スーパークラスのコンストラクタを明示的にまたは暗黙的に起動します。
このクラスはCustomDatum
インタフェースを実装する必要があります。スーパークラスからtoDatum()
メソッドを継承するのが最も簡単な方法です。
同じクラスまたは別のクラスにおけるCustomDatumFactory
インタフェースの実装も必要です。たとえば、CustomDatum
を実装するクラスEmployee
、およびCustomDatumFactory
を実装するクラスEmployeeFactory
などが考えられます。
JPublisherオプションは、スキーマの次のようなタイプのPL/SQLサブプログラムに対して設定できます。
JPublisherオプションの設定方法
JPublisherオプションは、スキーマの次のようなタイプのPL/SQLサブプログラムに対して設定できます。
関数
パッケージ本体
パッケージ
プロシージャ
詳細は、『Oracle® Database JPublisherユーザーズ・ガイド』を参照してください。
スキーマでPL/SQLサブプログラムにJPublisherオプションを設定するには、次のようにします。
Connection Managerでスキーマを参照して、該当するサブプログラム・タイプのノードを選択します。
右クリックし、「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オプションに指定された値がオーバーライドされます。
パッケージ・オプションを設定するには、次のようにします。
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ストアド・プロシージャをデプロイするには、次のようにします。
必要に応じて、JDeveloperでデータベース接続を作成します。
必要に応じて、LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルを作成します。
オブジェクトをデプロイします。
LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルの作成方法
LoadjavaおよびJavaストアド・プロシージャのデプロイメント・プロファイルは、シンプル・アーカイブ・プロファイルに非常に似ています。ただし、プロファイルの選択したコンテンツがコマンドライン・ツールloadjavaを介してOracleデータベースにアップロードされる点や、Javaストアド・プロシージャの場合にはOracleデータベースに汎用として格納される点が異なります。
注意:
この作業を完了する前に、JDeveloperでデータベース接続が構成済であることを確認してください。
JDeveloperでLoadjavaまたはJavaストアド・プロシージャのデプロイメント・プロファイルを作成するには、次のようにします。
「アプリケーション」ウィンドウで、デプロイメント・プロファイルを作成するプロジェクトを選択します。
「ファイル」→「新規」を選択して「新規ギャラリ」を開きます。
「カテゴリ」ツリーで「データベース層」を開き、「データベース・ファイル」を選択します。「項目」リストで、「LoadjavaおよびJavaストアド・プロシージャ」をダブルクリックします。
カテゴリまたは項目が見つからなければ、正しいプロジェクトが選択されていることを確認して、「フィルタ条件」ドロップダウン・リストの「すべてのテクノロジ」
を選択します。
「デプロイメント・プロファイルの作成」ダイアログで、デプロイメント・プロファイルの場所を指定するか、デフォルトを使用します。ファイル拡張子.dbexport
が付いたデプロイメント・プロファイル名が設定されます。
「保存」をクリックし、「LoadjavaおよびJavaストアド・プロシージャ・デプロイメント・プロファイル設定」ダイアログを表示します。各ページの設定を適宜構成し、作業が完了したら「OK」
をクリックします。
新しく作成したstoredProc.dbexport
デプロイメント・プロファイルが、「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されます。
「アプリケーション」ウィンドウでstoredProc.dbexport
を選択して右クリックします。使用可能なポップアップ・メニュー・オプションから選択します。
(オプション)ストアド・プロシージャ・パッケージの追加を選択する場合は、ストアド・プロシージャとしてロードするメソッドを選択します。SQLからコール可能な各Javaメソッドには、データベースにメソッドの最上位レベルのエントリ・ポイントを公開するコール仕様が必要です。通常、必要なコール仕様は少数です。JDeveloperでは、このページからコール仕様を生成します。
メソッドを選択して「設定」をクリックします。
リスト上のメソッドがグレー表示になっている場合は、このメソッドをJavaストアド・プロシージャとしてデプロイするには問題があることを示しています。詳細は、「指定不可の理由」をクリックしてください。
詳細は、『Oracle® Database JPublisherユーザーズ・ガイド』のJavaストアド・プロシージャの開発に関する項を参照してください。
必要に応じて「メソッドの設定」を構成します。この設定により、ストアド・プロシージャのカスタマイズに使用されるCREATE PROCEDURE
およびCREATE FUNCTION
SQL文の一部をカスタマイズできます。
(オプション)右クリックして「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ストアド・プロシージャをデプロイするには、次のようにします。
「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されるstoredProc.deploy
を右クリックします。
ポップアップ・メニューで「エクスポート先」
を選択し、既存のデータベース接続を1つ選択します。Javaアプリケーションのソース・ファイルが、選択したデータベースに直接アップロードされます。
または、「接続の作成」
を選択し、「データベース接続の作成」ウィザードを表示します。
(オプション)デプロイメント・プロファイルを編集する場合は、「アプリケーション」ウィンドウ内の指定したプロジェクトの下に表示されているstoredProc.deploy
を右クリックし、「設定」を選択します。
注意:
ファイルをコンパイル済ファイルとソース・ファイルの両方としてデプロイしていて、「リゾルバ」ページで-resolve
または-andresolve
を選択した場合、デプロイメント・プロファイルはソース・ファイルのみをアップロードします。これは、loadjavaがアップロードされた.javaソース・ファイルを解決する際、.javaソース・ファイルの.classファイルへのコンパイルも行うためです。Loadjavaデプロイメント・プロファイル設定をプレビューすると、ソース・ファイルのみが表示されます。
Javaストアド・プロシージャのコール方法
SQLのCALL文を使用して、Javaストアド・プロシージャをコールできます。
SQLを使用してJavaストアド・プロシージャをコールするには、次のようにします。
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ストアド・プロシージャをコールするには、次のようにします。
JDBCからコールするJavaストアド・プロシージャは、CallableStatementオブジェクトにカプセル化されている必要があります。
コール可能文オブジェクトを作成します。
コール可能文オブジェクトを宣言します。次に例を示します。
private CallableStatement checkIn;
ストアド・プロシージャのSQLのCALL文への接続に対してprepareCall
をコールして、コール可能文オブジェクトを初期化します。次に例を示します。
checkIn = connection.prepareCall(quot;{call NPL.CHECKIN(?, ?, ?)}");
注意:
ストアド・プロシージャ内のパラメータの数は、SQLコール内のプレースホルダの数によって表されます。
コール可能文オブジェクトの出力パラメータを登録します。出力パラメータを位置により識別し、その型を宣言するため、それぞれのパラメータに対してregisterOutParameter
をコールします。たとえば、2番目のパラメータがSQL INTEGER
(Java int
にマップ)で、3番目のパラメータがSQL VARCHAR
(Java String
にマップ)の場合、次のようになります。
newCustomer.registerOutParameter(2, Types.INTEGER); newCustomer.registerOutParameter(3, Types.VARCHAR);
コール可能文オブジェクトを実行します。
入力パラメータを位置により識別し、値を割り当てるために、setメソッドをコールすることにより、コール可能文オブジェクトの入力パラメータを指定します。たとえば、最初のパラメータがintの入力パラメータの場合、次のようになります。
checkIn.setInt(1, bookID);
コール可能文オブジェクトを実行します。次に例を示します。
checkIn.execute();
コール可能文オブジェクトの出力パラメータを実行します。位置により出力パラメータを識別し、それぞれのパラメータに対してgetメソッドをコールします。getメソッドにより、対応するJava型の値が返されます。次に例を示します。
int daysLate = checkIn.getInt(2); String title = checkIn.getString(3);
SQLJを使用してJavaストアド・プロシージャをコールするには、次のようにします。
入力および入出力変数を宣言し、初期化します。たとえば、最初のパラメータがintの入力パラメータの場合、次のようになります。
int bookID = scanID();
出力変数を宣言します。次に例を示します。
int daysLate; String title;
SQLJ文でストアド・プロシージャをコールします。文中でパラメータを名前で識別し、それぞれのパラメータに:in、:outまたは:inoutを指定します。次に例を示します。
#sql { call NPL.CHECKIN (:in bookID, :out daysLate, :out title)}
戻り値は出力変数および入力変数に割り当てられます。
PL/SQLを使用してJavaストアド・プロシージャをコールするには、次のようにします。
ストアド・プロシージャをコールして引数を渡すには、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ストアド・プロシージャをデバッグします。
PL/SQLをデバッグするには、次のようにします。
詳細は、「PL/SQLプログラムおよびJavaストアド・プロシージャのデバッグ」を参照してください。