この章では、JPublisherユーティリティの概要と、それに続いてJPublisher操作のサマリーと変換例を示します。内容は次のとおりです。
JPublisherは、SQLオブジェクトやPL/SQLパッケージなどのデータベース・エンティティをJavaクライアント・プログラムで表すためにJavaクラスを生成するユーティリティです。また、SQL、PL/SQLおよびサーバー・サイドJavaからWebサービスに公開し、データベース内から外部Webサービスを起動できるようにするためのサポートを提供します。JPublisherはJavaで記述されています。
JPublisherでは、次のデータベース・エンティティの型を表すクラスを作成できます。
ユーザー定義のSQLオブジェクト
オブジェクト参照
ユーザー定義のSQLコレクション
PL/SQLパッケージ
サーバー・サイドJavaクラス
SQL問合せおよびデータ操作言語(DML)文
JPublisherを使用すると、強い型指定の方法でこれらのエンティティのJavaクラスへのマッピングを指定およびカスタマイズできます。
注意: 強い型指定という用語は、特定のJava型がオブジェクト型など特定のユーザー定義SQL型に関連付けられていることを示します。たとえば、Person クラスは対応するPERSON SQL型に関連付けられています。また、SQLオブジェクト型の属性ごとにJava型が対応しています。 |
このユーティリティでは、オブジェクト型の属性ごとにアクセッサ・メソッドget
XXX
()
およびset
XXX
()
が生成されます。オブジェクト型にストアド・プロシージャがある場合は、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には、新機能はありません。
この項では、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 10gJDBCドライバ
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/technetwork/database/database-083829.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をインストールするには、使用するシステムにSQLJをインストールしておく必要があります。次の手順を実行して、SQLJをインストールしてください。
Oracle Database 11gクライアントのCDをダウンロードして解凍します。
setup.exe
ファイルを実行してOracle Universal Installerを実行します。
図1-8に示すように、ようこそウィンドウが表示されます。
「次へ」をクリックします。
図1-2に示すように、インストール・タイプの選択ウィンドウが表示されます。
図1-2 Oracle Universal Installerの「インストール・タイプの選択」画面
インストール・タイプに「カスタム」を選択して、「次へ」をクリックします。
図1-3に示すように、インストールの場所ウィンドウが表示されます。
使用するOracle Databaseホームが正しいかどうかを確認し、「次へ」をクリックします。
図1-4に示すように、製品固有の前提条件のチェック・ウィンドウが表示されます。
図1-4 Oracle Universal Installerの「製品固有の前提条件のチェック」画面
システムで前提条件が満たされているかどうかが検証されます。検証が終了したら、「次へ」をクリックします。
図1-5に示すように、使用可能な製品コンポーネント・ウィンドウが表示されます。
図1-5 Oracle Universal Installerの「使用可能な製品コンポーネント」画面
Oracle Clientセクションの「コンポーネント」列からOracle SQLJを選択し、「次へ」をクリックします。
サマリー・ウィンドウが表示されます。
選択内容を確認して、「インストール」をクリックします。
進捗状況を示すインストール・ウィンドウが表示されます。
「終了」に続いて「はい」をクリックします。
使用する必要がある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リリース2 (11.2)では、セキュリティ上の理由からUTL_DBWS
PL/SQLパッケージはデータベースのSYS
スキーマに自動的にインストールされません。コールアウト・ユーティリティとして組み込まれているutl_dbws_decl.sql
およびutl_dbws_body.sql
スクリプトを実行して、このパッケージをインストールする必要があります。これは、次のOTNページで入手可能です。
http://www.oracle.com/technetwork/database/database-083829.html
インストールを確認するには、このパッケージについて次のコマンドを実行します。
SQL> describe sys.utl_dbws
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
を指定します。
この項の内容は、次のとおりです。
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
に依存します。これは、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の特定の機能を使用しない場合は、要件が緩和されます。要件が緩和される場合の一部を次に示します。
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生成クラスには、強い型指定のみではなく次のメリットがあります。
クラスは汎用的ではなく、カスタマイズされています。オブジェクトの属性にアクセスするには、そのオブジェクトの特定の属性の後に名前が指定されているget
XXX
()
およびset
XXX
()
メソッドを使用します。データに変更があった場合は、データベース内のオブジェクトを明示的に更新する必要があることに注意してください。
クラスは可変です。オブジェクトの属性またはコレクションの要素は変更できます。ただし、オブジェクト参照型を表す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
クラス用にtype
Ref.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型を作成するラッパー・スクリプト
ラッパー・スクリプトを実行するためのパーミッションを付与するスクリプト
ラッパー・スクリプトを実行するためのパーミッションを取り消すスクリプト
ラッパー・スクリプトにより作成されたパッケージおよび型を削除するスクリプト
この項の内容は、次のとおりです。
図1-8は、指定した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() メソッドも生成されます。 |