この章では、JPublisherユーティリティの概要と、それに続いてJPublisher操作のサマリーと変換例を示します。この章の内容は、次のとおりです。
JPublisherはJavaで記述されたユーティリティです。JPublisherは、SQLオブジェクトやPL/SQLパッケージなどのデータベース・エンティティをJavaクライアント・プログラムで表すためにJavaクラスを生成します。また、SQL、PL/SQLおよびサーバー・サイドJavaからWebサービスに公開し、データベース内から外部Webサービスを起動できるようにするためのサポートを提供します。
JPublisherでは、次のデータベース・エンティティの型を表すクラスを作成できます。
ユーザー定義のSQLオブジェクト
オブジェクト参照
ユーザー定義のSQLコレクション
PL/SQLパッケージ
サーバー・サイドJavaクラス
SQL問合せおよびデータ操作言語(DML)文
JPublisherを使用すると、強い型指定の方法でこれらのエンティティのJavaクラスへのマッピングを指定およびカスタマイズできます。
|
注意: 強い型指定という用語は、特定のJava型がオブジェクト型など特定のユーザー定義SQL型に関連付けられていることを示します。たとえば、Personクラスは対応するPERSON SQL型に関連付けられています。また、SQLオブジェクト型の属性ごとにJava型が対応しています。 |
このユーティリティでは、オブジェクト型の属性ごとにアクセッサ・メソッドgetXXX()およびsetXXX()が生成されます。オブジェクト型にストアド・プロシージャがある場合は、JPublisherでストアド・プロシージャをコールするラッパー・メソッドを生成できます。この使用例で、ラッパー・メソッドは、Oracle Databaseで実行されるストアド・プロシージャをコールするJavaメソッドです。
また、JPublisherではPL/SQLパッケージ用のクラスも生成できます。これらのクラスには、PL/SQLパッケージのストアド・プロシージャをコールするためのラッパー・メソッドが含まれます。
JPublisherで生成されたクラスを直接使用しない場合、次の方法を実行できます。
生成されたクラスを拡張します。このプロセスは簡単です。JPublisherでは、サブクラスの初期バージョンも自動的に生成されるため、そこに必要な機能を追加できます。
ユーザーがJavaクラスを記述します。このアプローチは柔軟ですが、時間がかかりエラーも起こりやすくなります。
oracle.sqlパッケージの弱い型指定を持つ汎用クラスを使用して、オブジェクト型、オブジェクト参照型およびコレクション型を表します。これらのクラスがユーザーの要件を満たす場合は、JPublisherを使用する必要はありません。このアプローチを使用するのは、いずれかのSQLオブジェクト型、コレクション型、参照型またはOPAQUE型を汎用的に処理する必要がある場合です。
また、JPublisherでは、JavaからPL/SQL型へのアクセスが簡素化されます。PL/SQL型とSQL型の間で事前定義済またはユーザー定義のマッピングを使用できるのみでなく、この2種類の型の間でPL/SQL変換ファンクションを使用できます。このようなマッピングを使用することで、JPublisherは必要なJavaコードとPL/SQLコードをすべて自動的に生成できます。クライアント・サイドJavaクラスへのサーバー・サイドJavaクラスの公開も可能になります。これにより、アプリケーションではデータベース内のJavaクラスを直接コールできます。
複数の機能により、SQL、PL/SQLまたはサーバー・サイドJavaエンティティの公開により生成されたJavaクラスをWebサービスとして公開できます。
以降の各項では、JPublisherの新機能および要件の概要と、JPublisherによるコード生成時のSQLJの使用方法について説明します。
このリリースのJPublisherには、新機能はほとんどありません。新機能の1つとして、Javaコード生成オプションにtypeオプションが導入されています。このオプションの詳細は、「コード生成のタイプ」を参照してください。
この項の内容は、次のとおりです。
Oracle SQLJ Translatorとランタイム・ライブラリは、JPublisher製品に付属しています。JPublisherユーティリティでは、ラッパー・メソッドの作成など、ほとんどの場合に中間ステップとしてSQLJコードを生成することで、Oracle SQLJ実装が使用されます。ラッパー・メソッドは、PL/SQLパッケージを表すクラス、またはPL/SQLストアド・プロシージャを定義するSQLオブジェクト型を表すクラスについて作成されます。このような場合、JPublisherではコンパイル時にOracle SQLJ Translatorが使用され、プログラムの実行時にOracle SQLJランタイムが使用されます。
Oracle Database 11gでは、JPublisherによるSQLJの使用はデフォルトで透過的になっています。JPublisherにより生成されるSQLJソース・ファイルは、JPublisher設定で特に指定しないかぎり自動的に変換および削除されます。この自動変換により、ファイルを明示的に変換する作業が不要になります。SQLJ機能を使用する生成後の.javaファイルと、コンパイルにより生成された関連.classファイルで、SQLJクラスが定義されます。これらのクラスでは、実行時にOracle SQLJランタイムApplication Programming Interface(API)が使用されます。SQLJランタイムを使用しない生成後のクラスを、非SQLJクラスと呼びます。非SQLJクラスが生成されるのは、JPublisherでストアド・プロシージャを持たないSQL型のクラスが作成される場合、またはラッパー・メソッドを生成しないように特に設定されている場合です。
Oracle Database 11gでは、JPublisherの-sqljオプションを介してSQLJ Translatorにオプションを渡すことができます。
JPublisherは、SQLJ Translatorのライブラリも含むtranslator.jarに組み込まれています。JPublisherで生成されたクラスは、runtime12.jarに依存します。runtime12.jarは、Java Development Kit(JDK)1.5以上のSQLJランタイム・ライブラリです。
SQLJプログラムは、International Standardization Organization(ISO)規格のSQLJ言語参照構文に準拠した埋込みSQL文を含むJavaプログラムです。SQLJソース・コードには、標準Javaソース、SQLJクラス宣言およびSQL操作が埋め込まれたSQLJ実行可能文が混在しています。
SQLJが選択された理由は、データベース・アクセスに使用されるコードがJDBCコードよりも単純であったためです。SQLJでは1つのSQL文が1つの#sql文に埋め込まれますが、JDBCでは同じ操作に複数の文が必要な場合があります。
この項では、次に示すSQLJの主要概念について簡潔に説明します。
接続コンテキスト
SQLJの接続コンテキスト・オブジェクトは、強い型指定を持つデータベース接続オブジェクトです。各接続コンテキスト・クラスを、相関付けられているSQLエンティティの特定セットに使用できます。つまり、特定の接続コンテキスト・クラスを使用して定義するすべての接続では、共通の名前とデータ型を持つ表、ビューおよびストアド・プロシージャが使用されます。理論上、SQLエンティティ・セットにあわせて接続コンテキスト・クラスを調整するメリットは、この調整によりSQLJ変換中に可能になるオンライン・セマンティクス・チェックのレベルにあります。JPublisherでは、SQLJ Translatorの起動時にオンライン・セマンティクス・チェックは使用されませんが、.sqljファイルを直接操作するように選択すると、この機能を使用できます。
デフォルトで使用される接続コンテキスト・クラスはsqlj.runtime.ref.DefaultContextです。SQLJのデフォルト・コンテキストは、デフォルトの接続オブジェクトであり、このクラスのインスタンスです。DefaultContextクラスまたは任意のカスタム接続コンテキスト・クラスには、標準sqlj.runtime.ConnectionContextインタフェースが実装されます。JPublisherの-contextオプションを使用すると、データベース接続用にインスタンス化する必要がある接続コンテキスト・クラスを指定できます。
イテレータ
SQLJのイテレータは、強い型指定を持つバージョンのJDBC結果セットであり、基礎となるデータベース・カーソルに関連付けられています。SQLJイテレータは、SELECT文から問合せ結果を取るために使用されます。強い型指定は、各問合せ列のデータ型に基づきます。
実行コンテキスト
SQLJの実行コンテキストは、標準sqlj.runtime.ExecutionContextクラスのインスタンスであり、SQL操作が実行されるコンテキストを提供します。実行コンテキスト・インスタンスは、SQLJコードを介して実行される各SQL操作に暗黙的または明示的に関連付けられます。
Oracle8i DatabaseおよびOracle9i Databaseでは、.sqljソース・ファイルが参照可能な出力として生成され、SQLJコマンドライン・インタフェースを使用して変換できます。
|
注意: UNIXシステムでは、sqljスクリプトを実行してSQLJコマンドライン・インタフェースにアクセスできます。Microsoft Windowsでは、sqlj.exeを使用します。 |
Oracle Database 11gのJPublisherでは、-compatibleオプションを介して複数の下位互換性設定がサポートされています。このオプションにより、生成された.sqljファイルを引き続き次のような方法で処理できます。-compatibleオプションの設定の一部を次に示します。
-compatible=sqlj
JPublisherで.sqljファイルの変換ステップが強制的にスキップされます。.sqljファイルを明示的に変換する必要があります。ファイルを変換するために、-sqljオプションのみを使用してJPublisherを実行するか、または専用コマンドライン・インタフェースを介してSQLJ Translatorを直接実行できます。
-compatible=9i
JPublisherがOracle9i互換モードに設定されます。このモードでは、Oracle9iバージョンと同じコードを使用して.sqljファイルが生成されます。これにより、.sqljファイルを直接処理できます。
-compatible=8iまたは-compatible=both8i
JPublisherがOracle8i互換モードに設定されます。Oracle8iバージョンと同じコードを使用して.sqljファイルが生成されます。Oracle9i互換性モードと同様に、このモードでも.sqljファイルを直接処理できます。
Oracle8iおよびOracle9i互換性モード(特に前者)を使用すると、JPublisherにより大幅に異なるコードが生成されます。.sqljファイルを直接処理することのみが目的の場合は、sqlj設定を使用します。
この項では、JPublisherの基本要件について説明します。また、要件が緩和される状況についても説明します。
JPublisherユーティリティを使用する場合は、他のクラスとともにOracle SQLJ実装、Oracle JDBC実装およびSun社のJDK用のクラスも必要です。
JPublisherのすべての機能を使用するには、必要に応じて次のコンポーネントをインストールし、適切な環境変数を設定する必要があります。
Oracle Database 11g
JPublisherの起動スクリプトまたは実行可能ファイル
jpubスクリプト(UNIXシステムの場合)またはjpub.exeプログラム(Microsoft Windowsの場合)をファイル・パスに指定する必要があります。通常、これらはORACLE_HOME/bin(手動でダウンロードした場合はORACLE_HOME/sqlj/bin)にあります。適切にセットアップされていれば、コマンドラインにjpubと入力すると、共通のJPublisherオプションおよび入力設定の情報が表示されます。
JPublisherおよびSQLJ Translatorのクラス
これらのクラスは、通常はORACLE_HOME/sqlj/libのtranslator.jarライブラリにあります。
|
注意: トランスレータ・ライブラリも、translator-jserver.jarでデータベースに自動的にロードされます。 |
SQLJランタイム・クラス
SQLJランタイム・ライブラリは、JDK 1.5以上の場合はruntime12.jarです。通常、これはORACLE_HOME/sqlj/libにあります。このライブラリには、JPublisherのクライアント・サイド・ランタイム・クラス(特にoracle.jpub.reflect.Client)、およびJPublisherのサーバー・サイド・ランタイム・クラス(特にoracle.jpub.reflect.Server)が含まれています。これらのクラスは、データベースへのJavaコールインに使用されます。
Oracle Database 11gまたはOracle Database 10gのJDBCドライバ
Oracle 11g JDBCのJPublisher 11gを使用する場合、サポートされるJDKのバージョンは、JDK 1.5および1.6のみです。ただし、Oracle JDBC 10gドライバのJPublisher 11gを使用する場合、バージョン1.4.xのJDKも使用できます。Oracle JDBCライブラリは、JDK 1.4の場合はojdbc14.jar、JDK 1.5の場合はojdbc5*.jar、JDK 1.6の場合はojdbc6*.jarです。通常、これはORACLE_HOME/jdbc/libにあります。各JDBCライブラリのoracle.jpub.runtimeパッケージには、JPublisherランタイム・クラスも含まれています。
|
関連項目: 『Oracle Database JDBC開発者ガイドおよびリファレンス』 |
Webサービスのクラス
これらのクラスは、通常はORACLE_HOME/sqlj/libのdbwsa.jarおよびdbwsclient.jarライブラリにあります。
|
注意: これらの.jarファイルは、JPublisherの配布には含まれていませんが、http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.htmlからダウンロードできるデータベースWebサービスのコールアウト・ユーティリティに含まれています。 |
データベース内のその他のPL/SQLパッケージおよびJava Archive(JAR)ファイル(必要な場合)
Webサービスのコールインおよびコールアウト、PL/SQL型のサポートまたはサーバー・サイドJavaクラスのコールのサポートにJPublisher機能を使用する場合に、データベース内に存在している必要のあるパッケージおよびJARファイルがあります。これらのパッケージおよびファイルの一部は事前にロードされていますが、その他は手動でロードする必要があります。
aurora.zip
-proxywsdlを使用してWebサービスを公開する場合、または-dbjavaを使用してサーバー・サイドJavaクラスを公開する場合、JPublisherでは生成されたJavaラッパーをデータベースにロードできます。この場合、ORACLE_HOME/lib/aurora.zipファイルが必要です。Microsoft Windowsでは、このファイルをCLASSPATHに追加します。UNIXシステムでは、jpubスクリプトによりaurora.zipが自動的に使用されます。aurora.zipファイルを使用できない場合は、コマンドラインで-proxyopt=noloadを指定して、JPublisherのロード動作をオフにできます。
JDKバージョン1.4以上
Webサービスのコールアウトの場合、またはWebサービスのSYS.XMLTypeをマップする場合は、JDK1.4以上が必要です。
使用する必要があるJPublisherの機能に応じて、次の一部またはすべてのPL/SQLパッケージおよびJARファイルがデータベースに存在する必要があります。
SQLJUTLパッケージ。PL/SQL型をサポートします。
SQLJUTL2パッケージ。サーバー・サイドJavaクラスのコールをサポートします。
UTL_DBWSパッケージ。Webサービスのコールアウトをサポートします。
dbwsclient.jarファイル。Oracle Database 11gまたはOracle Database 10gからのWebサービスのコールアウトに使用するJava API for XML-based Remote Procedure Call(JAX-RPC)またはSimple Object Access Protocol(SOAP)クライアント・プロキシ・クラスをサポートします。
JARファイル。Oracle9iまたはOracle8iデータベースからのWebサービスのコールアウトに使用するSOAPクライアント・プロキシ・クラスをサポートします。
Oracle9i DatabaseまたはOracle8i DatabaseからのWebサービスのコールアウトの場合、dbwsclient.jarのようなJARファイルは存在しません。かわりに複数のJARファイルをロードする必要があります。また、JPublisherでは、Oracle9iまたはOracle8iでのJAX-RPCクライアント・プロキシ・クラスがまだサポートされていないことに注意してください。
この項の内容は、次のとおりです。
Oracle Database 11gでは、PL/SQLパッケージSQLJUTLおよびSQLJUTL2はデータベースのSYSスキーマに自動的にインストールされます。インストールを確認するには、このパッケージについて次のコマンドを実行します。
SQL> describe sys.sqljutl SQL> describe sys.sqljutl2
JPublisherに次のようなメッセージが表示される場合は、パッケージがインストールされていないことを示します。
Warning: Cannot determine what kind of type is <schema>.<type.> You likely need to install SYS.SQLJUTL. The database returns: ORA-06550: line 1, column 7: PLS-00201: identifier 'SYS.SQLJUTL' must be declared
SQLJUTLおよびSQLJUTL2パッケージをインストールするには、次のどちらか一方のファイルをSYSスキーマにインストールする必要があります。
ORACLE_HOME/sqlj/lib/sqljutl.sql(Oracle9i、Oracle Database 10gまたはOracle Database 11gの場合)
ORACLE_HOME/sqlj/lib/sqljutl8.sql(Oracle8iの場合)
Oracle Database 11gでは、UTL_DBWS PL/SQLパッケージはデータベースのSYSスキーマに自動的にインストールされます。インストールを確認するには、このパッケージについて次のコマンドを実行します。
SQL> describe sys.utl_dbws
パッケージがインストールされていないことを出力が示している場合は、SYSで次のスクリプトを実行します。
ORACLE_HOME/sqlj/lib/utl_dbws_decl.sql ORACLE_HOME/sqlj/lib/utl_dbws_body.sql
Oracle Database 11gでは、Webサービスのコールアウト用に次のファイルをデータベースにロードする必要があります。
ORACLE_HOME/sqlj/lib/dbwsclient.jar
このファイルは事前ロードされませんが、SYSスキーマ内で次の問合せを実行すると、ロード済かどうかを確認できます。
SQL> select status, object_type from all_objects where
dbms_java.longname(object_name)='oracle/jpub/runtime/dbws/DbwsProxy$1';
次の結果は、このファイルがロード済であることを示します。
STATUS OBJECT_TYPE ------- ------------------- VALID JAVA CLASS VALID SYNONYM
まだロードされていない場合は、次の例に示すようにloadjavaユーティリティを使用してこのファイルをロードできます。
% loadjava -oci8 -u sys -r -v -f -s
-grant public dbwsclient.jar
Password: password
|
注意: このファイルをロードする前に、java_pool_sizeデータベース・パラメータが80MB以上に設定されていること、およびshared_pool_sizeパラメータが96MB以上に設定されていることを確認してください。 |
Oracle9iまたはOracle8iデータベースからWebサービスをコールアウトするには、SOAPクライアント・プロキシ・クラスを使用します。そのためには、多数のJARファイルをデータベースにロードする必要があります。ロードには、次のコマンドを使用します。
% loadjava -u sys -r -v -s -f -grant public
ORACLE_HOME/soap/lib/soap.jar
ORACLE_HOME/dms/lib/dms.jar
J2EE_HOME/lib/servlet.jar
J2EE_HOME/lib/ejb.jar
J2EE_HOME/lib/mail.jar
Password: password
これらのファイルは、Oracle Application Serverをインストールすると取得できます。WebサービスをOracle Application Server Containers for J2EE(OC4J)とともに実行することになります。
|
注意:
|
デフォルトでは、-proxywsdlを使用してWebサービス・クライアントを公開するとき、または-dbjavaを使用してサーバー・サイドJavaクラスを公開するときに、-userおよび-sysuserオプションが設定されている場合、JPublisherでは生成されたJavaおよびPL/SQLラッパーがデータベースにロードされます。-url設定によりJDBC Thinドライバが指定されている場合、ロード処理では、データベースのパスワード・ファイルを適切に設定する必要があります。パスワード・ファイルを設定するには、次のステップを実行します。
コマンドラインで次のコマンドを入力します。
orapwd file=$ORACLE_HOME/dbs/orapw entries=5
Enter password: password
前述のコマンドで、yourpassは選択したパスワードです。
次のように、SQL*PlusからデータベースにSYSDBAとして接続します。
CONNECT / AS SYSDBA
次のように、SYSのパスワードを前のステップで設定したパスワードに変更します。
PASSWORD SYS
Changing password for SYS
New password: password
Retype new password: password
init.oraファイルを編集して、次の行を追加します。
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
これにより、SYSDBAとしてリモート・ログインできるようになります。
|
関連項目: 『Oracle Database JDBC開発者ガイドおよびリファレンス』 |
パスワード・ファイルの設定では、JPublisherで生成されたPL/SQLラッパーおよびJavaラッパーをデータベースに手動でロードすることもできます。JPublisherによる自動ロードをオフにするには、コマンドラインで-proxyopt=noloadを指定します。
JPublisherの特定の機能を使用しない場合は、要件が緩和されます。要件が緩和される場合の一部を次に示します。
Oracle固有のoracle.sql.ORADataインタフェースまたは使用不可のoracle.sql.CustomDatumインタフェースを実装するクラスを生成しない場合は、Oracle以外のJDBCドライバを使用してOracle以外のデータベースに接続できます。ただし、JPublisherはOracleデータベースに接続できる必要があります。
|
注意: Oracleでは、Oracle以外のコンポーネントを使用する構成のテストもサポートもしません。 |
JPublisherに対して-methods=falseを設定してラッパー・メソッドを生成しないように指示した場合や、オブジェクト型でメソッドが定義されていない場合は、JPublisherでラッパー・メソッドが生成されず、SQLJクラスも生成されません。このような場合、SQLJ変換ステップは存在しないため、SQLJ Translatorは不要です。
JPublisher機能を使用してWebサービスのコールアウトを使用可能にしない場合、dbwsa.jarまたはdbwsclient.jarをデータベースにロードする必要はありません。
JPublisherの使用時は、次の制限事項に注意する必要があります。
JPublisherでは、PL/SQLのRECORD型および索引付き表の型のサポートに制限があります。RECORDまたは索引付き表の引数からJDBCでサポートされるSQL型へのマッピングには、中間的なラッパー・レイヤーが使用されます。また、JPublisherでは、索引付き表のセマンティクスが完全にはサポートされません。索引付き表の構造はJavaのハッシュテーブルに似ていますが、JPublisherによりSQLのTABLE型にマップされると情報が失われます。
INPUTファイルを使用して型マッピングを指定する場合は、なんらかの潜在的な破壊的エラー条件があっても、JPublisherではエラー・メッセージや警告メッセージが生成されないことに注意してください。また、SQLまたはJavaの識別子として使用できない予約語があります。
JPublisherの-omit_schema_namesオプションはブール型オプションとして動作しますが、他のブール型オプションとは構文が異なります。このオプションを使用すると、JPublisherに対して、ラッパー・クラスで参照されるSQL名の修飾にスキーマ名を使用しないように指示できます。デフォルトでは、SQL名がスキーマ名で修飾されます。スキーマ名の使用を禁止するには、コマンドラインに-omit_schema_names=trueまたは-omit_schema_names=falseを設定せず、-omit_schema_namesオプションを入力します。
|
注意: この章では、他の種類の入力ファイルと区別するため、-inputオプションで指定した入力ファイルをINPUTファイルとします。 |
JPublisherを使用すると、次のものを公開できます。
SQLユーザー定義型
PL/SQLパッケージ
サーバー・サイドJavaクラス
SQL問合せまたはDML文
Webサービスのコールアウトに使用するプロキシ・クラスとラッパー
Oracle Streams AQ
次の項では、JPublisherマッピングとマッピング・カテゴリの基本的な概要を説明します。
JPublisherには、次の型からJavaクラスへのマッピングが用意されています。
ユーザー定義SQL型
PL/SQL型
Oracle固有の実装(標準実装)または汎用実装を使用して、オブジェクト型、コレクション型、オブジェクト参照型およびOPAQUE型などのユーザー定義のSQL型をJavaプログラムで表現できます。
ここでは、次の3つのアプローチを要約して説明します。
Oracle固有のORADataインタフェースを実装するクラスを使用します。
JPublisherでは、oracle.sql.ORADataインタフェースを実装するクラスが生成されます。ORADataインタフェースでは、SQLオブジェクト型、オブジェクト参照型、コレクション型およびOPAQUE型が、強い型指定の方法でサポートされます。つまり、データベース内の特定のオブジェクト型、オブジェクト参照型、コレクション型またはOPAQUE型ごとに、対応するJavaの型があります。
JDBC仕様の説明に従って、標準SQLDataインタフェースを実装するクラスを使用します。
JPublisherでは、java.sql.SQLDataインタフェースを実装するSQLオブジェクト型用のクラスが生成されます。SQLDataインタフェースを使用する場合、すべてのオブジェクト参照型は汎用的にjava.sql.Refとして表され、すべてのコレクション型は汎用的にjava.sql.Arrayとして表されます。また、SQLDataを使用する場合、OPAQUE型を表現するためのメカニズムはありません。
oracle.sql.*クラスを使用します。
oracle.sql.*クラスを使用してユーザー定義型を汎用的に表現できます。oracle.sql.STRUCTクラスはすべてのオブジェクト型を表し、oracle.sql.ARRAYクラスはすべての変数配列型(VARRAY)およびネストした表型を表し、oracle.sql.REFクラスはすべてのオブジェクト参照型を表し、oracle.sql.OPAQUEクラスはすべてのOPAQUE型を表します。これらのクラスは、java.lang.Stringと同様に不変です。
汎用的な方法でオブジェクト型、コレクション型、参照型またはOPAQUE型を処理するコードについては、このオプションを選択してください。ORADataまたはSQLDataを実装するクラスとは異なり、oracle.sql.*クラスは強い型指定を持ちません。
|
注意: ユーザー独自のクラスを作成できますが、お薦めしません。独自のクラスを作成したり、オブジェクト型の継承階層用のクラスを生成する場合は、型マップを使用してクラスを登録する必要があります。 |
ORADataまたはSQLDataを実装するJPublisher生成クラスには、強い型指定のみではなく次のメリットがあります。
クラスは汎用的ではなく、カスタマイズされています。オブジェクトの属性にアクセスするには、そのオブジェクトの特定の属性の後に名前が指定されているgetXXX()およびsetXXX()メソッドを使用します。データに変更があった場合は、データベース内のオブジェクトを明示的に更新する必要があることに注意してください。
クラスは可変です。オブジェクトの属性またはコレクションの要素は変更できます。ただし、オブジェクト参照型を表すORADataクラスは不変です。これは、オブジェクト参照には変更できるサブコンポーネントがないためです。ただし、参照オブジェクトのsetValue()メソッドを使用すると、参照先のデータベース値を変更できます。
シリアライズ可能なJavaラッパー・クラス、またはオブジェクトとその属性値を出力するtoString()メソッドを持つJavaラッパー・クラスを生成できます。
基本的に、SQLDataを実装するクラスに比べて、ORADataを実装するクラスの方が効率的です。これは、ORADataクラスはネイティブなJava型への不要な変換を行わないためです。
|
関連項目: 『Oracle Database JDBC開発者ガイドおよびリファレンス』 |
Oracle ORAData実装の場合、JPublisherでは、弱い型指定のoracle.sql.REFクラスを使用する場合とは異なり、常に強い型指定を持つオブジェクト参照のクラスが生成されます。これは、オブジェクト参照が強い型指定を持ち、SQLでの動作を反映して、型保証を強化するためです。強い型指定を持つクラス(PERSONオブジェクト参照の場合はPersonRefクラスなど)は、oracle.sql.REFクラスのラッパーです。
このような強い型指定を持つREFラッパーの場合は、getValue()メソッドにより、参照されるSQLオブジェクトのインスタンスが、対応するJavaクラスのインスタンスとして生成されます。継承の場合は、対応するJavaクラスのサブクラスのインスタンスが生成されます。
たとえば、データベースにPERSONオブジェクト型があり、JavaクラスPersonが対応している場合は、JavaクラスPersonRefも生成されます。PersonRefクラスのgetValue()メソッドは、データベース内のPERSONオブジェクトのデータを含むPersonインスタンスを戻します。また、JPublisherでは、PersonRefクラスに対する静的cast()メソッドを生成することもできます。これにより、他の型指定の参照をPersonRefインスタンスに変換できます。
SQLオブジェクト型が属性としてオブジェクト参照を持っている場合、そのオブジェクト型に対応するJavaクラスの属性は、該当する参照型に対応するJavaクラスのインスタンスになります。たとえば、MANAGER REF属性を持つPERSONオブジェクトがある場合、それに対応するJavaクラスPersonはManagerRef属性を持ちます。
JDBCは、BOOLEAN型、PL/SQLのRECORD型など、ストアド・プロシージャやファンクションに使用されるPL/SQL固有の型をサポートしていません。JPublisherには、PL/SQL型用に次の回避策が用意されています。
JPublisherには型マップがあり、JDBCでサポートされないPL/SQL型のマッピングの指定に使用できます。
PL/SQLのRECORD型または索引付き表の型の場合は、マッピングの中間ステップとして、JPublisherでそれぞれSQLオブジェクト型またはSQLコレクション型を自動的に作成するように選択することもできます。
どちらの回避策でも、JPublisherではPL/SQL変換ファンクションを作成するか、事前定義済の変換ファンクション(通常はSYS.SQLJUTLパッケージ内)を使用して、PL/SQL型および対応するSQL型の間で変換されます。変換ファンクションは、ストアド・プロシージャを直接コールするように生成されたJavaコードに使用できます。または、JPublisherでPL/SQLストアド・プロシージャのラッパー・ファンクションを作成できます。この場合、生成されたJavaコードはラッパー・ファンクションをコールし、ラッパー・ファンクションが変換ファンクションをコールします。どちらの場合も、JDBCにはSQL型のみが公開されます。
JPublisherには、SQLからJavaへのデータ型マッピングについて、様々なカテゴリが用意されています。型マッピング・オプションごとに、少なくとも2つの可能な値jdbcまたはoracleがあります。-numbertypesオプションには、さらに2つの代替値objectjdbcおよびbigdecimalがあります。これらのマッピング・カテゴリについては、後述します。
JDBCマッピングでは、次のマッピングが行われます。
ほとんどの数値型は、intおよびfloatなどのJavaプリミティブ型にマップされます。
DECIMALおよびNUMBER型はjava.math.BigDecimalにマップされます。
ラージ・オブジェクト(LOB)型とその他の非数値組込み型は、java.sql.Blobやjava.sql.Timestampなどの標準JDBC型にマップされます。
オブジェクト型の場合、JPublisherではSQLDataクラスが生成されます。Oracle拡張要素である事前定義済データ型(BFILEおよびROWIDなど)にはJDBCマッピングがないため、oracle.sql.*マッピングのみがサポートされます。
JDBCマッピングで使用されるJavaプリミティブ型ではNULL値はサポートされず、整数オーバーフローや浮動小数点での精度損失に対する保護も行われません。JDBCマッピングの使用中に、データベース値がNULLのプリミティブ型の属性を取得するためにアクセッサ・メソッドをコールしようとした場合は、例外が発生します。プリミティブ型がshortまたはintの場合で、値が大きすぎてshortまたはint変数に入らない場合は、例外が発生します。
Object JDBCマッピングでは、ほとんどの数値型はjava.lang.Integerおよびjava.lang.FloatなどのJavaラッパー・クラスにマップされ、DECIMALおよびNUMBERはjava.math.BigDecimalにマップされます。JDBCマッピングとの違いは、プリミティブ型を使用しないことです。
Object JDBCは数値型のデフォルト・マッピングです。Object JDBCマッピングを使用する場合、戻される値はすべてオブジェクトです。値がNULLの属性を取得しようとすると、NULLオブジェクトが戻されます。Object JDBCマッピングで使用されるJavaラッパー・クラスでは、整数オーバーフローや浮動小数点での精度損失に対する保護は行われません。アクセッサ・メソッドをコールしてjava.lang.Integerにマップされる属性を取得する場合に値が大きすぎて入らないときは、例外が発生します。
Oracleマッピングでは、数値型、LOB型およびその他の組込み型は、oracle.sqlパッケージのクラスにマップされます。たとえば、DATE型はoracle.sql.DATEにマップされ、すべての数値型はoracle.sql.NUMBERにマップされます。オブジェクト型、コレクション型およびオブジェクト参照型の場合、JPublisherではORADataクラスが生成されます。
Oracleマッピングではプリミティブ型を使用しないため、すべての場合にNULL値をJava nullとして表せます。Oracleマッピングではすべての数値型でoracle.sql.NUMBERクラスを使用するため、データベースに格納できる最大の数値を表すこともできます。
データベース・エンティティを公開するために、JPublisherはデータベースに接続し、コマンドラインまたはINPUTファイルで指定されたSQL型、PL/SQLパッケージまたはサーバー・サイドJavaクラスの記述を取得します。JPublisherはデフォルトでJDBC Oracle Call Interface(OCI)ドライバを使用してデータベースに接続します。この場合、Oracle Net Servicesと必要なサポート・ファイルを含むOracleクライアントをインストールしたマシンが必要です。Oracleクライアント・マシンがない場合、JPublisherではOracle JDBC Thinドライバを使用できます。
JPublisherでは、変換するSQL型またはPL/SQLパッケージごとのJavaクラスと処理する各サーバー・サイドJavaクラスが生成されます。生成されたクラスには、データベースでオブジェクトの読取り/書込みを行うために必要なコードが含まれます。JPublisherで生成したクラスをデプロイする際には、JDBCドライバも含めて、必要なランタイム・ファイルをマシンにインストールする必要があります。JPublisherがストアド・プロシージャのラッパー・メソッドを生成すると、それを生成するクラスでは実行時にSQLJランタイムが使用されます。この場合は、SQLJランタイム・ライブラリruntime12.jarも必要です。
SQLオブジェクト用に生成されたクラスのインスタンスでラッパー・メソッドをコールすると、対応するオブジェクトのSQL値がINまたはIN OUT引数とともにサーバーに送られます。次に、メソッドがコールされ、新規オブジェクト値がOUTまたはIN OUT引数とともにクライアントに戻されます。この結果、データベースとのラウンドトリップが発生するため注意してください。メソッドのコールでオブジェクトに対する単純な状態変更のみが実行される場合は、状態変更にローカルに影響する等価のJavaを記述して使用する方がはるかに効率的です。
JPublisherで生成されるクラスの数は、ORADataクラスまたはSQLDataクラスのどちらを要求するかによって異なります。
データベース内部からのアクセス用に外部Webサービスを公開するには、JPublisherで指定されたWeb Service Description Language(WSDL)ドキュメントにアクセスして該当するクライアント・プロキシ・クラスの生成を指示します。次に、PL/SQLからWebサービスをコールアウトできるように、ラッパー・クラス(必要な場合)およびPL/SQLラッパーを生成します。
以降の各項では次の詳細を説明します。
コマンドラインおよびJPublisherプロパティ・ファイルで入力オプションを指定できます。変換されたエンティティ用にJavaクラスが生成されるのみではなく、JPublisherでは変換されたオブジェクトとパッケージの名前を標準出力に書き出します。
JPublisherのINPUTファイルと呼ばれるファイルを使用して、JPublisherで公開するSQL型、PL/SQLパッケージまたはサーバー・サイドJavaクラスを指定できます。また、生成されたパッケージおよびクラスのネーミングも制御します。
プロパティ・ファイルを使用してオプション設定を指定するには、コマンドラインで-propsオプションを使用してプロパティ・ファイル名を指定します。JPublisherでは、プロパティ・ファイルの内容が-propsオプションの時点でコマンドラインから順序どおり挿入されたかのように処理されます。柔軟性を高めるために、プロパティ・ファイルをSQLスクリプト・ファイルにして、JPublisherディレクティブをSQLコメントに埋め込むこともできます。
この項では、ユーザー定義オブジェクト型、ユーザー定義コレクション型、OPAQUE型、PL/SQLパッケージ、サーバー・サイドJavaクラス、SQL問合せまたはDML文およびAQとストリームに関するJPublisher出力について説明します。
|
注意: JPublisherでは、SQL型またはPL/SQLパッケージなどのデータベース・エンティティを公開すると、そのエンティティで参照される型のクラスも生成されることに注意してください。たとえば、公開するPL/SQLパッケージのストアド・プロシージャの引数としてSQLオブジェクト型が使用されている場合は、そのSQLオブジェクト型にマップするためのクラスが生成されます。 |
ユーザー定義のオブジェクト型の場合、JPublisherを実行してORADataクラスを要求すると、次のクラスが生成されます。
JavaプログラムでOracleオブジェクト型のインスタンスを表すオブジェクト・クラス。
オブジェクト型ごとに、クラス・コード用のtype.javaファイルが生成されます。たとえば、Oracleオブジェクト型EMPLOYEEの場合はEmployee.javaが生成されます。
スタブ・サブクラス(オプション)。
JPublisher設定に指定した名前が付けられます。生成されたスタブ・サブクラスを変更して、カスタム機能に使用できます。
生成されたクラスまたはサブクラスで実装するインタフェース(オプション)。
オブジェクト参照用の関連参照クラス。
JPublisherでは、オブジェクト型に関連付けられたREFクラス用にtypeRef.javaファイルが生成されます。たとえば、Oracleオブジェクト型EMPLOYEEの参照についてはEmployeeRef.javaファイルが生成されます。
トップレベル・オブジェクト内で直接または間接的にネストされたオブジェクト、コレクションまたはOPAQUEの属性用のJavaクラス。
この自動作成が必要なのは、トップレベル・クラスのインスタンスが実体化されるたびに、Javaで属性を実体化できるようにするためです。SQL OPAQUE型やPL/SQL型など、属性の型が事前にマップされている場合、JPublisherではマップからのターゲットJava型が使用されます。
|
注意: ORAData実装の場合は、SQLオブジェクト型で参照が使用されるかどうかに関係なく、強い型指定を持つ参照クラスが常に生成されます。 |
一方、SQLDataクラスを要求すると、JPublisherではオブジェクト参照クラス、ネストされたコレクション属性用のクラスまたはOPAQUE属性用のクラスのどちらも生成されません。
ユーザー定義コレクション型に対してJPublisherを実行している場合は、ORADataクラスを要求する必要があります。JPublisherでは次のクラスが生成されます。
Oracleコレクション型に対応する型定義として動作するコレクション・クラス。
JPublisherで変換されるコレクション型ごとに、type.javaファイルが生成されます。ネストした表の場合、生成されたクラスは、配列全体としてネストした表を取得および設定するメソッドと、表の個々の要素を取得および設定するメソッドを持ちます。JPublisherでは、コレクション型はORADataクラスの生成時に変換されますが、SQLDataクラスの生成時には変換されません。
コレクションの要素がオブジェクトの場合は、要素型用のJavaクラス、および要素型の中で直接または間接的にネストされたオブジェクト属性またはコレクション属性用のJavaクラス。
この自動生成が必要なのは、コレクションのインスタンスが実体化されるたびに、Javaでオブジェクト要素を実体化できるようにするためです。
生成された型により実装されるインタフェース(オプション)。
|
注意: オブジェクト型とは異なり、コレクション型にはユーザー・サブクラスを生成するためのオプションはありません。 |
OPAQUE型に対してJPublisherを実行している場合は、ORADataクラスを要求する必要があります。JPublisherでは、OPAQUE型のラッパーとして動作するJavaクラス(OPAQUE型メソッドのJavaバージョンを提供)と、サブクラス内でOPAQUE型の表現にアクセスするための保護付きAPIが作成されます。
ただし、ほとんどの場合、SQL OPAQUE型用のJavaラッパー・クラスは、OPAQUE型のプロバイダから提供されます。たとえば、SYS.XMLTYPE SQL OPAQUE型の場合はoracle.xdb.XMLTypeクラスになります。この場合、SQL型とJava型との対応付けは、型マップを介してJPublisherに対し事前定義されていることが保証されます。
PL/SQLパッケージに対してJPublisherを実行すると、そのパッケージのストアド・プロシージャをサーバーでコールするラッパー・メソッドを含むJavaクラスが作成されます。メソッドのIN引数は、クライアントからサーバーへ送られ、OUT引数および結果はサーバーからクライアントへ戻されます。
汎用的に使用されるサーバー・サイドJavaクラスに対してJPublisherを実行すると、サーバー・クラスをミラー化するクライアント・サイド・スタブ・クラス用のソース・コードtype.javaが作成されます。クライアント・サイド・メソッドをコールすると、対応するサーバー・サイド・メソッドが透過的にコールされます。
Webサービスのコールアウトの場合、JPublisherでは、通常はサーバー・サイドのクライアント・プロキシ・クラスのラッパー・クラスが生成されます。これらのラッパー・クラスは、対応するPL/SQLラッパーへのブリッジとして機能します。PL/SQLではインスタンス・メソッドがサポートされないため、プロキシ・クラスのインスタンス・メソッドを静的メソッドとして公開するために、このクラスが必要となります。
JPublisherをSQL問合せまたはDML文に対して実行すると、次が作成されます。
SQL文を実行するメソッドを実装するJavaクラス。
JPublisher設定に指定した名前のJavaスタブ・サブクラス(オプション)。
このスタブ・サブクラスを変更して、カスタム機能に使用できます。
生成されたクラスまたはサブクラスで実装するJavaインタフェース(オプション)。
JPublisherをAQまたはトピックに対して実行すると、次が作成されます。
キューまたはトピックのJavaクラス。
キューまたはトピックのペイロード・タイプのJavaクラス。
ストリームの場合、JPublisherではストリームのJavaクラスが生成されます。ペイロードは常にSYS.ANYDATAであり、java.lang.Objectにマップされます。
使用方法によっては、JPublisherでPL/SQLパッケージおよび関連PL/SQLスクリプトを生成できます。
PL/SQLパッケージ
通常、JPublisherでは次のいずれかのPL/SQLコードを使用してPL/SQLパッケージが生成されます。
生成されるJavaメソッドのPL/SQLコール仕様
PL/SQL型をサポートするためのPL/SQL変換ファンクションおよびラッパー・ファンクション
PL/SQLテーブル・ファンクション
変換ファンクションとラッパー・ファンクション(オプション)は、JPublisherで変換するストアド・プロシージャのコール順序に使用されるPL/SQL型をマップするために使用されます。各ファンクションでは、通常、JDBCでPL/SQL型がサポートされない場合に、PL/SQL型と対応するSQL型との間の変換が実行されます。
PL/SQLスクリプト
JPublisherでは、次のPL/SQLスクリプトが生成されます。
PL/SQLパッケージと必要なSQL型を作成するラッパー・スクリプト
ラッパー・スクリプトを実行するためのパーミッションを付与するスクリプト
ラッパー・スクリプトを実行するためのパーミッションを取り消すスクリプト
ラッパー・スクリプトにより作成されたパッケージおよび型を削除するスクリプト
この項の内容は、次のとおりです。
図2-1は、指定したSQL型、PL/SQLパッケージまたはサーバー・サイドJavaクラスを公開する基本的な手順を示しています。手順は次のとおりです。
必要に応じてコマンドライン、プロパティ・ファイルおよびINPUTファイルからの入力を使用し、JPublisherを実行します。
JPublisherが接続先データベースにアクセスし、公開対象として指定されたSQLまたはPL/SQLエンティティの定義を取得します。
JPublisherが、ストアド・プロシージャのラッパー・メソッドを作成するかどうかに応じて、ソース・ファイル.javaまたは.sqljを生成します。
JPublisherはデフォルトでSQLJ Translator(JPublisherに付属)を起動し、.sqljファイルを.javaファイルに変換します。
SQLJクラスの場合、SQLJ TranslatorはデフォルトでJavaコンパイラを起動し、.javaファイルを.classファイルにコンパイルします。非SQLJクラスの場合、JPublisherはJavaコンパイラを起動します。
JPublisherが、必要に応じて.classファイルのみではなくPL/SQLラッパーおよびスクリプトを出力します。PL/SQLラッパー・パッケージと必要なSQL型(PL/SQL型にマップする型など)を作成するスクリプト、これらのエンティティを削除するスクリプト、および必要な権限を付与または取り消すスクリプトがあります。
プロキシ・クラスを(-proxywsdlまたは-proxyclassesオプションを介して)生成する場合、JPublisherは生成されたPL/SQLラッパーとスクリプトをデータベースのPL/SQLエンジンで実行できるように接続先データベースにロードできます。
デフォルトでJPublisherは、Webサービスのコールアウト用に生成されたJavaクラスを、Oracle JVMで実行できるように接続先データベースにロードします。通常、Webサービスのコールアウト用を除き、JPublisherで生成されたクラスは、クライアントまたは中間層JVMで実行されます。JPublisherで生成されたクラスのサブクラスなど、通常はクライアントまたは中間層JVMで実行される独自クラスも使用できます。
ほとんどのオペレーティング・システムでは、次のようにjpubの後に一連のオプション設定を入力し、コマンドラインからJPublisherを起動できます。
% jpub -option1=value1 -option2=value2 ...
JPublisherは、データベースに接続してユーザー指定の型またはパッケージの宣言を取得します。次に、1つ以上のカスタムJavaクラスを生成し、変換されたオブジェクト型またはPL/SQLパッケージの名前を標準出力に書き出します。
JPublisherを起動するコマンドの例を次に示します(ここでは折り返されていますが、1行のコマンドラインです)。
% jpub -user=scott -input=demoin -numbertypes=oracle -usertypes=oracle -dir=demo -d=demo -package=corp
Enter scott password: password
コマンドは1行に入力しますが、必要に応じて改行されます。このコマンドでは、JPublisherはユーザー名scottとパスワードTIGERでデータベースに接続し、INPUTファイルdemoinの指示に基づいて、データ型をJavaクラスに変換します。-numbertypes=oracleオプションで、オブジェクト属性の型をOracleが提供するJavaクラスにマップするようにJPublisherに指示し、-usertypes=oracleオプションでOracle固有のORADataクラスを生成するように指示します。JPublisherでは、生成されるクラスはdemoディレクトリ内のcorpパッケージに配置されます。
|
注意: この章では、他の種類の入力ファイルと区別するため、-inputオプションで指定した入力ファイルをINPUTファイルとします。 |
JPublisherコマンドラインでは、.javaファイル(SQLJソース・ファイルを直接使用する場合は.sqljファイル)も指定できます。指定したファイルは、JPublisherで生成されるファイルとともに変換されてコンパイルされます。たとえば、次のようにします。
% jpub ...options... Myclass.java
|
注意:
|
この項では、ユーザー定義オブジェクト型のJPublisher変換の例を示します。この時点では、JPublisherで生成されるコードの詳細を気にする必要はありません。JPublisher入力ファイルと出力ファイル、オプション、データ型マッピングおよび変換の詳細は、このマニュアルの後半で説明します。
|
注意: 詳細な例は、OracleインストールのORACLE_HOME/sqlj/demo/jpubにアクセスしてください。 |
次のようにオブジェクト型EMPLOYEEを作成します。
CREATE TYPE employee AS OBJECT
(
name VARCHAR2(30),
empno INTEGER,
deptno NUMBER,
hiredate DATE,
salary REAL
);
INTEGER、NUMBERおよびREAL型はすべてデータベース内にNUMBER型として格納されますが、変換後は-numbertypesオプションの設定に基づいて、Javaプログラムで別の形で表されます。
JPublisherでは、コマンドラインに入力された次のコマンドに従って型を変換します。
% jpub -user=scott -dir=demo -numbertypes=objectjdbc -builtintypes=jdbc -package=corp -case=mixed -sql=Employee
Enter scott password: password
EMPLOYEEオブジェクト型ではメソッドが定義されないため、JPublisherでは非SQLJクラスが生成されることに注意してください。
JPublisherコマンドラインで-dir=demoおよび-package=corpが指定されているため、変換後のEmployeeクラスは次のディレクトリにあるEmployee.javaに書き込まれます。
./demo/corp/Employee.java
|
注意: この場所は、UNIXシステムに対して固有です。 |
Employee.javaクラス・ファイルには次の例に示すコードが含まれます。
|
注意: JPublisherで生成されるコードの詳細は、今後のリリースで変更されることがあります。特に、非パブリック・メソッド、非パブリック・フィールドおよびすべてのメソッド本体の生成方法が変更されることがあります。 |
package corp;
import java.sql.SQLException;
import java.sql.Connection;
import oracle.jdbc.OracleTypes;
import oracle.sql.ORAData;
import oracle.sql.ORADataFactory;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import oracle.jpub.runtime.MutableStruct;
public class Employee implements ORAData, ORADataFactory
{
public static final String _SQL_NAME = "SCOTT.EMPLOYEE";
public static final int _SQL_TYPECODE = OracleTypes.STRUCT;
protected MutableStruct _struct;
private static int[] _sqlType = { 12,4,2,91,7 };
private static ORADataFactory[] _factory = new ORADataFactory[5];
protected static final Employee _EmployeeFactory = new Employee(false);
public static ORADataFactory getORADataFactory()
{ return _EmployeeFactory; }
/* constructor */
protected Employee(boolean init)
{ if(init) _struct = new MutableStruct(new Object[5], _sqlType, _factory); }
public Employee()
{ this(true); }
public Employee(String name, Integer empno, java.math.BigDecimal deptno,
java.sql.Timestamp hiredate, Float salary)
throws SQLException
{ this(true);
setName(name);
setEmpno(empno);
setDeptno(deptno);
setHiredate(hiredate);
setSalary(salary);
}
/* ORAData interface */
public Datum toDatum(Connection c) throws SQLException
{
return _struct.toDatum(c, _SQL_NAME);
}
/* ORADataFactory interface */
public ORAData create(Datum d, int sqlType) throws SQLException
{ return create(null, d, sqlType); }
protected ORAData create(Employee o, Datum d, int sqlType) throws SQLException
{
if (d == null) return null;
if (o == null) o = new Employee(false);
o._struct = new MutableStruct((STRUCT) d, _sqlType, _factory);
return o;
}
/* accessor methods */
public String getName() throws SQLException
{ return (String) _struct.getAttribute(0); }
public void setName(String name) throws SQLException
{ _struct.setAttribute(0, name); }
public Integer getEmpno() throws SQLException
{ return (Integer) _struct.getAttribute(1); }
public void setEmpno(Integer empno) throws SQLException
{ _struct.setAttribute(1, empno); }
public java.math.BigDecimal getDeptno() throws SQLException
{ return (java.math.BigDecimal) _struct.getAttribute(2); }
public void setDeptno(java.math.BigDecimal deptno) throws SQLException
{ _struct.setAttribute(2, deptno); }
public java.sql.Timestamp getHiredate() throws SQLException
{ return (java.sql.Timestamp) _struct.getAttribute(3); }
public void setHiredate(java.sql.Timestamp hiredate) throws SQLException
{ _struct.setAttribute(3, hiredate); }
public Float getSalary() throws SQLException
{ return (Float) _struct.getAttribute(4); }
public void setSalary(Float salary) throws SQLException
{ _struct.setAttribute(4, salary); }
}
コード生成に関する注意
JPublisherでは、オブジェクト属性に基づいてオブジェクト・コンストラクタも生成されます。
他のオプション設定を使用すると、追加のprivateまたはpublicメソッドも生成できます。たとえば、-serializable=trueに設定すると、java.io.Serializableインタフェースを実装するオブジェクト・ラッパー・クラスが生成され、privateのwriteObject()およびreadObject()メソッドが生成されます。また、-tostring=trueに設定すると、publicのtoString()メソッドが生成されます。
JPublisherで生成されるSQLオブジェクト型用のコードでは、_structフィールドが保護されています。これは、oracle.jpub.runtime.MutableStruct内部クラスのインスタンスです。このインスタンスには、データがオリジナルのSQL形式で含まれています。通常、このフィールドを直接参照することはありません。かわりに、JPublisherでsetFrom()およびsetValueFrom()メソッドが生成されるように、必要に応じて-methods=alwaysまたは-methods=named設定を使用してから、これらのメソッドをクラスの拡張時に使用します。
次の場合には、JPublisherで非SQLJクラスのかわりにSQLJクラスが生成されます。
公開対象のSQLオブジェクトにメソッドがあり、-methods=false設定が指定されていない場合。
PL/SQLパッケージ、ストアド・プロシージャ、問合せまたはDML文が公開対象で、-methods=false設定が指定されていない場合。
さらに、次の場合もあります。
型定義用にSQLJクラスが作成される場合は、対応するREF定義用のSQLJクラスも作成されます。
ベース・クラス用にSQLJクラスが作成される場合は、任意のサブクラス用のSQLJクラスも作成されます。
下位互換性モードでは、JPublisherにより.javaファイルのかわりに.sqljファイルが生成されることになります。
また、JPublisherではEmployeeRef.javaクラスも生成されます。このソース・コードは次のとおりです。
package corp;
import java.sql.SQLException;
import java.sql.Connection;
import oracle.jdbc.OracleTypes;
import oracle.sql.ORAData;
import oracle.sql.ORADataFactory;
import oracle.sql.Datum;
import oracle.sql.REF;
import oracle.sql.STRUCT;
public class EmployeeRef implements ORAData, ORADataFactory
{
public static final String _SQL_BASETYPE = "SCOTT.EMPLOYEE";
public static final int _SQL_TYPECODE = OracleTypes.REF;
REF _ref;
private static final EmployeeRef _EmployeeRefFactory = new EmployeeRef();
public static ORADataFactory getORADataFactory()
{ return _EmployeeRefFactory; }
/* constructor */
public EmployeeRef()
{
}
/* ORAData interface */
public Datum toDatum(Connection c) throws SQLException
{
return _ref;
}
/* ORADataFactory interface */
public ORAData create(Datum d, int sqlType) throws SQLException
{
if (d == null) return null;
EmployeeRef r = new EmployeeRef();
r._ref = (REF) d;
return r;
}
public static EmployeeRef cast(ORAData o) throws SQLException
{
if (o == null) return null;
try { return (EmployeeRef) getORADataFactory().create(o.toDatum(null),
OracleTypes.REF); }
catch (Exception exn)
{ throw new SQLException("Unable to convert "+o.getClass().getName()+" to
EmployeeRef: "+exn.toString()); }
}
public Employee getValue() throws SQLException
{
return (Employee) Employee.getORADataFactory().create(
_ref.getSTRUCT(), OracleTypes.REF);
}
public void setValue(Employee c) throws SQLException
{
_ref.setValue((STRUCT) c.toDatum(_ref.getJavaSqlConnection()));
}
}
|
注意: JPublisherでは、他の強い型指定を持つ参照から強い型指定を持つ参照のインスタンスにキャストするためのpublic staticcast()メソッドも生成されます。 |