ヘッダーをスキップ
Oracle® Database JPublisherユーザーズ・ガイド
12cリリース1 (12.1)
B72467-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 その他の機能と考慮事項

この章では、JPublisher使用時のその他の機能と考慮事項について説明します。

JPublisherによるWebサービス・サポートの概要

以降の各項では、JPublisherの主なWebサービス機能について説明します。ほとんどの機能は、データベースへのWebサービスのコールインに関連しており、Webサービス・クライアントからSQL、PL/SQLおよびサーバー・サイドJavaクラスへのアクセスを可能にするJPublisher機能が含まれます。また、データベースからのWebサービスのコールアウトをサポートするための機能およびオプションもあります。


関連項目:

  • Oracle Database Webサービスの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

  • OracleのWebサービス機能の概要は、『Oracle Application Server Web Services開発者ガイド』を参照してください。

  • Webサービスとして公開できるデータベース・オブジェクトまたは機能の完全なリストは、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPCを使用したWebサービスの高度な機能のプログラミング』を参照してください。


データベースに対するWebサービスのコールインのサポート概要

次のJPublisher機能により、Oracle Databaseで実行中のコードに対するWebサービスのコールインがサポートされます。生成されたJavaクラスは、Java EEコンテナを使用してOracle Application Serverにデプロイできます。たとえば、PL/SQLパッケージを表すJavaクラスは、PL/SQL Webサービスとしてデプロイできます。

  • Javaインタフェースの生成

    -sqlオプションの拡張機能を使用すると、JPublisherでJavaインタフェースを生成できます。この機能により、Webサービス定義言語(WSDL)の内容の生成に使用するApplication Program Interface(API)を表すJavaインタフェースを手動で生成する必要がなくなります。Oracle Database 10gより前のJPublisherでは、クラスは生成できましたがインタフェースは生成できませんでした。

  • JPublisherのスタイルおよびスタイル・ファイル

    スタイル・ファイルおよび関連の-styleオプションを使用すると、Java間の型マッピングにより生成されるクラスをWebサービスで確実に使用できます。特に、OracleにはWebサービスのサポート用に次のスタイル・ファイルが用意されています。

    /oracle/jpub/mesg/webservices-common.properties
    /oracle/jpub/mesg/webservices10.properties
    /oracle/jpub/mesg/webservices9.properties
    
  • REF CURSORの戻りと結果セットのマッピング

    java.sql.ResultSet型は、Webサービスではサポートされません。これは、REF CURSOR型を戻すストアド・プロシージャとファンクションに影響します。JPublisherでは、Webサービスで問合せ結果を使用可能にする代替マッピングがサポートされます。

  • JPublisherの公開内容に対するフィルタ・オプション

    特にJPublisherで生成されたコードをWebサービスとして確実に公開できるように、JPublisher出力を指定またはフィルタリングするための機能が複数存在します。-sqlオプションの拡張機能を使用すると、ストアド・プロシージャの特定のサブセットを公開できます。-filtertypesおよび-filtermodesオプションを使用すると、パラメータまたは戻り値のモードまたは型に基づいてストアド・プロシージャを公開できます。-generatebeanオプションを使用すると、生成されるメソッドがJavaBeans仕様を満たすように指定できます。

  • データベース内のJavaクラスのコールのサポート

    JPublisherでは、JPublisherの-javaオプションを介して生成されたクライアント・サイドJavaスタブからサーバー・サイドJavaコードを直接コールする場合に、ネイティブJavaインタフェースが使用されます。Oracle Database 10gより前のバージョンでは、PL/SQLラッパーを手動で作成して使用しなければ、サーバー・サイドJavaコードをコールできませんでした。このPL/SQLラッパーはコール仕様とも呼ばれていました。Oracle Database 10gリリース2(10.2)以降では、JavaクラスのWebサービス・コールインが、ダイナミック・コール・モードとPL/SQLラッパー・モードの2つのモードでサポートされています。

  • SQL問合せまたはDML文の公開に対するサポート

    JPublisherには、特定のSELECTUPDATEINSERTまたはDELETE文を、Webサービスとして公開可能なJavaクラスでメソッドとして公開できるように、-sqlstatementオプションが用意されています。

  • 一意のメソッド名のサポート

    Webサービスの要件を満たすために、JPublisherに対して、オーバーロードされたメソッドを禁止し、かわりに一意のメソッド名を常に使用するように指示できます。

データベースからのWebサービスのコールアウトに対するサポート

JPublisherでは、Oracle DatabaseからのWebサービスのコールアウトがサポートされます。Webサービス・クライアント・コードはSQL、PL/SQLまたはJavaで記述され、データベース上で動作して他の場所にあるWebサービスを起動します。このサポートは、-proxywsdlおよび-httpproxyオプションを介して提供されます。また、-proxyoptsおよび-proxyclassesオプションが関係する場合もありますが、通常はWebサービス用に特別な設定は必要ありません。

ここでは、主要オプションを要約して説明します。

  • -proxywsdl=URL

    このオプションを使用するのは、指定のURLのWSDLドキュメントを指定して、Webサービスのクライアント・プロキシ・クラスを生成する場合です。また、このオプションを設定すると、インスタンス・メソッドを静的メソッドとして公開するための追加ラッパー・クラス、およびPL/SQLラッパーも生成されます。

  • -httpproxy=proxy_URL

    ここで、WSDLドキュメントはファイアウォール経由でアクセスされます。このオプションを使用して、WSDLドキュメントのURLの解決に使用するプロキシURLを指定します。

静的プロキシとJPublisherを使用したWebサービスのコールアウトの実行方法

Oracle JPublisherのコマンドライン・オプション-proxywsdlを使用して、WebサービスのWSDLファイルからデータベース・サイドのJavaおよびPL/SQLラッパーを生成できます。JPublisherでWebサービス・クライアントのラッパーを生成してデータベースにロードするには、CLASSPATHにdbwsa.jarファイル、データベース内部にdbwsclient.jarファイルがそれぞれ存在する必要があります。

次の手順では、Oracle JPublisherでサポートされるWebサービスのコールアウト用の環境とデータベースを設定します。この手順を実行する必要があるのは1回のみです。

  1. ご使用のシステムにOracle JPublisher 12cリリース1がない場合は、ダウンロードしてインストールしてください。Oracle JPublisherは、Oracle SQLJをインストールする際にその一部としてインストールされます。Database Client CDからOracle SQLJをインストールするか、次の場所でDatabase Clientをダウンロードしてください。

    http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

  2. dbwsa.jarを、ORACLE_HOME\sqlj\libディレクトリ(Microsoft Windowsの場合)またはORACLE_HOME/sqlj/libディレクトリ(Solarisの場合)に追加します。

  3. 適切なJDKをJava VMおよびJavaコンパイラとして設定します。

    JDKのバージョンは、ターゲット・データベースのJava VMと同じにする必要があります。

    • Oracle Database 12cの場合はJDK 6およびJDK 7を使用します。

    • Oracle Database 11gの場合はJDK 1.5およびJDK 6を使用します。

  4. CLASSPATH環境変数にdbwsa.jarファイルを追加します。

  5. SYSスキーマ、またはWebサービス・クライアントを起動するスキーマにdbwsclient.jarファイルをロードします。

    たとえば、次のloadjavaコマンドは、SYSスキーマにdbwsclient.jarファイルをロードします。

    %loadjava -u sys -r -v -f -s -grant public -noverify -genmissing dbwsclient.jar
    Password: password
    

    次のloadjavaコマンドは、指定のスキーマにdbwsclient.jarファイルをロードする方法を示しています。

    % loadjava -u hr -r -v -f -noverify -genmissing dbwsclient.jar
    Password: password
    

次の例は、Webサービス・クライアントのJavaおよびPL/SQLラッパーを生成してからSQL文を使用してWebサービス・クライアントを起動する方法を示しています。この例は、次のような一般的な手順で実行されます。

  1. 起動するWebサービスを特定します。

  2. 適切なオプションを指定してOracle JPublisherをコールし、クライアント・プロキシ、PL/SQLおよびJavaラッパーを生成した後、データベースにロードします。

    これを実行するOracle JPublisherのコマンドには、必要な-proxywsdlオプションと-userオプションが含まれます。このコマンドには、-endpoint-httpproxy-sysuser-dirおよび-proxyoptsの各オプションもオプションで含まれています。たとえば、次のようにします。

    % jpub -user=username -sysuser=sysuser_name/sysuser_password -proxywsdl=WSDL_URL -endpoint=Web_services_endpoint
    

    Webサービスはhttp://localhost:8888/javacallout/javacalloutで以前にデプロイされていることが前提です。

    次のコマンドは、Webサービス・クライアントとそのJavaおよびPL/SQLラッパーをサブディレクトリtmpに作成し、そのラッパーをデータベースにロードします。

    % jpub -user hr -sysuser sys/sys_password -proxywsdl=sample/javacallout.wsdl
       -endpoint=http://localhost:8888/javacallout/javacallout -dir=tmp
    Enter hr password: password
    

    このコマンドにより、次の出力が生成されます。

    tmp/HelloServiceEJBJPub.java
    tmp/plsql_wrapper.sql
    tmp/plsql_dropper.sql
    tmp/plsql_grant.sql
    tmp/plsql_revoke.sql
    Executing tmp/plsql_dropper.sql
    Executing tmp/plsql_wrapper.sql
    Executing tmp/plsql_grant.sql
    Loading tmp/plsql_proxy.jar
    
  3. データベース内部からWebサービスを起動します。

    tmp/plsql_wrapper.sqlで提供されるPL/SQLファンクションを起動できます。各PL/SQLファンクションは、Webサービスの操作に対応します。たとえば、Webサービスが次のエンドポイントで使用できるとします。

    http://localhost:8888/javacallout/javacallout
    

    この場合、次のSQLコマンドを発行できます。

    SQL> select jpub_plsql_wrapper.sayhello('hello') from dual;
    

    このコマンドにより、次の出力が戻されます。

    JPUB_PLSQL_WRAPPER.SAYHELLO('HELLO')
    -----------------------------------
    HELLO!! You just said :hello
    

サーバー・サイドJavaのコール(コールイン)

サーバー・サイドJavaのコールイン機能により、JPublisherでデータベース内のJavaクラスをクライアント・サイド・コール用に公開できます。JPublisherでは、サーバー・サイドJavaをコールするJavaクライアントが生成されます。

Oracle Database 10g リリース1(10.1)では、サーバー・サイド・コールイン用のJPublisherオプションは-javaです。JPublisherは、JPublisherランタイムに提供されているダイナミック・コール・インタフェースoracle.jpub.runtime.Clientを使用するJavaクライアントを生成してoracle.jpub.runtime.Serverサーバー・サイド・クラスをコールし、これが必要なJavaストアド・プロシージャをコールします。ClientおよびServerインタフェースはJPublisherランタイムの一部です。シリアライズ可能なパラメータと戻り型を持つ静的メソッドのみがサポートされます。Oracle Database 10g リリース1(10.1)以降、oracle.jpub.runtime.Serverはデータベース内にあります。

Oracle Database 10gリリース2 (10.2)では、サーバー・サイド・コールインの場合、JPublisherがストアド・プロシージャ用のPL/SQLラッパーと、このPL/SQLラッパーをコールするJavaクライアントを生成します。静的メソッドとインスタンス・メソッドの両方がサポートされます。サポートされるパラメータおよび戻り型は、プリミティブ型、Java Beans型、シリアライズ可能オブジェクト型およびOracle Java Database Connectivity (JDBC)型で、通常はoracle.sqlというパッケージ名が付いたものです。

Oracle Database 10g リリース2(10.2)では-javaオプションが非推奨で、サーバー・サイド・コールイン用のJPublisherオプションは-dbjavaです。ただし、-javaオプションは下位互換性のためにまだサポートされています。-compatibleオプションを10.1に設定すると、-dbjava-javaと同様に機能します。

JPublisher出力のフィルタ機能

JPublisherには、JPublisher出力をフィルタ処理するためのオプションがいくつか用意されています。たとえば、パッケージからストアド・プロシージャのサブセットのみの公開、生成されたコードのパラメータ・モードまたはパラメータ型に従ったフィルタリング、生成されるクラスがJavaBeans仕様に従うことの保証などがあります。

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

ファンクションまたはプロシージャの指定サブセットの公開

-sqlオプションの拡張機能を使用すると、パッケージまたはSQLのトップレベルから、ストアド・ファンクションまたはストアド・プロシージャのサブセットのみを公開できます。

次の構文では、パッケージのストアド・プロシージャがすべて公開されることを思い出してください。

-sql=plsql_package

パッケージのストアド・プロシージャのサブセットのみを公開するには、次の構文を使用します。

-sql=plsql_package(proc1+proc2+proc3+...)

また、ストアド・プロシージャ名および引数の型に従ってサブセットを指定することもできます。proc1のみを指定するかわりに、次のように指定できます。

proc1(sqltype1, sqltype2, ...)

パラメータのモードまたは型に従ったファンクションまたはプロシージャの公開

特にWebサービス用のコード生成の場合、メソッドのシグネチャまたは属性では、コードの使用目的について一部のパラメータ・モードまたは型がサポートされない場合があります。生成されるコードを必要に応じてパラメータのモードまたは型、あるいはその両方に従ってフィルタ処理できるように、-filtermodesおよび-filtertypesオプションが導入されています。

各オプションの設定で、デフォルトですべての可能性を含める、つまりフィルタリングが行われないようにするには先頭に1を指定します。その後に、除外する特定のモードまたは型を後にマイナス記号(-)を付けて指定します。たとえば、次のようにします。

-filtertypes=1,.ORADATA-,.ORACLESQL-

-filtermodes=1,out-,inout-

また、すべてをフィルタ処理するには、かわりに0を指定できます。次に、許可する特定のモードまたは型の後ろにプラス記号(+)を付けて指定します。たとえば、次のようにします。

-filtertypes=0,.CURSOR+,.INDEXBY+

-filtermodes=0,in+,return+

生成されるメソッドのJavaBeans仕様への準拠の保証

-generatebeanオプションは、生成されるクラスがJavaBeans仕様に準拠することを保証するために使用できるフラグです。デフォルト設定は-generatebean=falseです。

-generatebean=trueに設定すると、JavaBeanプロパティのgetterまたはsetterメソッドとみなされないように、生成される一部のメソッドの名前が変更されます。そのために、メソッド名に接頭辞としてアンダースコア(_)が追加されます。

下位互換性および移行

この項では、下位互換性、Java Development Kit (JDK)のバージョン間の互換性、Oracle8i、Oracle9i、Oracle Database 10gおよびOracle Database 12cの各リリース間でのJPublisherユーティリティの移行の問題について説明します。

Oracle9iでは、デフォルトのオプション設定および生成されるコードの一部の機能が変更されています。JPublisherのOracle8i実装を使用してアプリケーションを作成した場合、Oracle Database 10g(またはOracle9i)ではJPublisherを再実行できなくなり、生成されたクラスを引き続きアプリケーションで動作させることができなくなる可能性があります。また、Oracle9iとOracle Database 10gの間でも、わずかですがJPublisherの機能が変更されています。主な違いは、デフォルトで.sqljファイルが参照可能な状態に生成されなくなったことですが、この動作はJPublisher設定を介して変更できます。

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

JPublisherの下位互換性

JPublisherランタイムは、ojdbc14.jarojdbc5.8.jarまたはojdbc6*.jarライブラリにJDBCとともにパッケージされています。以前のバージョンのJPublisherで生成されたコードの互換性は、次のとおりです。

  • 現行リリースのJPublisherランタイムで引き続き動作します。

  • 現行リリースのJPublisherランタイムで引き続きコンパイル可能です。

以前のリリースのJPublisherランタイムおよびOracle JDBCドライバをコード生成に使用した場合、コードは生成時と同じバージョンのJPublisherランタイムでコンパイルできます。

Oracle Database 10gリリース1とリリース2の間でのJPublisherの動作変更

Oracle Database 10g リリース2(10.2)以降のJPublisherでは、PL/SQL用に生成されたJavaクラス用に次の新しいAPIが追加されています。

  • <init>(javax.sql.DataSource)

    java.sql.DataSourceオブジェクトを引数として使用するコンストラクタ

  • setDataSource(javax.sql.DataSource)

    java.sql.DataSourceオブジェクトを引数として使用するデータ・ソース設定用のメソッド

これらのメソッドにより、Javaラッパーは、引数として渡されるデータ・ソースからJDBC接続を取得できます。

JPublisherでは、データ・リンクと呼ばれるURLを格納するSQLのURI型の使用がサポートされます。Oracle Database 10g リリース1(10.1)のJPublisherでは、SQL URI型SYS.URITYPEとサブタイプSYS.DBURITYPESYS.XDBURITYPEおよびSYS.HTTPURITYPEjava.net.URLにマップします。SQLのURI型がPL/SQLストアド・プロシージャまたはSQL文のパラメータおよび戻り型として使用される場合、このマッピングは機能します。ただし、SQLのURI型がSQLの型の属性またはSQLの配列型の要素として使用される場合は、このマッピングにより実行時にClassCastExceptionが発生します。

この問題に対処するため、Oracle Database 10g リリース2(10.2)では、SQLのURI型がJPublisherで生成されるORADataサブクラスにマップされます。これはユーザー定義のSQLオブジェクト型に使用されるマッピングと似ています。また、次のように指定することでJPublisherがSQLのURI型をjava.net.URLにマップするように強制することもできます。

-adddefaulttypemap=
SYS.URITYPE:java.net.URL:VARCHAR2:SYS.URIFACTORY.GETURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.DBURITYPE:java.net.URL:VARCHAR2:SYS.DBURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.XDBURITYPE:java.net.URL:VARCHAR2:SYS.XDBURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.HTTPURITYPE:java.net.URL:VARCHAR2:SYS.HTTPURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR

これにはデータ変換ファンクションの指定が含まれます。

Oracle9i DatabaseとOracle Database 10gの間でのJPublisherの動作変更

Oracle9i DatabaseとOracle Database 10gの間で、下位互換性に関するJPublisherの動作の主な違いは、デフォルトでSQLJソース・コードが自動的に変換されるようになり、.sqljソース・ファイルをユーザーが参照できなくなったことです。

また、Oracle Database 10gでは、JPublisherの動作が次のように変更されていることに注意してください。

  • Oracle9i DatabaseのJPublisherでは、ブール引数でオブジェクトの初期化が必要かどうかを指定し、protectedコンストラクタを使用してSQLJクラスが生成されます。たとえば、次のようにします。

    protected BaseClass(boolean init) { ... }
    

    このコンストラクタは、BOOLEAN属性を持つSQLオブジェクト型のコンストラクタ生成と競合するため、Oracle Database 10gでは削除されています。

  • Oracle Database 10gでは、SMALLINTはJavaのshortではなくintにマップされます。

Oracle8i DatabaseとOracle9i Databaseの間でのJPublisherの動作変更

Oracle9i Database以降は、JPublisherの動作が次のように変更されていることに注意してください。

  • デフォルトでは、JPublisherは、オブジェクト型ごとにSQLJ接続コンテキストのインナー・クラス_Ctxを宣言しません。かわりに、すべてにsqlj.runtime.ref.DefaultContext接続コンテキスト・クラスが使用されます。

    また、ユーザーが記述するコードでは、Oracle8iバージョンのJPublisherで生成されたコードに宣言されていた_ctx接続コンテキスト・フィールドを使用するかわりに、getConnectionContext()メソッドをコールして接続コンテキスト・インスタンスを取得する必要があります。

  • -methods=trueに設定しても、基礎となるSQLオブジェクト型またはPL/SQLパッケージでメソッドが定義されていない場合は、非SQLJクラスが生成されます。ただし、-methods=alwaysに設定した場合は、常にSQLJクラスが生成されます。

  • デフォルトでは、JPublisherは、非推奨のoracle.sql.CustomDatumインタフェースではなく、oracle.sql.ORADataインタフェースを実装するコードを生成します。

  • デフォルトでは、JPublisherは、生成されたコードをカレント・ディレクトリのパッケージ・ディレクトリ階層に格納するのではなく、カレント・ディレクトリに格納します。

JPublisherで生成されたクラスのユーザー作成サブクラスの変更

Oracle8iバージョンのJPublisherで生成されたクラスのユーザー作成サブクラスを提供していた場合は、JPublisherによるコード生成方法についてOracle9i Databaseで複数の関連する変更点が導入されたことに注意する必要があります。Oracle8iの機能を持つアプリケーションをOracle9i Database、Oracle Database 10gまたはOracle Database 12cで使用する場合は、そのアプリケーションに変更を加える必要があります。


注意:

-compatible=8iまたは-compatible=both8iオプション設定を使用すると、ここで説明する変更を意識することなく、アプリケーションを従来どおりにビルドして使用できます。詳細は、「下位互換性オプション」を参照してください。

ただし、Oracle Database 12cまたはOracle Database 10gのJPublisherの機能への変換を行い、ユーザー・コードをJPublisherで生成されたクラスの実装の詳細から切り離すことをお薦めします。


Oracle9i Database、Oracle Database 10gまたはOracle Database 12cでコードを使用するには、次の変更が必要です。

  • 宣言されたctx接続コンテキスト・フィールドではなく、用意されたgetConnectionContext()メソッドを使用します。_ctxフィールドはサポートされなくなりました。

  • create()メソッドを明示的に実装するかわりにスーパークラスのcreate()メソッドがコールされ、戻り型としてCustomDatumのかわりにORADataが使用されます。

    次の例では、UserClassBaseClassを拡張するとします。UserClassに次のメソッドを記述するかわりに、

    public CustomDatum create(Datum d, int sqlType) throws SQLException
    {
      if (d == null) return null;
      UserClass o = new UserClass();
      o._struct = new MutableStruct((STRUCT) d, _sqlType, _factory);
      o._ctx = new _Ctx(((STRUCT) d).getConnection());
      return o;
    }
    

    次のように指定します。

    public ORAData create(Datum d, int sqlType) throws SQLException
    {
      return create(new UserClass(),d,sqlType);
    }
    

    または、クラスが継承階層に含まれる場合は、次のように記述します。

    protected ORAData createExact(Datum d, int sqlType) throws SQLException
    {
      return create(new UserClass(),d,sqlType);
    }
    
  • JPublisherには、getConnectionContext()メソッドに加えて、オブジェクトに対応付けられたJDBC接続インスタンスの取得に使用できるgetConnection()メソッドが用意されています。

JPublisherの下位互換性モードと設定

JPublisherでは、-compatibleオプションを介して下位互換性モードの設定がサポートされます。最も基本的なレベルには、.sqljファイルを明示的に生成する設定が含まれます。この動作は、デフォルトでOracle Database 12cおよびOracle Database 10gのユーザーに対して透過的です。Oracle9iおよびOracle8i互換モードも用意されており、それぞれ生成されるコード自体と参照可能な.sqljファイルの作成に違いがあります。次の内容について説明します。

.sqljファイルの明示的生成

Oracle Database 12cでは、自動SQLJ変換を回避して直接操作できる.sqljファイルがJPublisherで生成されるようにする場合、JPublisherの-compatible=sqlj設定を使用できます。


注意:

Oracle Database 12cでは、.sqljファイルを明示的に変換するためにSQLJ Translatorを直接起動する必要はありません。かわりにJPublisherの-sqljオプションを使用できます。

Oracle9i互換モード

JPublisherのオプション設定-compatible=9iによりOracle9i互換モードが使用可能になります。このモードでは、Oracle9iのSQLJおよびJDBCリリースと互換性のあるコードが生成されます。さらに通常、Oracle9iのJPublisherの場合と同様に、ユーザーが参照可能な.sqljファイルが生成されます。

Oracle9i互換モードのJPublisherには、次の機能があります。

  • SQLJクラスでは、Oracle9iの場合と同様に、オブジェクトの初期化が必要かどうかを指定するboolean引数を持つprotectedコンストラクタが生成されます。

    protected BaseClass(boolean init) { ... }
    

    このコンストラクタはOracle Database 10g以降は削除されています。

  • JavaでのSMALLINTからのマッピングは、Oracle Database 12cでのマッピングであるintからshortに戻ります。

Oracle8i互換モード

JPublisherの設定-compatible=both8iまたは-compatible=8iのどちらでも、Oracle8i互換モードが使用可能になります。このモードでは、Oracle8iのSQLJおよびJDBCリリースと互換性のあるコードが生成されます。さらに通常、Oracle8iのJPublisherの場合と同様に、ユーザーが参照可能な.sqljファイルが生成されます。

ただし、このモードを使用するには、少なくとも次のいずれかに該当する必要があります。

  • JPublisherで生成された.sqljファイルの変換時に、SQLJのデフォルトの-codegen=oracle設定を使用する場合。

  • JPublisherで生成されたコードが、JDK 1.5以上で実行されSQLJ runtime12.jarライブラリを使用するか、Oracle Database 12cリリースのサーバー側Oracle JVMで実行される場合。

  • JPublisherを、-methods=falseまたは-methods=noneを設定して実行する場合。

Oracle8i互換モードの次の機能に注意してください。

  • JPublisherでは、ORADataインタフェースおよびORADataFactoryインタフェースのかわりに、非推奨のCustomDatumインタフェースおよびCustomDatumFactoryインタフェースを実装するコードが生成されます。これは-compatible=customdatumの設定時と同様です。また、-compatible=both8i設定を選択した場合、生成されたコードはORADataインタフェースを実装しますが、ORADataFactoryは実装しません。

  • -methods=true設定を使用すると、オブジェクト型でメソッドが定義されていない場合でも、常にSQLオブジェクト型用のSQLJクラスが生成されます。これは、-methods=alwaysの設定時と同様です。

  • JPublisherでは、次のように、オブジェクトのラッパー・クラスごとに接続コンテキスト宣言と接続コンテキスト・インスタンスが生成されます。

    #sql static context _Ctx;
    protected _Ctx _ctx;
    

    これは、-context=generatedの設定時と同様です。

  • JPublisherには、標準sqlj.runtime.ConnectionContextインタフェースを実装するクラスのインスタンスである汎用ConnectionContextインスタンスを入力とするラッパー・クラスのコンストラクタが用意されています。Oracle Database 12cでは、このコンストラクタが受け入れるのは、DefaultContextインスタンス、あるいはJPublisherの実行時に-contextオプションで指定されたクラスのインスタンスのみです。

  • JPublisherには、JPublisherオブジェクトで暗黙的に作成された接続コンテキスト・インスタンスを解放するためのAPIは用意されていません。

    これに対して、Oracle Database 12cのJPublisherユーティリティには、オブジェクト用の接続コンテキスト・インスタンスを明示的に設定するためのsetConnectionContext()メソッドと、オブジェクトについて暗黙的に作成された接続コンテキスト・インスタンスを解放するためのrelease()メソッドが用意されています。

Oracle8i互換モードの選択が必要な場合は、-compatible=both8i設定の使用をお薦めします。これにより、アプリケーションをOracle Application Serverなどの中間層環境で使用でき、JDBC接続はデータ・ソースを介して取得され、oracle.jdbc.OracleXxxxインタフェースを使用してラップされます。CustomDatum実装では、このようにラップされた接続はサポートされません。


注意:

-compatible=both8i設定には、Oracle9iリリース1(9.0.1)以上のJDBCの実装が必要です。

JPublisherで生成されるコードで接続コンテキスト・インスタンス_ctxを宣言する唯一の方法は、Oracle8i互換モードを使用することです。この特定のOracle8i動作を指定できる他のオプション設定はありません。_ctxインスタンスが役立つのは、それに依存する従来型コードがあっても、それ以外はgetConnectionContext()メソッドを通じて接続コンテキスト・インスタンスを取得する必要がある場合です。

JPublisherにOracle8iでの動作を強制する個々の設定

表4-1に詳細を示した個々のオプション設定は、Oracle8i互換モードでJPublisherを使用した場合とほぼ同じ結果を生成します。

表4-1 JPublisherの下位互換性オプション

オプション設定 動作

-context=generated

この設定では、SQLJ接続コンテキスト用のインナー・クラス_Ctxが宣言されます。このインナー・クラスは、デフォルトのDefaultContextクラスまたはユーザー指定の接続コンテキスト・クラスのかわりに使用されます。

-methods=always

この設定では、基礎となるSQLオブジェクトまたはパッケージでメソッドが定義されているかどうかに関係なく、JPublisherで生成されるすべてのクラス用に、非SQLJクラスではなくSQLJクラスが強制的に生成されます。

-compatible=customdatum

この設定では、Oracle固有のラッパー・クラスについて、oracle.sql.ORADataおよびORADataFactoryインタフェースのかわりに、非推奨のoracle.sql.CustomDatumおよびCustomDatumFactoryインタフェースが実装されます。

-dir=.

このオプションをピリオド(.)に設定すると、Oracle8iのデフォルトの動作と同様に、階層内のカレント・ディレクトリに出力ファイルが生成されます。


これらのオプションの詳細は、次の各項を参照してください。