Oracle® Database

JPublisherユーザーズ・ガイド

12cリリース1 (12.1)

B72467-02(原本部品番号:E49873-02)

2014年7月

Oracle Database JPublisherユーザーズ・ガイド 12cリリース1 (12.1)

B72467-02

Copyright © 1999, 2014, Oracle and/or its affiliates. All rights reserved.

原本著者: Tanmay Choudhury、Brian Wright

原本協力者: Tulika Das、Venkatasubramaniam Iyer、Janice Nygard、Thomas Pfaeffle、Ekkehard Rohwedder、P.Alan Thiesen

原本協力者:  Oracle Database 12cのドキュメントを、本リリースに携わった全員にとって創造の源となったMark Townsendに捧げます。

原本協力者:  Quan Wang, Kuassi Mensah, Deepa Aswani, Prabha Krishna, Ellen Siegal

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- このマニュアルの構成

- 関連ドキュメント

- 表記規則

1 JPublisherの概要

- JPublisherの概要

- JPublisherに関する初期の考慮事項

- Oracle Database 12cリリース1(12.1.0.2)のJPublisherの新機能

- JPublisherの一般的な要件

- JPublisherのインストール

- JPublisherのインストールの検証

- SQLJUTLおよびSQLJUTL2パッケージの確認またはインストール

- UTL_DBWSパッケージの確認またはインストール

- dbwsclient.jarファイルの確認またはロード

- Oracle9iまたはOracle8iでWebサービスのコールアウトに使用するJARファイルのロード

- リモートSYSログインのためのパスワード・ファイルの設定

- JPublisherによるSQLJ実装の使用

- SQLJ使用の概要

- SQLJの概念の概要

- SQLJソース・ファイルに影響する下位互換性モード

- 要件が緩和される場合

- JPublisherの制限事項

- JPublisherで公開できる内容

- JPublisherマッピングとマッピング・カテゴリ

- ユーザー定義型とPL/SQL型のJPublisherマッピング

- JPublisherを介したユーザー定義SQL型の表現方法

- ORAData実装の強い型指定を持つオブジェクト参照の使用

- JPublisherを介したPL/SQL型の使用

- JPublisherのマッピング・カテゴリ

- JDBCマッピング

- Object JDBCマッピング

- BigDecimalマッピング

- Oracleマッピング

- JPublisherの入力および出力

- JPublisherへの入力

- JPublisherからの出力

- ユーザー定義オブジェクト型のJava出力

- ユーザー定義コレクション型のJava出力

- OPAQUE型のJava出力

- PL/SQLパッケージのJava出力

- サーバー・サイドJavaクラスとWebサービスのコールアウトのJava出力

- SQL問合せまたはDML文のJava出力

- AQおよびストリームのJava出力

- PL/SQL出力

- JPublisherの操作

- 公開プロセスの概要: 出力の生成および使用

- JPublisherコマンドライン構文

- JPublisher変換の例

2 JPublisherの使用方法

- ユーザー定義のSQL型の公開

- PL/SQLパッケージの公開

- Oracle Streams AQの公開

- Javaクラスとしてのキューの公開

- Javaクラスとしてのトピックの公開

- Javaクラスとしてのストリームの公開

- ネイティブJavaインタフェースを介したサーバー・サイドJavaクラスの公開

- PL/SQLラッパーを介したサーバー・サイドJavaクラスの公開

- PL/SQLへのサーバー・サイドJavaクラスの公開

- テーブル・ファンクションへのサーバー・サイドJavaクラスの公開

- PL/SQLへのWebサービス・クライアントの公開

3 データ型およびJava間の型マッピング

- JPublisherのデータ型マッピング

- JPublisherのデータ型マッピングの概要

- OracleおよびJDBC型へのSQLとPL/SQLのマッピング

- JPublisherのユーザー型マップとデフォルトの型マップ

- データ型マッピングに関するJPublisherの論理進行

- オブジェクト属性の型

- REF CURSOR型と結果セットのマッピング

- JDBCマッピングにおける接続

- PL/SQLデータ型のサポート

- OPAQUE型の型マッピング・サポート

- スカラーの索引付き表の型マッピング・サポート

- PL/SQL変換ファンクションを介した型マッピングのサポート

- PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート

- RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ

- RECORD型のサポート

- 索引付き表の型のサポート

- PL/SQL変換ファンクションを直接使用する場合とラッパー・ファンクションを使用する場合

- JDBCでサポートされないデータ型に対するその他の代替方法

- JPublisherのスタイルとスタイル・ファイル

- スタイル・ファイルの指定と位置

- スタイル・ファイルの形式

- スタイル・ファイルのTRANSFORMATIONセクション

- スタイル・ファイルのOPTIONSセクション

- Oracleスタイル・ファイルでの主要なJava間の型マッピングのサマリー

- 複数のスタイル・ファイルの使用

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

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

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

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

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

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

- JPublisher出力のフィルタ機能

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

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

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

- 下位互換性および移行

- JPublisherの下位互換性

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

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

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

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

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

- Oracle9i互換モード

- Oracle8i互換モード

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

5 生成されるクラスおよびインタフェース

- 出力パラメータの取扱い

- 配列を使用した出力パラメータ渡し

- JAX-RPCホルダーを使用した出力パラメータ渡し

- ファンクションの戻りを使用した出力パラメータ渡し

- オーバーロードされたメソッドの変換

- SQLJクラスの生成

- SQLJクラスの生成に関する重要な注意事項

- PL/SQLパッケージ用のSQLJクラスの使用

- オブジェクト型用のSQLJクラスの使用

- SQLJクラスでの接続コンテキストおよびインスタンス

- setFrom()、setValueFrom()およびsetContextFrom()メソッド

- 非SQLJクラスの生成

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

- JPublisherのサブクラス

- JPublisherで生成されたクラスの拡張

- 代替クラスへのマッピングの構文

- 生成クラスを拡張するクラスの書式化

- 継承のサポート

- ORADataのオブジェクト型および継承

- 部分的に生成された型階層を組み合せる場合の事前作業

- JPublisherで生成されたコードでの型階層のマッピング

- ORADataの参照型および継承

- 別の参照型への参照型のインスタンスのキャスト

- 参照型の継承がオブジェクト型の継承に従わない理由

- 参照型間の手動変換

- 例: 参照型間の手動変換

- SQLDataのオブジェクト型および継承

- SQL FINAL、NOT FINAL、NOT INSTANTIABLEを使用する効果

6 コマンドライン・オプションおよび入力ファイル

- JPublisherオプション

- JPublisherのオプションのサマリー

- JPublisherオプションのヒント

- 表記規則

- 入力ファイルおよび公開する項目に関するオプション

- 変換対象のオブジェクトとパッケージの名前を含むファイル

- 公開対象のサーバー・サイドJavaクラスの宣言

- 公開対象のサーバー・サイドJavaクラスの宣言

- 公開対象のサーバー・サイドJavaクラスの宣言

- JavaおよびPL/SQLラッパー生成用の設定

- 入力プロパティ・ファイル

- 変換対象のオブジェクト型およびパッケージの宣言

- 変換対象のSQL文の宣言

- 変換対象のオブジェクト型の宣言

- 接続オプション

- SQLJ接続コンテキスト・クラス

- デフォルトのdatasourceオプション

- データベース接続用のJDBCドライバ・クラス

- ターゲット・データベースへの接続URL

- データベース接続用のユーザー名とパスワード

- データ型マッピングのオプション

- 組込み型のマッピング

- LOB型のマッピング

- 数値型のマッピング

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

- すべての型のマッピング

- Java間の型マッピング用のスタイル・ファイル

- 型マップのオプション

- デフォルトの型マップへのエントリの追加

- ユーザー型マップへの追加エントリ

- JPublisherのデフォルトの型マップ

- JPublisherの型マップの置換

- Javaコード生成オプション

- メソッドのアクセス

- Java識別名の大/小文字の区別

- コード生成のタイプ

- パラメータ・モードに従ったメソッドのフィルタリング

- パラメータ型に従ったメソッドのフィルタリング

- JavaBeans仕様に準拠したコード生成

- クラスとインタフェースのネーミング・パターン

- ユーザー・サブクラスの生成

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

- 名前参照からのスキーマ名の省略

- 出力引数のホルダー型

- 生成されたJavaパッケージの名前

- 生成されたオブジェクト・ラッパー・クラスのシリアライズ可能性

- オブジェクト・ラッパー・クラスのtoString()メソッドの生成

- mainメソッドの名前の変更

- PL/SQLコード生成オプション

- SQL型の生成

- PL/SQLスクリプトのファイル名

- PL/SQLラッパー・ファンクションの生成

- 生成されたPL/SQLコード用のパッケージ

- PL/SQLの索引付き表用のパッケージ

- 出入力オプション

- コンパイルまたは変換の抑制

- 生成されたソース・ファイルとクラス・ファイルの出力ディレクトリ

- Javaにおける文字のエンコーディング

- Webサービスのコールアウトを容易にするオプション

- JavaおよびPL/SQLラッパー生成用のWSDLドキュメント

- Webサービスのエンドポイント

- WSDLのプロキシURL

- クライアント・プロキシを実行するスーパーユーザー・パーミッション

- SQLJ機能にアクセスするためのオプション

- SQLJ Translator用の設定

- 下位互換性オプション

- ユーザー定義型用の下位互換性を持つOracleマッピング

- Java環境オプション

- 変換およびコンパイル用のCLASSPATH

- Javaコンパイラ

- Javaのバージョン

- SQLJ移行オプション

- JPublisher入力ファイル

- プロパティ・ファイルの構造および構文

- INPUTファイルの構造および構文

- 変換文について

- 変換文の例

- INPUTファイルの事前注意事項

- 複数の異なるオブジェクト型に対する同じJavaクラス名の要求

- 複数の異なるオブジェクト属性に対する同じ属性名の要求

- 存在しない属性の指定

- JPublisherの予約語

A 生成されるコードの例

- 生成されるコード: SQL文

- 生成されるコード: サーバー・サイドJavaのコールイン

- ソース・ファイル

- サーバー・サイドJavaクラスの公開

- 生成されるファイル

- 公開されたファイルのテスト

B トラブルシューティング

- Webサービス・クライアントを公開中のエラー

索引

図一覧

- 1-1 Oracle Universal Installerの「ようこそ」画面

- 1-2 Oracle Universal Installerの「インストール・タイプの選択」画面

- 1-3 Oracle Universal Installerの「インストールの場所」画面

- 1-4 Oracle Universal Installerの「使用可能な製品コンポーネント」画面

- 1-5 Oracle Universal Installerの「サマリー」画面

- 1-6 Oracle Universal Installerの「インストール」画面

- 1-7 JPublisher生成コードの変換および使用

表一覧

- 3-1 OracleおよびJDBCマッピング・クラスに対するSQLおよびPL/SQLデータ型

- 3-2 Oracleスタイル・ファイルでのJava間の型マッピングのサマリー

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

- 6-1 JPublisherのオプションのサマリー

- 6-2 -builtintypesオプションの影響を受ける型のマッピング

- 6-3 -lobtypesオプションの影響を受ける型のマッピング

- 6-4 -numbertypesオプションの影響を受ける型のマッピング

- 6-5 -mapping設定と他のマッピング・オプション設定の関係

- 6-6 -caseオプションの値

はじめに

この章では、このマニュアルの概要、対象読者、構成および表記規則について説明します。また、関連するOracleマニュアルのリストも記載されています。

JPublisherユーティリティは、JavaアプリケーションのクラスをSQLまたはPL/SQLのエンティティやサーバー・サイドJavaクラスに対応付ける必要のあるJavaプログラマを対象としています。

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

- 対象読者

- ドキュメントのアクセシビリティについて

- このマニュアルの構成

- 関連ドキュメント

- 表記規則

対象読者

このマニュアルは、データベース・アプリケーションで次のような作業を行うJava Database Connectivity (JDBC)およびJava2 Platform, Enterprise Edition (J2EE)プログラマを対象としています。

- オブジェクト型、VARRAY型およびネストした表型など、SQLユーザー定義型にマップするJavaクラスの作成

- OPAQUE型にマップするJavaクラスの作成

- PL/SQLパッケージにマップするJavaクラスの作成

- サーバー・サイドJavaクラスをコールするクライアント・サイドJavaスタブの作成

- JavaクラスのメソッドとしてのSQL問合せまたはデータ操作言語(DML)文の公開

- Webサービスのクライアント・プロキシ・クラス用のJavaラッパーとPL/SQLラッパーの作成

- Webサービスとしてのサーバー・サイドSQL、PL/SQLまたはJavaエンティティの公開

このマニュアルを使用するには、Java、Oracle Database、SQL、PL/SQLおよびJDBCに関する知識が必要です。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

このマニュアルの構成

このマニュアルの構成は、次のとおりです。

第1章「JPublisherの概要」

JPublisherユーティリティの概要と例、このリリースでの新機能およびJPublisher操作の概要について説明します。

第2章「JPublisherの使用方法」

JPublisherを使用して、SQLオブジェクトおよびPL/SQLオブジェクト、Oracle Streamsアドバンスト・キュー(AQ)、サーバー・サイドJavaクラスおよびWebサービスを公開する方法を説明します。

第3章「データ型およびJava間の型マッピング」

JPublisherのデータ型マッピングの詳細と、Java間での型マッピングのスタイル・メカニズムについて説明します。

第5章「生成されるクラスおよびインタフェース」

出力パラメータ(PL/SQLのIN OUTまたはOUTパラメータ)の処理方法、オーバーロードされたメソッドの変換方法、生成されたクラスとインタフェースの使用方法など、JPublisherにより生成されるクラス、インタフェースおよびサブクラスの詳細と概念について説明します。

第4章「その他の機能と考慮事項」

Webサービスに対するサポートの概要、JPublisher出力のフィルタリング、移行および下位互換性など、JPublisherのその他の機能と考慮事項について説明します。

第6章「コマンドライン・オプションおよび入力ファイル」

JPublisherのコマンドライン構文、コマンドライン・オプションと使用方法および入力ファイル形式の詳細を説明します。

付録A「生成されるコードの例」

各章では長すぎて記載しきれなかったサンプル・コードを示します。これには、WebサービスをサポートするためのJava間の型変換の例や、JavaおよびPL/SQLラッパーの例が含まれます。

付録B「トラブルシューティング」

JPublisherのトラブルシューティングのヒントについて説明します。

関連ドキュメント

詳細は、次のOracleドキュメントを参照してください。

Oracle Databaseリリースについては、Oracle Java Platformグループから次のマニュアルが提供されます。

- 『Oracle Database Java開発者ガイド』
このマニュアルでは、Oracle DatabaseにおけるJavaの基本概念を導入し、サーバー側の構成と機能に関する一般的な情報を提供します。このマニュアルには、JDBCなど特定の製品ではなく、Oracle DatabaseのJava環境全般に関する情報が記載されています。

また、Oracle Databaseで直接実行するプログラムであるJavaストアド・プロシージャについても説明しています。ストアド・プロシージャ(ファンクション、プロシージャおよびトリガー)により、Java開発者はビジネス・ロジックをサーバー・レベルで実装して、アプリケーション・パフォーマンス、拡張性およびセキュリティを改善できます。

- 『Oracle Database JDBC開発者ガイド』
このマニュアルでは、JDBC標準のOracle実装のプログラミング構文および機能について説明しています。Oracle JDBCドライバの概要、JDBC 1.22、2.0および3.0機能のOracleの実装の詳細、Oracle JDBCの型の拡張とパフォーマンスの拡張の説明が記載されています。

Oracle Application Serverリリースについては、Oracle Java Platformグループから次のマニュアルが提供されます。

- 『Oracle Containers for J2EEジョブ・スケジューラ開発者ガイド』

- 『Oracle Application Server Containers for J2EEサービス・ガイド』

- 『Oracle Application Server Containers for J2EEセキュリティ・ガイド』

- 『Oracle Application Server Containers for J2EEサーブレット開発者ガイド』

- 『Oracle Application Server Containers for J2EE JavaServer Pages開発者ガイド』

- 『Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス』

- 『Oracle Application Server Containers for J2EE Enterprise JavaBeans開発者ガイド』

Oracle Server Technologiesグループからは、次のマニュアルが提供されます。

- 『Oracle XML DB開発者ガイド』

- 『Oracle XML Developer's Kitプログラマーズ・ガイド』

- 『Oracle Database XML Java API Reference』

- 『Oracle Database開発ガイド』

- 『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

- 『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』

- 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

- 『Oracle Database PL/SQL言語リファレンス』

- 『Oracle Database SQL言語リファレンス』

- 『Oracle Database Net Services管理者ガイド』

- Oracle Database Advanced Securityガイド

- 『Oracle Databaseグローバリゼーション・サポート・ガイド』

- 『Oracle Databaseリファレンス』

注意:
Oracleエラー・メッセージ・ドキュメントは、http://www.oracle.com/technetwork/index.htmlで入手できます。

Oracle Application Serverグループからは、次のマニュアルが提供されます。

- 『Oracle Application Server管理者ガイド』

- 『Oracle HTTP Server管理者ガイド』

- 『Oracle Application Serverパフォーマンス・ガイド』

- 『Oracle Application Serverグローバリゼーション・サポート・ガイド』

- 『Oracle Application Server Web Cache管理者ガイド』

- 『Oracle Application Server Web Services開発者ガイド』

- 『Oracle Application Serverアップグレード』

Oracle JDeveloperグループからは、次のドキュメントが提供されます。

- JDeveloperオンライン・ヘルプ

- Oracle Technology Network上のJDeveloperマニュアル

http://www.oracle.com/technetwork/developer-tools/jdev/documentation/index.html

リリース・ノート、インストール関連ドキュメント、ホワイト・ペーパーまたはその他の関連ドキュメントは、Oracle Technology Network(OTN)から無償でダウンロードできます。OTNを使用するには、オンラインでの登録が必要です。登録は、次の場所から無償で行えます。

http://www.oracle.com/technetwork/community/join/why-join/index.html

すでにOTNのユーザー名およびパスワードを取得している場合は、次の場所でOTN Webサイトのドキュメントのセクションに直接接続できます。

http://www.oracle.com/technetwork/index.html

追加情報は、次の場所を参照してください。

http://jcp.org/aboutJava/communityprocess/final/jsr101/index.html

前述のリンクから、Java API for XML-based RPC (JAX-RPC 1.0)仕様およびJAX-RPCとホルダーに関する情報にアクセスできます。

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/native2ascii.html

Java Development Kit(JDK)ユーザーの場合は、このリンクを使用すると、Java環境でサポートされている文字のエンコーディング情報を含むnative2asciiドキュメントが表示されます。

表記規則

このセクションでは、このマニュアルの本文およびコード例で使用される表記規則について説明します。この項の内容は次のとおりです。

- 本文の表記規則

- コード例の表記規則

本文の表記規則

本文では、特定の項目が一目でわかるように、次の表記規則を使用します。次の表に、その規則と使用例を示します。

規則

意味

例

太字

太字は、本文中で定義されている用語を示します。

クラスは、特定の種類のすべてのオブジェクトに共通の変数およびメソッドを定義する設計図です。

イタリック体

イタリックは、ドキュメントのタイトルまたは強調を示します。

『Oracle Database概要』
リカバリ・カタログおよびターゲット・データベースが同じディスクに存在しないことを確認します。

固定幅フォントの大文字

固定幅フォントの大文字は、システム要素を示します。このような要素には、パラメータ、権限、データ型(ユーザー定義の型を含む)、RMANキーワード、SQLキーワード、SQL*Plusまたはユーティリティ・コマンド、パッケージおよびメソッドがあります。また、システム指定の列名、データベース・オブジェクト、データベース構造、ユーザー名およびロールも含まれます。

この句は、NUMBER列でのみ指定できます。
BACKUPコマンドを使用して、データベースのバックアップを作成できます。

USER_TABLESデータ・ディクショナリ・ビューのTABLE_NAME列を問い合せます。

DBMS_STATS.GENERATE_STATSプロシージャを使用します。

固定幅フォントの小文字

固定幅フォントの小文字は、実行可能ファイル、ファイル名、ディレクトリ名およびユーザーが指定する一部の要素を示します。このような要素には、コンピュータ名、データベース名、ネット・サービス名、接続識別子、Javaパッケージ、Javaクラス、プログラム・ユニットおよびパラメータ値などがあります。
注意: プログラム要素には、大文字と小文字を組み合せて使用するものもあります。これらの要素は、記載されているとおりに入力してください。

sqlplusと入力して、SQL*Plusを起動します。
パスワードは、orapwdファイルに指定します。

/disk1/oracle/dbsディレクトリのデータ・ファイルおよび制御ファイルをバックアップします。

hr.departments表には、department_id、department_nameおよびlocation_id列があります。

QUERY_REWRITE_ENABLED初期化パラメータをtrueに設定します。

JRepUtilクラスは、これらのメソッドを実装します。

固定幅フォントの小文字のイタリック

固定幅フォントの小文字のイタリックは、プレースホルダまたは変数を示します。

parallel_clauseを指定できます。
old_release.SQLを実行します。ここで、old_releaseは、アップグレード前にインストールしたリリースを示します。

コード例の表記規則

コード例として、Java、SQL、PL/SQL、SQL*Plusまたはコマンドライン文を示します。次の例に示すように、これらは固定幅フォントで表示され、通常のテキストと区別されます。

SELECT username FROM dba_users WHERE username = 'MIGRATE';

次の表に、コード例で使用される表記規則とその使用例を示します。

規則

意味

例

[ ]

大カッコは、カッコ内の項目を任意に選択することを表します。大カッコ自体は入力しません。

DECIMAL (digits [ , precision ])

{ }

中カッコは、カッコ内のいずれかの項目が必要であることを示します。中カッコ自体は入力しません。

{ENABLE | DISABLE}

|

縦線は、大カッコまたは中カッコ内の複数の選択項目を表します。いずれかの項目を入力します。縦線自体は入力しません。

{ENABLE | DISABLE}
[COMPRESS | NOCOMPRESS]

...

省略記号は、次のいずれかを示します。

- 例とは直接関連のない一部のコードが省略されている

- コードの一部が繰り返される

CREATE TABLE ... AS subquery;

SELECT col1, col2, ... , coln FROM employees;

その他の記号

大カッコ([])、中カッコ({})、縦線(|)および省略記号(...)は、記載されたとおりに入力する必要があります。

acctbal NUMBER(11,2);
acct    CONSTANT NUMBER(4) := 3;

Italics

イタリックは、特定の値を入力する必要があるプレースホルダまたは変数を示します。

CONNECT SYSTEM/system_password
DB_NAME = database_name

UPPERCASE

大文字は、システム指定の要素を示します。これらの要素は、ユーザー定義の要素と区別するために大文字で表示されます。大カッコ内の要素以外は、表示されたとおりの順序および綴りで入力します。ただし、大/小文字が区別されないため、小文字で入力してもかまいません。

SELECT last_name, employee_id FROM employees;
SELECT * FROM USER_TABLES;
DROP TABLE hr.employees;

lowercase

小文字は、ユーザーが指定するプログラム要素を示します。たとえば、表名、列名、ファイル名などを表します。
注意: プログラム要素には、大文字と小文字を組み合せて使用するものもあります。これらの要素は、記載されているとおりに入力してください。

SELECT last_name, employee_id FROM employees;
sqlplus hr/hr
CREATE USER mjones IDENTIFIED BY ty3MU9;

1 JPublisherの概要

この章では、JPublisherユーティリティの概要と、それに続いてJPublisher操作のサマリーと変換例を示します。内容は次のとおりです。

- JPublisherの概要

- JPublisherに関する初期の考慮事項

- JPublisherで公開できる内容

- JPublisherマッピングとマッピング・カテゴリ

- JPublisherの入力および出力

- 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型が対応しています。

このユーティリティでは、オブジェクト型の属性ごとにアクセッサ・メソッド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によるWebサービス・サポートの概要」

JPublisherに関する初期の考慮事項

次の項では、JPublisherの機能と要件の概要を説明します。また、JPublisherのコード生成におけるSQLJの使用方法についても説明します。

- Oracle Database 12cリリース1(12.1.0.2)のJPublisherの新機能

- JPublisherの一般的な要件

- JPublisherのインストール

- JPublisherのインストールの検証

- JPublisherによるSQLJ実装の使用

- 要件が緩和される場合

- JPublisherの制限事項

Oracle Database 12cリリース1(12.1.0.2)のJPublisherの新機能

このリリースのJPublisherには、新機能はありません。

JPublisherの一般的な要件

この項では、JPublisherの基本要件について説明します。また、要件が緩和される状況についても説明します。

JPublisherユーティリティを使用する場合は、他のクラスとともにOracle SQLJ実装、Oracle JDBC実装およびSun社のJDK用のクラスも必要です。

JPublisherのすべての機能を使用するには、必要に応じて次のコンポーネントをインストールし、適切な環境変数を設定する必要があります。

- Oracle Database 12c

- 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 12cまたはOracle Database 11g JDBCドライバ
Oracle 12c JDBCのJPublisher 12cを使用する場合、サポートされるJDKのバージョンは、JDK 6およびJDK 7のみです。ただし、JPublisher 12cをOracle JDBC 11gドライバとともに使用する場合は、JDKバージョン1.5も使用できます。通常、Oracle JDBCライブラリはORACLE_HOME/jdbc/libにあります。各JDBCライブラリのoracle.jpub.runtimeパッケージには、JPublisherランタイム・クラスも含まれています。

関連項目:
『Oracle Database JDBC開発者ガイド』

- Webサービスのクラス
これらのクラスは、通常はORACLE_HOME/sqlj/libのdbwsa.jarおよびdbwsclient.jarライブラリにあります。

注意:
これらの.jarファイルは、JPublisherの配布には含まれていませんが、http://download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callout-utility-10131.zipからダウンロードできるデータベースWebサービスのコールアウト・ユーティリティに含まれています。

- データベース内のその他のPL/SQLパッケージおよびJava Archive(JAR)ファイル(必要な場合)
Webサービスのコールインおよびコールアウト、PL/SQL型のサポートまたはサーバー・サイドJavaクラスのコールのサポートにJPublisher機能を使用する場合に、データベース内に存在している必要のあるパッケージおよびJARファイルがあります。これらのパッケージおよびファイルの一部は事前にロードされていますが、その他は手動でロードする必要があります。

関連項目:
「JPublisherのインストールの検証」

- 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以上が必要です。

関連項目:
「Java環境オプション」

JPublisherのインストール

JPublisherをインストールするには、使用するシステムにSQLJをインストールしておく必要があります。次の手順を実行して、SQLJをインストールしてください。

1. Oracle Database 12cクライアントのCDをダウンロードして解凍します。

2. setup.exeファイルを実行してOracle Universal Installerを実行します。
図1-1に示すように、ようこそウィンドウが表示されます。

図1-1 Oracle Universal Installerの「ようこそ」画面

3. 「次へ」をクリックします。
図1-2に示すように、インストール・タイプの選択ウィンドウが表示されます。

図1-2 Oracle Universal Installerの「インストール・タイプの選択」画面

4. インストール・タイプに「カスタム」を選択して、「次へ」をクリックします。
図1-3に示すように、インストールの場所ウィンドウが表示されます。

図1-3 Oracle Universal Installerの「インストールの場所」画面

5. Oracle Databaseホームが正しいかどうかを確認し、「次へ」をクリックします。
図1-4に示すように、使用可能な製品コンポーネント・ウィンドウが表示されます。

図1-4 Oracle Universal Installerの「使用可能な製品コンポーネント」画面

6. Oracle Clientセクションの「コンポーネント」列からOracle SQLJを選択し、「次へ」をクリックします。
サマリー・ウィンドウが表示されます。

図1-5 Oracle Universal Installerの「サマリー」画面

7. 選択内容を確認して、「インストール」をクリックします。
進捗状況を示すインストール・ウィンドウが表示されます。

図1-6 Oracle Universal Installerの「インストール」画面

8. 「終了」に続いて「はい」をクリックします。

JPublisherのインストールの検証

使用する必要があるJPublisherの機能に応じて、次の一部またはすべてのPL/SQLパッケージおよびJARファイルがデータベースに存在する必要があります。

- SQLJUTLパッケージ。PL/SQL型をサポートします。

- SQLJUTL2パッケージ。サーバー・サイドJavaクラスのコールをサポートします。

- UTL_DBWSパッケージ。Webサービスのコールアウトをサポートします。

- dbwsclient.jarファイル。Oracle Database 12cまたはOracle Database 11gからのWebサービスのコールアウトに使用するJava API for XML-based Remote Procedure Call (JAX-RPC)またはSimple Object Access Protocol (SOAP)クライアント・プロキシ・クラスをサポートします。

関連項目:
「Webサービスのコールアウトを容易にするオプション」

- JARファイル。Oracle9iまたはOracle8iデータベースからのWebサービスのコールアウトに使用するSOAPクライアント・プロキシ・クラスをサポートします。
Oracle9i DatabaseまたはOracle8i DatabaseからのWebサービスのコールアウトの場合、dbwsclient.jarのようなJARファイルは存在しません。かわりに複数のJARファイルをロードする必要があります。また、JPublisherでは、Oracle9iまたはOracle8iでのJAX-RPCクライアント・プロキシ・クラスがまだサポートされていないことに注意してください。

注意:

- Oracle Database 10gから、sqljutl.jarがデータベースに事前ロードされ、Webサービスのコールインのビルトイン・サポートが提供されています。Oracle9i DatabaseとOracle8i Databaseで手動ロードの際に必要だったsqljutl.jarファイルは含まれなくなりました。

- UTL_DBWSパッケージとdbwsclient.jarファイルは相互に関連付けられており、どちらも同じ機能セットをサポートします。

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

- SQLJUTLおよびSQLJUTL2パッケージの確認またはインストール

- UTL_DBWSパッケージの確認またはインストール

- dbwsclient.jarファイルの確認またはロード

- Oracle9iまたはOracle8iでWebサービスのコールアウトに使用するJARファイルのロード

- リモートSYSログインのためのパスワード・ファイルの設定

SQLJUTLおよびSQLJUTL2パッケージの確認またはインストール

Oracle Database 12cでは、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 12cの場合)

- ORACLE_HOME/sqlj/lib/sqljutl8.sql(Oracle8iの場合)

UTL_DBWSパッケージの確認またはインストール

Oracle Database 12cリリースでは、セキュリティ上の理由からUTL_DBWS PL/SQLパッケージはデータベースのSYSスキーマに自動的にインストールされません。次のOTNページで入手可能なコールアウト・ユーティリティとして組み込まれているutl_dbws_decl.sqlおよびutl_dbws_body.sqlスクリプトを実行して、このパッケージをインストールする必要があります。

http://download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callout-utility-10131.zip

インストールを確認するには、このパッケージについて次のコマンドを実行します。

SQL> describe hr.utl_dbws

dbwsclient.jarファイルの確認またはロード

Oracle Database 12cでは、Webサービスのコールアウト用に次のファイルをデータベースにロードする必要があります。

ORACLE_HOME/sqlj/lib/dbwsclient.jar

このファイルは事前ロードされませんが、ユーザー・スキーマ内で次の問合せを実行すると、ロード済かどうかを確認できます。

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サービスのコールアウトに使用するJARファイルのロード

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)とともに実行することになります。

注意:

- Oracle9iまたはOracle8iでは、JAX-RPCクライアント・プロキシ・クラスはまだサポートされていません。

- このファイルをロードする前に、java_pool_sizeデータベース・パラメータが80MB以上に設定されていること、およびshared_pool_sizeパラメータが96MB以上に設定されていることを確認してください。

リモートSYSログインのためのパスワード・ファイルの設定

デフォルトでは、-proxywsdlを使用してWebサービス・クライアントを公開するとき、または-dbjavaを使用してサーバー・サイドJavaクラスを公開するときに、-userおよび-sysuserオプションが設定されている場合、JPublisherでは生成されたJavaおよびPL/SQLラッパーがデータベースにロードされます。-url設定によりJDBC Thinドライバが指定されている場合、ロード処理では、データベースのパスワード・ファイルを適切に設定する必要があります。パスワード・ファイルを設定するには、次のステップを実行します。

1. コマンドラインで次のコマンドを入力します。

orapwd file=$ORACLE_HOME/dbs/orapw entries=5
Enter password: password

前述のコマンドで、yourpassは選択したパスワードです。

2. 次のように、SQL*PlusからデータベースにSYSDBAとして接続します。

CONNECT / AS SYSDBA

次のように、SYSのパスワードを前のステップで設定したパスワードに変更します。

PASSWORD SYS
Changing password for SYS
New password: password
Retype new password: password

3. init.oraファイルを編集して、次の行を追加します。

REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

これにより、SYSDBAとしてリモート・ログインできるようになります。

関連項目:
『Oracle Database JDBC開発者ガイド』

パスワード・ファイルの設定では、JPublisherで生成されたPL/SQLラッパーおよびJavaラッパーをデータベースに手動でロードすることもできます。JPublisherによる自動ロードをオフにするには、コマンドラインで-proxyopt=noloadを指定します。

JPublisherによるSQLJ実装の使用

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

- SQLJ使用の概要

- SQLJの概念の概要

- SQLJソース・ファイルに影響する下位互換性モード

SQLJ使用の概要

Oracle SQLJ Translatorとランタイム・ライブラリは、JPublisher製品に付属しています。JPublisherユーティリティでは、ラッパー・メソッドの作成など、ほとんどの場合に中間ステップとしてSQLJコードを生成することで、Oracle SQLJ実装が使用されます。ラッパー・メソッドは、PL/SQLパッケージを表すクラス、またはPL/SQLストアド・プロシージャを定義するSQLオブジェクト型を表すクラスについて作成されます。このような場合、JPublisherではコンパイル時にOracle SQLJ Translatorが使用され、プログラムの実行時にOracle SQLJランタイムが使用されます。

Oracle Database 12cでは、JPublisherによるSQLJの使用はデフォルトで透過的になっています。JPublisherにより生成されるSQLJソース・ファイルは、JPublisher設定で特に指定しないかぎり自動的に変換および削除されます。この自動変換により、ファイルを明示的に変換する作業が不要になります。SQLJ機能を使用する生成後の.javaファイルと、コンパイルにより生成された関連.classファイルで、SQLJクラスが定義されます。これらのクラスでは、実行時にOracle SQLJランタイムApplication Programming Interface(API)が使用されます。SQLJランタイムを使用しない生成後のクラスを、非SQLJクラスと呼びます。非SQLJクラスが生成されるのは、JPublisherでストアド・プロシージャを持たないSQL型のクラスが作成される場合、またはラッパー・メソッドを生成しないように特に設定されている場合です。

Oracle Database 12cでは、JPublisherの-sqljオプションを介してSQLJ Translatorにオプションを渡すことができます。

関連項目:
「SQLJ機能にアクセスするためのオプション」

JPublisherは、SQLJ Translatorのライブラリも含むtranslator.jarに組み込まれています。JPublisherで生成されたクラスは、runtime12.jarに依存します。これは、Java Development Kit (JDK) 1.5以上のSQLJランタイム・ライブラリです。

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接続コンテキスト・クラス」

- イテレータ
SQLJのイテレータは、強い型指定を持つバージョンのJDBC結果セットであり、基礎となるデータベース・カーソルに関連付けられています。SQLJイテレータは、SELECT文から問合せ結果を取るために使用されます。強い型指定は、各問合せ列のデータ型に基づきます。

- 実行コンテキスト
SQLJの実行コンテキストは、標準sqlj.runtime.ExecutionContextクラスのインスタンスであり、SQL操作が実行されるコンテキストを提供します。実行コンテキスト・インスタンスは、SQLJコードを介して実行される各SQL操作に暗黙的または明示的に関連付けられます。

SQLJソース・ファイルに影響する下位互換性モード

Oracle8i DatabaseおよびOracle9i Databaseでは、.sqljソース・ファイルが参照可能な出力として生成され、SQLJコマンドライン・インタフェースを使用して変換できます。

注意:
UNIXシステムでは、sqljスクリプトを実行してSQLJコマンドライン・インタフェースにアクセスできます。Microsoft Windowsでは、sqlj.exeを使用します。

Oracle Database 12cのJPublisherでは、-compatibleオプションを介して複数の下位互換性設定がサポートされています。このオプションにより、生成された.sqljファイルを引き続き次のような方法で処理できます。-compatibleオプションの設定の一部を次に示します。

- -compatible=sqlj
JPublisherで.sqljファイルの変換ステップが強制的にスキップされます。.sqljファイルを明示的に変換する必要があります。ファイルを変換するために、-sqljオプションのみを使用してJPublisherを実行するか、または専用コマンドライン・インタフェースを介してSQLJ Translatorを直接実行できます。

関連項目:
「SQLJ機能にアクセスするためのオプション」

- -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の使用時は、次の制限事項に注意する必要があります。

- JPublisherでは、PL/SQLのRECORD型および索引付き表の型のサポートに制限があります。RECORDまたは索引付き表の引数からJDBCでサポートされるSQL型へのマッピングには、中間的なラッパー・レイヤーが使用されます。また、JPublisherでは、索引付き表のセマンティクスが完全にはサポートされません。索引付き表の構造はJavaのハッシュテーブルに似ていますが、JPublisherによりSQLのTABLE型にマップされると情報が失われます。

関連項目:
「PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート」

- INPUTファイルを使用して型マッピングを指定する場合は、なんらかの潜在的な破壊的エラー条件があっても、JPublisherではエラー・メッセージや警告メッセージが生成されないことに注意してください。また、SQLまたはJavaの識別子として使用できない予約語があります。

関連項目:
「INPUTファイルの事前注意事項」

- JPublisherの-omit_schema_namesオプションはブール型オプションとして動作しますが、他のブール型オプションとは構文が異なります。このオプションを使用すると、JPublisherに対して、ラッパー・クラスで参照されるSQL名の修飾にスキーマ名を使用しないように指示できます。デフォルトでは、SQL名がスキーマ名で修飾されます。スキーマ名の使用を禁止するには、コマンドラインに-omit_schema_names=trueまたは-omit_schema_names=falseを設定せず、-omit_schema_namesオプションを入力します。

関連項目:
「名前参照からのスキーマ名の省略」

注意:
この章では、他の種類の入力ファイルと区別するため、-inputオプションで指定した入力ファイルをINPUTファイルとします。

JPublisherで公開できる内容

JPublisherを使用すると、次のものを公開できます。

- SQLユーザー定義型

- PL/SQLパッケージ

- サーバー・サイドJavaクラス

- SQL問合せまたはDML文

- Webサービスのコールアウトに使用するプロキシ・クラスとラッパー

- Oracle Streams AQ

関連項目:
第2章「JPublisherの使用方法」

JPublisherマッピングとマッピング・カテゴリ

次の項では、JPublisherマッピングとマッピング・カテゴリの基本的な概要を説明します。

- ユーザー定義型とPL/SQL型のJPublisherマッピング

- JPublisherのマッピング・カテゴリ

ユーザー定義型とPL/SQL型のJPublisherマッピング

JPublisherには、次の型からJavaクラスへのマッピングが用意されています。

- ユーザー定義SQL型

- PL/SQL型

JPublisherを介したユーザー定義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開発者ガイド』

ORAData実装の強い型指定を持つオブジェクト参照の使用

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属性を持ちます。

JPublisherを介したPL/SQL型の使用

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のユーザー型マップとデフォルトの型マップ」および「PL/SQLデータ型のサポート」

JPublisherのマッピング・カテゴリ

JPublisherには、SQLからJavaへのデータ型マッピングについて、様々なカテゴリが用意されています。型マッピング・オプションごとに、少なくとも2つの可能な値jdbcまたはoracleがあります。-numbertypesオプションには、さらに2つの代替値objectjdbcおよびbigdecimalがあります。これらのマッピング・カテゴリについては、後述します。

関連項目:
第3章「データ型およびJava間の型マッピング」

JDBCマッピング

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マッピング

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にマップされる属性を取得する場合に値が大きすぎて入らないときは、例外が発生します。

BigDecimalマッピング

BigDecimalマッピングでは、すべての数値型がjava.math.BigDecimalにマップされます。NULL値および大きい値もサポートします。

Oracleマッピング

Oracleマッピングでは、数値型、LOB型およびその他の組込み型は、oracle.sqlパッケージのクラスにマップされます。たとえば、DATE型はoracle.sql.DATEにマップされ、すべての数値型はoracle.sql.NUMBERにマップされます。オブジェクト型、コレクション型およびオブジェクト参照型の場合、JPublisherではORADataクラスが生成されます。

Oracleマッピングではプリミティブ型を使用しないため、すべての場合にNULL値をJava nullとして表せます。Oracleマッピングではすべての数値型でoracle.sql.NUMBERクラスを使用するため、データベースに格納できる最大の数値を表すこともできます。

JPublisherの入力および出力

データベース・エンティティを公開するために、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への入力

- JPublisherからの出力

関連項目:
「公開プロセスの概要: 出力の生成および使用」

JPublisherへの入力

コマンドラインおよびJPublisherプロパティ・ファイルで入力オプションを指定できます。変換されたエンティティ用にJavaクラスが生成されるのみではなく、JPublisherでは変換されたオブジェクトとパッケージの名前を標準出力に書き出します。

JPublisherのINPUTファイルと呼ばれるファイルを使用して、JPublisherで公開するSQL型、PL/SQLパッケージまたはサーバー・サイドJavaクラスを指定できます。また、生成されたパッケージおよびクラスのネーミングも制御します。

プロパティ・ファイルを使用してオプション設定を指定するには、コマンドラインで-propsオプションを使用してプロパティ・ファイル名を指定します。JPublisherでは、プロパティ・ファイルの内容が-propsオプションの時点でコマンドラインから順序どおり挿入されたかのように処理されます。柔軟性を高めるために、プロパティ・ファイルをSQLスクリプト・ファイルにして、JPublisherディレクティブをSQLコメントに埋め込むこともできます。

関連項目:
「JPublisherオプション」、「INPUTファイルの構造および構文」および「プロパティ・ファイルの構造および構文」

JPublisherからの出力

この項では、ユーザー定義オブジェクト型、ユーザー定義コレクション型、OPAQUE型、PL/SQLパッケージ、サーバー・サイドJavaクラス、SQL問合せまたはDML文およびAQとストリームに関するJPublisher出力について説明します。

注意:
JPublisherでは、SQL型またはPL/SQLパッケージなどのデータベース・エンティティを公開すると、そのエンティティで参照される型のクラスも生成されることに注意してください。たとえば、公開するPL/SQLパッケージのストアド・プロシージャの引数としてSQLオブジェクト型が使用されている場合は、そのSQLオブジェクト型にマップするためのクラスが生成されます。

ユーザー定義オブジェクト型のJava出力

ユーザー定義のオブジェクト型の場合、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属性用のクラスのどちらも生成されません。

ユーザー定義コレクション型のJava出力

ユーザー定義コレクション型に対してJPublisherを実行している場合は、ORADataクラスを要求する必要があります。JPublisherでは次のクラスが生成されます。

- Oracleコレクション型に対応する型定義として動作するコレクション・クラス。
JPublisherで変換されるコレクション型ごとに、type.javaファイルが生成されます。ネストした表の場合、生成されたクラスは、配列全体としてネストした表を取得および設定するメソッドと、表の個々の要素を取得および設定するメソッドを持ちます。JPublisherでは、コレクション型はORADataクラスの生成時に変換されますが、SQLDataクラスの生成時には変換されません。

- コレクションの要素がオブジェクトの場合は、要素型用のJavaクラス、および要素型の中で直接または間接的にネストされたオブジェクト属性またはコレクション属性用のJavaクラス。
この自動生成が必要なのは、コレクションのインスタンスが実体化されるたびに、Javaでオブジェクト要素を実体化できるようにするためです。

- 生成された型により実装されるインタフェース(オプション)。

注意:
オブジェクト型とは異なり、コレクション型にはユーザー・サブクラスを生成するためのオプションはありません。

OPAQUE型の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パッケージのJava出力

PL/SQLパッケージに対してJPublisherを実行すると、そのパッケージのストアド・プロシージャをサーバーでコールするラッパー・メソッドを含むJavaクラスが作成されます。メソッドのIN引数は、クライアントからサーバーへ送られ、OUT引数および結果はサーバーからクライアントへ戻されます。

サーバー・サイドJavaクラスとWebサービスのコールアウトのJava出力

汎用的に使用されるサーバー・サイドJavaクラスに対してJPublisherを実行すると、サーバー・クラスをミラー化するクライアント・サイド・スタブ・クラス用のソース・コードtype.javaが作成されます。クライアント・サイド・メソッドをコールすると、対応するサーバー・サイド・メソッドが透過的にコールされます。

Webサービスのコールアウトの場合、JPublisherでは、通常はサーバー・サイドのクライアント・プロキシ・クラスのラッパー・クラスが生成されます。これらのラッパー・クラスは、対応するPL/SQLラッパーへのブリッジとして機能します。PL/SQLではインスタンス・メソッドがサポートされないため、プロキシ・クラスのインスタンス・メソッドを静的メソッドとして公開するために、このクラスが必要となります。

SQL問合せまたはDML文のJava出力

JPublisherをSQL問合せまたはDML文に対して実行すると、次が作成されます。

- SQL文を実行するメソッドを実装するJavaクラス。

- JPublisher設定に指定した名前のJavaスタブ・サブクラス(オプション)。
このスタブ・サブクラスを変更して、カスタム機能に使用できます。

- 生成されたクラスまたはサブクラスで実装するJavaインタフェース(オプション)。

AQおよびストリームのJava出力

JPublisherをAQまたはトピックに対して実行すると、次が作成されます。

- キューまたはトピックのJavaクラス。

- キューまたはトピックのペイロード・タイプのJavaクラス。

ストリームの場合、JPublisherではストリームのJavaクラスが生成されます。ペイロードは常にSYS.ANYDATAであり、java.lang.Objectにマップされます。

PL/SQL出力

使用方法によっては、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型を作成するラッパー・スクリプト

- ラッパー・スクリプトを実行するためのパーミッションを付与するスクリプト

- ラッパー・スクリプトを実行するためのパーミッションを取り消すスクリプト

- ラッパー・スクリプトにより作成されたパッケージおよび型を削除するスクリプト

JPublisherの操作

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

- 公開プロセスの概要: 出力の生成および使用

- JPublisherコマンドライン構文

- JPublisher変換の例

公開プロセスの概要: 出力の生成および使用

図1-7は、指定したSQL型、PL/SQLパッケージまたはサーバー・サイドJavaクラスを公開する基本的な手順を示しています。手順は次のとおりです。

1. 必要に応じてコマンドライン、プロパティ・ファイルおよびINPUTファイルからの入力を使用し、JPublisherを実行します。

2. JPublisherが接続先データベースにアクセスし、公開対象として指定されたSQLまたはPL/SQLエンティティの定義を取得します。

3. JPublisherが、ストアド・プロシージャのラッパー・メソッドを作成するかどうかに応じて、ソース・ファイル.javaまたは.sqljを生成します。

4. JPublisherはデフォルトでSQLJ Translator(JPublisherに付属)を起動し、.sqljファイルを.javaファイルに変換します。

5. SQLJクラスの場合、SQLJ TranslatorはデフォルトでJavaコンパイラを起動し、.javaファイルを.classファイルにコンパイルします。非SQLJクラスの場合、JPublisherはJavaコンパイラを起動します。

6. JPublisherが、必要に応じて.classファイルのみではなくPL/SQLラッパーおよびスクリプトを出力します。PL/SQLラッパー・パッケージと必要なSQL型(PL/SQL型にマップする型など)を作成するスクリプト、これらのエンティティを削除するスクリプト、および必要な権限を付与または取り消すスクリプトがあります。

7. プロキシ・クラスを(-proxywsdlまたは-proxyclassesオプションを介して)生成する場合、JPublisherは生成されたPL/SQLラッパーとスクリプトをデータベースのPL/SQLエンジンで実行できるように接続先データベースにロードできます。

8. デフォルトでJPublisherは、Webサービスのコールアウト用に生成されたJavaクラスを、Oracle JVMで実行できるように接続先データベースにロードします。通常、Webサービスのコールアウト用を除き、JPublisherで生成されたクラスは、クライアントまたは中間層JVMで実行されます。JPublisherで生成されたクラスのサブクラスなど、通常はクライアントまたは中間層JVMで実行される独自クラスも使用できます。

図1-7 JPublisher生成コードの変換および使用

JPublisherコマンドライン構文

ほとんどのオペレーティング・システムでは、次のようにjpubの後に一連のオプション設定を入力し、コマンドラインからJPublisherを起動できます。

% jpub -option1=value1 -option2=value2 ...

JPublisherは、データベースに接続し、ユーザー指定の型またはパッケージの宣言を取得して応答します。次に、1つ以上のカスタムJavaクラスを生成し、変換されたオブジェクト型またはPL/SQLパッケージの名前を標準出力に書き出します。

JPublisherを起動するコマンドの例を次に示します(ここでは折り返されていますが、1行のコマンドラインです)。

% jpub -user=hr -input=demoin -numbertypes=oracle -usertypes=oracle -dir=demo -d=demo -package=corp
Enter hr password: password

コマンドは1行に入力しますが、必要に応じて改行されます。このコマンドでは、JPublisherはユーザー名hrとパスワードhrでデータベースに接続し、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変換の例

この項では、ユーザー定義オブジェクト型の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=hr -dir=demo -numbertypes=objectjdbc -builtintypes=jdbc -package=corp -case=mixed -sql=Employee
Enter hr password: password

関連項目:
「JPublisherオプション」

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 = "HR.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設定を使用してから、これらのメソッドをクラスの拡張時に使用します。

関連項目:
「setFrom()、setValueFrom()およびsetContextFrom()メソッド」

- 次の場合には、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 = "HR.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 static cast()メソッドも生成されます。

2 JPublisherの使用方法

この章では、JPublisherを使用して次のことを行う方法を説明します。

- ユーザー定義のSQL型の公開

- PL/SQLパッケージの公開

- Oracle Streams AQの公開

- ネイティブJavaインタフェースを介したサーバー・サイドJavaクラスの公開

- PL/SQLラッパーを介したサーバー・サイドJavaクラスの公開

- PL/SQLへのサーバー・サイドJavaクラスの公開

- テーブル・ファンクションへのサーバー・サイドJavaクラスの公開

- PL/SQLへのWebサービス・クライアントの公開

ユーザー定義のSQL型の公開

JPublisherを使用すると、SQLオブジェクトまたはコレクションをJavaクラスとして簡単に公開できます。ここでは、Oracle Databaseサンプル・スキーマの一部であるOrder Entry(OE)スキーマの例をあげて説明します。サンプル・スキーマをインストールしていなくても、公開対象となる独自のオブジェクト型がある場合は、ユーザー名、パスワードおよびオブジェクト名を適宜置き換えてください。

OEスキーマのパスワードがOEの場合、SQLオブジェクト型CATEGORY_TYPを公開するには次のコマンドを使用します。%はシステム・プロンプトです。

% jpub -user=OE -sql=CATEGORY_TYP:CategoryTyp
Enter OE password: password

JPublisherの-userオプションは、ユーザー名を指定します。-sqlオプションでは、公開する型を指定します。SQL型とJavaクラスはコロン(:)で区切ります。CATEGORY_TYPはSQL型の名前、CategoryTypは生成対象となる対応するJavaクラスの名前です。

関連項目:
「変換対象のオブジェクト型およびパッケージの宣言」

JPublisherでは、公開対象となるSQL型の名前が標準出力にエコーされます。

OE.CATEGORY_TYP

JPublisherでは、CategoryTyp.javaファイルに加えてCategoryTypeRef.javaファイルも生成されます。これは、OE.CATEGORY_TYPへのSQLオブジェクト参照に対する強い型指定を持つラッパー・クラスです。どちらのファイルも、Javaコンパイラjavacでコンパイルできます。

SQLオブジェクト型(この場合はCUSTOMER_TYP型)を公開する別の例を次に示します。この例では、-user=の短縮形-uと-sql=の短縮形-sを使用します。

% jpub -u OE -s CUSTOMER_TYP:CustomerTyp
Enter OE password: password

オプションの-uと-sに続けて空白を1つ空けて、その後に値を指定します。

JPublisherでは、SQLオブジェクト型のリストがレポートされます。新しいオブジェクト型を検出するたびに、オブジェクトまたはコレクションとしての要素型を持つ属性、オブジェクト参照、コレクションであるかを問わず、その型のラッパー・クラスも自動的に生成されます。OEスキーマのSQLオブジェクト型のリストは、次のとおりです。

OE.CUSTOMER_TYP
OE.CORPORATE_CUSTOMER_TYP
OE.CUST_ADDRESS_TYP
OE.PHONE_LIST_TYP
OE.ORDER_LIST_TYP
OE.ORDER_TYP
OE.ORDER_ITEM_LIST_TYP
OE.ORDER_ITEM_TYP
OE.PRODUCT_INFORMATION_TYP
OE.INVENTORY_LIST_TYP
OE.INVENTORY_TYP
OE.WAREHOUSE_TYP

この例では、オブジェクト型ごとに2つのソース・ファイルが生成されます。1つは、オブジェクト型のインスタンスを表すCustomerTypなどのJavaクラス用で、もう1つは、オブジェクト型の参照を表すCustomerTypeRefなどの参照クラス用です。

JPublisherでデフォルトで使用される命名規則に注意してください。たとえば、OE.PRODUCT_INFORMATION_TYPというSQL型はJavaクラスのProductInformationTypに変換されます。

JPublisherでは埋込み型のラッパー・クラスは自動的に生成されますが、オブジェクト型のサブタイプが自動的に生成されることはありません。この場合は、公開するサブタイプすべてを明示的に列挙する必要があります。CATEGORY_TYP型には、LEAF_CATEGORY_TYP、COMPOSITE_CATEGORY_TYPおよびCATALOG_TYPという3つのサブタイプがあります。このオブジェクト型のサブタイプを公開するためのJPublisherコマンドラインは、次のようになります(ここでは折り返されていますが、1行のコマンドラインです)。

% jpub  -u OE  -s COMPOSITE_CATEGORY_TYP:CompositeCategoryTyp
-s LEAF_CATEGORY_TYP:LeafCategoryTyp,CATALOG_TYP:CatalogTyp
Enter OE password: password

JPublisherでは、次のように、処理された型が出力としてリストされます。

OE.COMPOSITE_CATEGORY_TYP
OE.SUBCATEGORY_REF_LIST_TYP
OE.LEAF_CATEGORY_TYP
OE.CATALOG_TYP
OE.CATEGORY_TYP
OE.PRODUCT_REF_LIST_TYP

次のことに注意してください。

- 複数の型を解析解除する場合は、それぞれカンマで区切って-sqlまたは-sオプションに指定する方法と、コマンドラインに複数の-sqlオプションを指定する方法があります。

- JPublisherでは、すべてのサブタイプのラッパー・クラスが自動的に生成されることはありませんが、すべてのスーパータイプのラッパー・クラスは生成されます。

- CATALOG_TYPなどのメソッドを持つSQLオブジェクトの場合、JPublisherではSQLJクラスを使用してラッパー・メソッドが実装されます。Oracle Database 12cでは、通常のJavaクラスとは異なり、SQLJクラスの使用は下位互換性モードのいずれかを使用しないかぎり参照できません。

注意:
Oracle Database 10gより前のバージョンでは、SQLJクラスの生成により参照可能な.sqljソース・ファイルが作成されます。Oracle Database 10g以降では、JPublisherの-compatibleフラグを値8i、both8i、9iまたはsqljに設定すると、参照可能な.sqljソース・ファイルが生成されます。
この4つのモードのいずれでも、sqljコマンドライン・ユーティリティを使用するかわりに、JPublisherの-sqljオプションを使用して.sqljファイルを変換できます。

JPublisherによって生成されたコードで必要な機能や動作が得られない場合は、生成されたラッパー・クラスを拡張することで、その機能をオーバーライドしたり補完できます。次の例を考えます。

% jpub -u OE -s WAREHOUSE_TYP:JPubWarehouse:MyWarehouse
Enter OE password: password

JPublisherの出力は次のとおりです。

OE.WAREHOUSE_TYP

このコマンドを実行すると、JPublisherではJPubWarehouse.javaとMyWarehouse.javaが生成されます。JPubWarehouse.javaファイルは、このコマンドを実行するたびに生成されます。生成されたMyWarehouse.javaファイルはカスタマイズでき、後でこのコマンドを実行しても上書きされません。また、MyWarehouse.javaに新規メソッドを追加し、JPubWarehouse.javaからのメソッド実装をオーバーライドすることもできます。

JavaでWAREHOUSE_TYPインスタンスの実体化に使用されるクラスは、特殊なMyWarehouseクラスです。オブジェクト型階層のすべての型にユーザー固有のサブクラスが必要な場合は、すべての階層メンバーについて、前述のJPublisherコマンドに示したように、SQL_TYPE:JPubClass:UserClass形式のトリプレットを指定する必要があります。

JPublisherでJavaラッパー・クラスを生成してコンパイルした後は、オブジェクト・ラッパーを直接使用できます。

注意:
前述のOEスキーマの使用例はあくまでも具体例を示すことを目的としており、このスキーマの組立てに関して最新ではない場合があります。

次のSQLJクラスでは、PL/SQLストアド・プロシージャをコールします。register_warehouseがIN OUTパラメータとしてWAREHOUSE_TYPインスタンスを取るものとします。コードのコメントは、対応する#sqlコマンドを示しています。デフォルトでは、SQLJコードは自動的に生成され変換されます。

java.math.BigDecimal location = new java.math.BigDecimal(10);
java.math.BigDecimal warehouseId = new java.math.BigDecimal(10);
MyWarehouse w = new MyWarehouse(warehouseId,"Industrial Park",location);
//  ************************************************************
//  #sql { call register_warehouse(:INOUT w) };
//  ************************************************************
//
// declare temps
oracle.jdbc.OracleCallableStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc =
sqlj.runtime.ref.DefaultContext.getDefaultContext();
if (__sJT_cc==null)
sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec =
((__sJT_cc.getExecutionContext()==null) ?
sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
__sJT_cc.getExecutionContext().getOracleContext());
try
{
String theSqlTS = "BEGIN register_warehouse( :1 ) \n; END;";
__sJT_st = __sJT_ec.prepareOracleCall(__sJT_cc,"0RegisterWarehouse",theSqlTS);
if (__sJT_ec.isNew())
{
__sJT_st.registerOutParameter(1,2002,"OE.WAREHOUSE_TYP");
}
// set IN parameters
if (w==null)
__sJT_st.setNull(1,2002,"OE.WAREHOUSE_TYP");
else __sJT_st.setORAData(1,w);
// execute statement
__sJT_ec.oracleExecuteUpdate();
// retrieve OUT parameters
w = (MyWarehouse)__sJT_st.getORAData(1,MyWarehouse.getORADataFactory());
}
finally
{
__sJT_ec.oracleClose();
}

Java Database Connectivity(JDBC)では、通常、SQL型名と対応するJavaクラスとの関係を接続インスタンス用の型マップに登録します。これは、接続ごとに1回必要です。この型マッピングは、次の例のようにして行うことができます。

java.util.Map typeMap = conn.getTypeMap();
typeMap.put("OE.WAREHOUSE_TYP", MyWarehouse.class);
conn.setTypeMap(typeMap);

次のJDBCコードは、前述のJPublisher出力(変換後のSQLJコード)と同等です。

CallableStatement cs = conn.prepareCall("{call register_warehouse(?)}");
((OracleCallableStatement)cs).registerOutParameter
(1,oracle.jdbc.OracleTypes.STRUCT,"OE.WAREHOUSE_TYP");
cs.setObject(w);
cs.executeUpdate();
w = cs.getObject(1);

関連項目:
「PL/SQLパッケージの公開」

PL/SQLパッケージの公開

SQLオブジェクトをマップするのみではなく、PL/SQLパッケージ全体をJavaクラスとしてカプセル化できます。JPublisherには、PL/SQLパッケージのストアド・プロシージャ用にJavaラッパー・メソッドを作成する機能が用意されています。

ただし、PL/SQLストアド・プロシージャをJavaメソッドとして表すという概念には問題があります。PL/SQLファンクションおよびプロシージャの引数にはPL/SQLのOUTまたはIN OUTモードが使用されている可能性がありますが、Javaに引数を渡す際には等価のモードが存在しません。たとえば、int引数を取るメソッドでは、コール元が新規の値を受け取れるようにこの引数を変更することができません。回避策として、JPublisherではOUT引数とIN OUT引数について単一要素の配列を生成できます。たとえば、整数配列のint[] abcを考えてみます。入力値はabc[0]に指定され、変更後の出力値もabc[0]で戻されます。SQLオブジェクト型のメソッドのコード生成時にも、同様のパターンが使用されます。

注意:
JavaでサポートされないPL/SQL固有の型をストアド・プロシージャで使用する場合は、これらの引数をSQLにマップしてからJavaにマップするための特殊なステップが必要です。

次のコマンドでは、SYS.DBMS_LOBパッケージがJavaに公開されます。

% jpub -u hr -s SYS.DBMS_LOB:DbmsLob
Enter hr password: password

JPublisherの出力は次のとおりです。

SYS.DBMS_LOB

DBMS_LOBはパブリックに参照できるため、HRなどの異なるスキーマからアクセスできます。このJPublisher起動コードでは、PL/SQLパッケージのコールを含むDbmsLob.javaにSQLJクラスが作成されることに注意してください。生成されるJavaメソッドは、実際はインスタンス・メソッドです。これは、JDBC接続またはSQLJ接続コンテキストを使用してパッケージのインスタンスを作成し、そのインスタンス上でメソッドをコールするという考え方です。

関連項目:
「出力パラメータの取扱い」および「PL/SQLデータ型のサポート」

Javaプリミティブ数値型にかわるオブジェクト型の使用

生成されたコードを調べると、JPublisherによって各種メソッドの引数としてjava.lang.Integerが生成されたことがわかります。intなどのJavaプリミティブ型のかわりにIntegerなどのJavaオブジェクト型を使用すると、SQLのNULL値をJavaのnullとして直接表すことができ、JPublisherではこの値がデフォルトで生成されます。ただし、DBMS_LOBパッケージの場合、オブジェクト型Integerではなくintが使用されます。-numbertypesオプションを使用すると、JPublisher起動コードを次のように変更できます。

% jpub -numbertypes=jdbc  -u hr  -s SYS.DBMS_LOB:DbmsLob
Enter hr password: password

JPublisherの出力は次のとおりです。

SYS.DBMS_LOB

関連項目:
「数値型のマッピング」

SQLのトップ・レベルにあるプロシージャのラッパー・クラス

JPublisherでは、SQLのトップ・レベルにあるファンクションとプロシージャのラッパー・クラスも生成できます。次の例のように、特殊パッケージ名TOPLEVELを使用します。

% jpub  -u hr  -s TOPLEVEL:SQLTopLevel
Enter hr password: password

JPublisherの出力は次のとおりです。

HR.top-level_scope

SQLのトップ・レベルの有効範囲にストアド・ファンクションまたはストアド・プロシージャがないと、警告が表示されます。

Oracle Streams AQの公開

JavaクラスとしてのOracle Streamsアドバンスト・キュー(AQ)の公開は、PL/SQLストアド・プロシージャの公開に似ています。JPublisherでは、AQ Java Message Service(JMS)アプリケーション・プログラミング・インタフェース(API)を使用して、キューをJavaプログラムとして公開します。さらに、このJavaプログラムは、Webサービス・アセンブラによりWebサービスに公開できます。次を実行できます。

- Javaクラスとしてのキューの公開

- Javaクラスとしてのトピックの公開

- Javaクラスとしてのストリームの公開

Oracle Streams AQは、キュー、トピックおよびストリームに分類できます。キューは、宣言済のペイロード・タイプを持つ1対1のメッセージ・チャネルです。トピックは、宣言済のペイロード・タイプを持つ1対多のメッセージ・チャネルです。ストリームは、ペイロード・タイプがSYS.ANYDATAのキューまたはトピックです。

キュー、トピックまたはストリームは、次のように-sqlオプションを使用して公開できます。

%jpub -user=hr -sql=AQNAME:javaName
Enter hr password: password

AQNAMEはキュー表、キュー、トピックまたはストリームの名前です。javaNameは対応するJavaクラスの名前です。

Microsoft Windowsの場合は、JPublisherでキューを公開するために、次のJavaアーカイブ(JAR)ファイルをCLASSPATHに追加する必要があります。この2つのファイルは、Oracle Streams AQ用にJPublisherで生成されたコードを実行するために必要になります。

ORACLE_HOME/rdbms/jlib/jmscommon.jar
ORACLE_HOME/rdbms/jlib/aqapi.jar

UNIXシステムの場合は、Oracle Database 12cリリース1に付属のjpubスクリプトにこのJARファイルが含まれています。

Oracle Streams AQに関して、-sqlオプションの使用方法はSQL型およびPL/SQLストアド・プロシージャの場合と同じです。サブクラスとインタフェースを指定できます。SQL型およびPL/SQLパッケージに対して使用できるその他のオプション(-genpattern、-style、-builtintypes、-compatibleなど)も、Oracle Streams AQに対して使用できます。

Javaクラスとしてのキューの公開

キューの公開には、SQL型またはPL/SQLストアド・プロシージャの公開に使用する設定と同じ設定を使用できます。

次のように宣言されているキューtoy_queueを考えてみます。

CREATE TYPE hr.queue_message AS OBJECT (
Subject VARCHAR2(30),
Text VARCHAR2(80)
);
dbms_aqadm.create_queue_table (
Queue_table => 'hr.queue_queue_table',
Queue_payload_type => 'hr.queue_message'
);
dbms_aqadm.create_queue (
queue_name  => 'hr.toy_queue',
queue_table => 'hr.queue_queue_table'
);
dbms_aqadm.start_queue (
queue_name => 'hr.toy_queue'
);

次のコマンドでは、toy_queueがJavaプログラムとして公開されます。

% jpub  -user=hr  -sql=toy_queue:ToyQueue
Enter hr password: password

注意:
キューまたはトピックを作成するときは、ペイロード・タイプとしてSQL型を指定できます。ペイロード・タイプとJMSメッセージ・タイプは相互に変換されます。

このコマンドにより、次のAPIを持つToyQueue.javaが生成されます。

public class ToyQueue
{
public ToyQueue();
public ToyQueue(java.sql.Connection conn);
public ToyQueue(javax.sql.DataSource dataSource);
public void setConnection(java.sql.Connection conn);
public void setDataSource(javax.sql.DataSource ds);
public void addTypeMap(String sqlName, String javaName);
public void send(QueueMessage payload);
public QueueMessage receive();
public QueueMessage receiveNoWait();
public QueueMessage receive(java.lang.String selector, boolean noWait);
}

PL/SQLストアド・プロシージャの場合と同じように、JPublisherでは接続用およびデータ・ソース管理用のAPI(setConnection()やsetDataSource()など)を生成します。addTypeMap()メソッドを使用すると、ペイロード・タイプがSQL型階層の場合に型マッピングを指定できます。send()メソッドは、メッセージをエンキューします。receive()メソッドは、キューからメッセージをデキューします。このメソッドは、デキューするメッセージが使用可能になるまでキューをブロックします。receiveNoWait()メソッドは、メッセージをデキューし、デキュー対象のメッセージがない場合はnullを戻します。ToyQueueクラスの最後のreceive()メソッドは、メッセージをデキューし、セレクタの条件を満たします。セレクタとは、AQ規則に指定されている条件です。たとえば、次のような条件を考えてみます。

priority > 3 and Subject IN ('spider','tank')

この条件により、3より高い優先順位で、かつ、Subject属性としてspiderとtankを含むメッセージが選択されます。

QueueMessageはORADataのサブクラスで、queue_messageペイロード・タイプ用に生成されています。これはキューの公開の結果として公開されるSQL型です。次のクライアント・コード例では、生成されたToyQueueクラスを使用しています。このクライアント・コードはキューにメッセージを送信し、ブロック演算子receive()を使用してデキューし、キュー内のメッセージがすべてデキューされるまで、receiveNoWait()を使用してメッセージをデキューし続けます。

...
ToyQueue q = new ToyQueue(getConnection());
QueueMessage m = new QueueMessage("scooby doo", "lights out");
q.send(m);
System.out.println("Message sent: " + m.getSubject() + " " + m.getText());
m = new QueueMessage("dalmatian", "solve the puzzle");
q.send(m);
System.out.println("Message sent: " + m.getSubject() + " " + m.getText());
m = q.receive();
while (m!=null)
{
System.out.println("Message received: " + m.getSubject() + " " + m.getText());
m = q.receiveNoWait();
}
...

Javaクラスとしてのトピックの公開

次のように宣言されているトピックについて考えてみます。

CREATE TYPE hr.topic_message AS OBJECT (
Subject VARCHAR2(30),
Text VARCHAR2(80)
);
dbms_aqadm.create_queue_table (
Queue_table => 'hr.topic_queue_table',
Multiple_consumers => TRUE,
Queue_payload_type => 'hr.topic_message'
);
dbms_aqadm.create_queue (
queue_name  => 'hr.toy_topic',
queue_table => 'hr.topic_queue_table'
);
dbms_aqadm.start_queue (
queue_name => 'hr.toy_topic'
);

キュー表topic_queue_tableではMultiple_consumersプロパティがTRUEに設定され、このキュー表にはキューではなくトピックが含まれていることを示します。

トピックは次のように公開できます。

% jpub -user=hr -sql=toy_topic:ToyTopic
Enter hr password: password

このコマンドにより、次のAPIを持つToyTopic.javaが生成されます。

public class ToyTopic
{
public ToyTopic(javax.sql.DataSource dataSource);
public void setConnection(java.sql.Connection conn);
public void setDataSource(javax.sql.DataSource ds);
public void addTypeMap(String sqlName,String javaName);
public void publish(TopicMessage payload);
public void publish(TopicMessage payload, java.lang.String[] recipients);
public void publish(TopicMessage payload, int deliveryMode, int priority,
long timeToLive);
public void subscribe(java.lang.String subscriber);
public void unsubscribe(java.lang.String subscriber);
public TopicMessage receiveNoWait(java.lang.String receiver);
public TopicMessage receive(java.lang.String receiver);
public TopicMessage receive(java.lang.String receiver,
java.lang.String selector);
}

publishメソッドは、全サブスクライバ宛またはサブスクライバ・リスト宛のメッセージをエンキューします。deleveryModeパラメータは値javax.jms.DeliveryMode.PERSISTENTまたはjavax.jms.DeliveryMode.NON_PERSISTENTを取ります。ただし、Oracle Database 10gリリース2 (10.2)でサポートされているのはDeliveryMode.PERSISTENTのみです。priorityパラメータは、メッセージの優先順位を指定します。timeToLiveパラメータは、メッセージがタイムアウトになるまでの経過時間(ミリ秒)を指定します。値0を指定すると、メッセージがタイムアウトしないことを示します。receiveメソッドは指定された受信者宛のメッセージをデキューします。次のクライアント・コード例では、生成されたToyTopicクラスを使用しています。クライアントは2つの受信者(ToyPartyとToyFactory)にメッセージを送信し、トピックをそれぞれToyParty、ToyLandおよびToyFactoryとしてデキューします。

...
ToyTopic topic = new ToyTopic(getConnection());
TopicMessage m = new TopicMessage("scooby doo", "lights out");

topic.publish(m, new String[]{"ToyParty", "ToyFactory"});
System.out.println("Message broadcasted: " + m.getSubject() + " " + m.getText());
m = new TopicMessage("dalmatian", "solve the puzzle");
topic.publish(m, new String[]{"ToyParty", "ToyLand"});
System.out.println("Message broadcasted: " + m.getSubject() + " " + m.getText());

m = topic.receive("ToyParty");
System.out.println("ToyParty receive " + m.getSubject() + " " + m.getText());
m = topic.receive("ToyParty");
System.out.println("ToyParty receive " + m.getSubject() + " " + m.getText());

m = topic.receiveNoWait("ToyLand");
System.out.println("ToyFactory receive " + m.getSubject() + " " + m.getText());
m = topic.receiveNoWait("ToyFactory");
System.out.println("ToyFactory receive " + m.getSubject() + " " + m.getText());
m = topic.receiveNoWait("ToyFactory");
...

Javaクラスとしてのストリームの公開

ストリームは特殊なAQです。ペイロード・タイプとして持つことができるのはSYS.ANYDATAのみです。制限事項として、JPublisherで生成されたストリーム用のコードにはJDBC Oracle Call Interface (OCI)ドライバが必要です。ただし、キューやトピック用に生成されたコードは、JDBC ThinドライバとJDBC OCIドライバの両方で実行できます。

ストリームの公開はAQの公開と似ています。次のコマンドでは、toy_streamストリームが公開されます。

% jpub  -user=hr  -sql=toy_stream:ToyStream
Enter hr password: password

このコマンドにより、ToyStream.javaファイルが生成されます。

ストリームの公開とAQまたはトピックの公開との違いは、ストリームを公開するときはペイロード・タイプが常にSYS.ANYDATAで、これはjava.lang.Objectにマップされるということです。

ToyStream.javaファイルには次のAPIが含まれています。

public class ToyStream
{
public ToyStream();
public ToyStream(java.sql.Connection conn);
public ToyStream(javax.sql.DataSource dataSource);
public void setConnection(java.sql.Connection conn);
public void setDataSource(javax.sql.DataSource ds);
public void addTypeMap(String sqlName, String javaName);
public void publish(Object payload);
public void publish(Object payload, java.lang.String[] recipients);
public void publish(Object payload, int deliveryMode,
int priority, long timeToLive);
public void subscribe(java.lang.String subscriber);
public void unsubscribe(java.lang.String subscriber);
public Object receiveNoWait(java.lang.String receiver);
public Object receive(java.lang.String receiver);
public Object receive(java.lang.String receiver, java.lang.String selector);
public Object receive(java.lang.String receiver, java.lang.String selector,
long timeout);
}

生成されたToyStreamクラスを使用するコード例を次に示します。

...
System.out.println("*** testStream with an OCI connection");
Object response = null;
ToyStream stream = new ToyStream(getOCIConnection());

stream.publish("Seaside news", new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish(new Integer(333), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish(new Float(3.33), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish("Science Monitor".getBytes(), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + new String((byte[])response));

stream.publish(new String[]{"gamma", "beta"}, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + ((String[]) response)[0]);

HashMap map = new HashMap();
map.put("US", "dollar");
map.put("Japan", "yen");
map.put("Austrilia", "dollar");
map.put("Britian", "pound");
stream.publish(map, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
map = (HashMap) response;
System.out.println("Message received: " + map.get("Britian") + ", " + map.get("US") + ", " + map.get("Austrilia"));

stream.addTypeMap("HR.QUEUE_MESSAGE", "queue.wrapper.simple.QueueMessage");
stream.addTypeMap("QUEUE_MESSAGE", "queue.wrapper.simple.QueueMessage");
QueueMessage m = new QueueMessage("Knowing", "world currency");
stream.publish(m, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println(response);
m = (QueueMessage) response;
System.out.println("Message received: " + m.getSubject() + " " + m.getText());
...

このコード例は、String、Integerおよびjava.util.Mapなどの様々な型のメッセージを送信します。JDBCカスタム型QueueMessageに関して、addTypeMap()メソッドがコールされて、SQL型からJavaへの型マッピングが指定されます。

ネイティブJavaインタフェースを介したサーバー・サイドJavaクラスの公開

Oracle Database 10gより前のリリースでは、データベース・クライアントからJavaストアド・プロシージャおよびファンクションをコールするには、関連するPL/SQLラッパーへのJDBCコールが必要でした。各PL/SQLラッパーは、SQLシグネチャとJava実装を使用して手動で公開する必要がありました。このプロセスには、次のデメリットがありました。

- シグネチャに使用できるのは、SQLに直接の等価型を持つJava型のみでした。

- Javaで発行された例外は正しく戻されませんでした。

Oracle Database 10gから、サーバー側JavaコードをコールするためのネイティブJavaインタフェース機能を使用できます。JPublisherの-javaオプションは、これらのデメリットを克服する機能を提供します。

関連するPL/SQLラッパーへのJDBCコールの問題を解消するために、-javaオプションを指定することで、Javaの静的メソッドを直接コールするAPIを使用できます。この機能はWebサービスにも有効です。

-javaオプションの機能は、-sqlオプションの機能をミラー化したもので、サーバー・サイドJavaクラスにアクセスするクライアント・サイドJavaスタブ・クラスを作成します。これは、サーバー・サイドSQLオブジェクトまたはPL/SQLパッケージにアクセスするクライアント・サイドJavaクラスの作成とは対照的です。クライアント・サイド・スタブ・クラスでは、サーバー・サイド・クラスをミラー化するSQLコードが使用され、次の機能が含まれます。

- サーバー・クラスのパブリック・メソッド、静的メソッドに対応するメソッド。

- 2つのコンストラクタ。一方はJDBC接続を使用し、他方はSQLJのデフォルト接続コンテキスト・インスタンスを使用します。

実行時には、スタブ・クラスがJDBC接続を使用してインスタンス化されます。そのメソッドをコールすると、サーバー・サイド・クラスの対応するメソッドがコールされます。このようにして公開されたメソッドに使用されるJava型は、プリミティブであるか、またはシリアライズ可能である必要があります。

次のように、-javaオプションを使用してサーバー・サイドJavaクラスを公開できます。

-java=className

次のAPIを持つoracle.sqlj.checker.JdbcVersionサーバー・サイドJavaクラスについて考えてみます。

public class oracle.sqlj.checker.JdbcVersion
{
public oracle.sqlj.checker.JdbcVersion();
public static int getDriverMajorVersion();
public static int getDriverMinorVersion();
public static java.lang.String getDriverName();
public static java.lang.String getDriverVersion();
public static java.lang.String getJdbcLibraryName();
public static java.lang.String getRecommendedRuntimeZip();
public static java.lang.String getRuntimeVersion();
public static java.lang.String getSqljLibraryName();
public static boolean hasNewStatementCache();
public static boolean hasOracleContextIsNew();
public static boolean hasOracleSavepoint();
public static void main(java.lang.String[]);
public java.lang.String toString();
public static java.lang.String to_string();
}

たとえば、サーバー上の次のメソッドをコールする必要があるとします。

public String oracle.sqlj.checker.JdbcVersion.to_string();

次のコマンドを使用して、クライアント・サイド起動用のJdbcVersionを公開します。

% jpub -sql=hr -java=oracle.sqlj.checker.JdbcVersion:JdbcVersionClient
Enter hr password: password

このコマンドにより、次のAPIを含むクライアント・サイドJavaクラスJdbcVersionClientが生成されます。

public class JdbcVersionClient
{
public long newInstance();
public JdbcVersionClient();
public JdbcVersionClient(java.sql.Connection conn);
public JdbcVersionClient(sqlj.runtime.ref.DefaultContext ctx);
public java.lang.String toString(long _handle);
public int getDriverMajorVersion();
public int getDriverMinorVersion();
public java.lang.String getDriverName();
public java.lang.String getDriverVersion();
public java.lang.String getJdbcLibraryName();
public java.lang.String getRecommendedRuntimeZip();
public java.lang.String getRuntimeVersion();
public java.lang.String getSqljLibraryName();
public boolean hasNewStatementCache();
public boolean hasOracleContextIsNew();
public boolean hasOracleSavepoint();
public void main(java.lang.String[] p0);
public java.lang.String to_string();
}

oracle.sqlj.checker.JdbcVersionとJdbcVersionClientを比較してみます。クライアント・サイド・コードでは、すべての静的メソッドがインスタンス・メソッドにマップされます。サーバー・サイド・クラスのインスタンス・メソッド(たとえば、toString())は、追加のハンドルを使用してメソッドにマップされます。ハンドルは、サーバーでのoracle.sqlj.checker.JdbcVersionのインスタンスを表します。ハンドルは、サーバー・サイドのインスタンス・メソッドのコールに使用されます。JdbcVersionClientの追加メソッドはnewInstance()で、これはサーバー内にoracle.sqlj.checker.JdbcVersionの新規インスタンスを作成し、そのハンドルを戻します。

サーバー・サイドJavaクラスの公開には、次のような制約があります。

- インスタンス・メソッドを公開できるのは、公開対象のクラスに空のpublicコンストラクタがある場合のみです。

- サポートされるのは、シリアライズ可能なパラメータと戻り型のみです。シリアライズ可能でない型を使用するメソッドは、公開されません。

- Oracle Database 12cまたはOracle Database 10gが必要です。

Oracle Database 12cリリース1(12.1.0.2)以降、-java機能では次の修復手順が必要です。

サーバー側のJavaクラスが存在するユーザー・スキーマにsqljutl.jarおよびsqljutls.sqlをロードします。

% loadjava -u scott/tiger -r -v -f sqlj/lib/sqljutl.jar
% sqlplus scott/tiger @jpub/sql/sqljutl2.sql

関連項目:
「公開対象のサーバー・サイドJavaクラスの宣言」

PL/SQLラッパーを介したサーバー・サイドJavaクラスの公開

Oracle Database 10gリリース2 (10.2)以降では、JPublisherはサーバー・サイドJavaクラスの公開に対して新しいアプローチを提供します。これは、サーバー・サイドJavaをコールするために次のものを生成します。

- サーバー・サイド・クラスのためのJavaストアド・プロシージャ・ラッパー

- Javaストアド・プロシージャ・ラッパーのためのPL/SQLラッパー

- PL/SQLラッパーをコールするクライアント・サイドJavaコード

Javaストアド・プロシージャはサーバー・サイドJavaコードをラップしますが、これにより、次のことが行われます。

- インスタンス・メソッドを静的メソッドにラップします。サーバー・サイドJavaコード内の各メソッドが、静的メソッドによりラップされます。インスタンス・メソッドは、単一インスタンス形式または複数インスタンス形式でマップできます。

- Java型をPL/SQLコール仕様に公開可能な型に変換します。たとえば、Java型byte[]はoracle.sql.BLOBに変換されます。

PL/SQLラッパーはJavaストアド・プロシージャをコールします。クライアント・サイドJavaコードは、JDBCコールを介してPL/SQLラッパーをコールします。-javaオプションでは、公開対象のクラスがすでにデータベースにロードされていることが前提です。

サポートされているJava型は次のとおりです。

- JDBCでサポートされている型

- Java Beans

- サポートされている型の配列

- シリアライズ可能な型

サーバー・サイド・クラスを公開するには、次のように、-dbjavaオプションを使用します。

-dbjava=server-sideClassName:client-sideClassName

client-sideClassName設定を指定する必要があります。指定しないと、JPublisherでクライアント・サイドJavaクラスが生成されません。oracle.sqlj.checker.JdbcVersionを公開するには、次のコマンドを使用します。

% jpub -user=hr -dbjava=oracle.sqlj.checker.JdbcVersion:JdbcVersionClient
Enter hr password: password

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

oracle/sqlj/checker/JdbcVersionJPub.java
plsql_wrapper.sql
plsql_dropper.sql
HR.JPUBTBL_VARCHAR2
HR.JPUB_PLSQL_WRAPPER
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading JdbcVersionJPub.java

このコマンドにより、Javaストアド・プロシージャJdbcVersionJPub、PL/SQLラッパー、およびクライアント・サイドのJdbcVersionClientクラスが生成されます。JdbcVersionJPub.javaおよびplsql_wrapper.sqlは、データベースに自動的にロードされます。JdbcVersionClientには次のAPIが含まれます。

public class JdbcVersionClient
{
public JdbcVersionClient();
public JdbcVersionClient(java.sql.Connection conn);
public void setConnection(java.sql.Connection conn);
public void setDataSource(javax.sql.DataSource ds);
public String toString0();
public java.math.BigDecimal getDriverMajorVersion();
public java.math.BigDecimal getDriverMinorVersion();
public String getDriverName();
public String getDriverVersion();
public String getJdbcLibraryName();
public String getRecommendedRuntimeZip();
public String getRuntimeVersion();
public String getSqljLibraryName();
public java.math.BigDecimal hasNewStatementCache();
public java.math.BigDecimal hasOracleContextIsNew();
public java.math.BigDecimal hasOracleSavepoint();
public void main0(JpubtblVarchar2 arg0);
public String to_string();
}

JdbcVersionとJdbcVersionClientを比較してみます。JPublisherで生成されたコードの制限を示しています。生成されたクライアント・サイドAPIは、元のサーバー・サイドAPIとまったく同じではありません。この制限をわかりやすく示すために、JdbcVersionとJdbcVersionClientとの違いをいくつか次にリストします。

- クライアント・サイドのメソッドではJDBC接続の実行が必要であるため、静的メソッドはすべてインスタンス・メソッドにマップされます。

- クライアント・サイドのメソッドでは常にjava.sql.SQLExceptionがスローされますが、サーバー・サイドのクラスによりスローされる例外は、SQLExceptionでラップされてクライアントに渡されます。

- toString()メソッドの名前はtoString0()に変更されます。これはストアド・プロシージャ・ラッパーに起因する制限です。ここでは、java.lang.Objectメソッドを上書きするメソッドは、競合を避けるために名前を変更する必要があります。

- パラメータ型と戻り型が異なる可能性があります。サーバー・サイドの数値型はjava.math.BigDecimalにマップされます。String[]などの配列型は、JDBCカスタム型にマップされます。たとえば、main()のパラメータはORADataのサブクラスであるJpubtblVarchar2にマップされます。これは、文字列の配列を表すためにJPublisherのコマンドにより生成されます

- サーバー・サイドJavaクラスのmain()メソッドは、Javaストアド・プロシージャの制限により、main0()に変更されます。

-javaと比較すると、-dbjavaの長所は、サポートされる型の数が多いことと、Oracle Database 10gよりも前のバージョンで機能することです。ただし、短所は、実行時にPL/SQLおよびJavaストアド・プロシージャで追加のレイヤーが使用されることと、クライアント・サイドJavaクラスでメソッド・シグネチャが変更される可能性が高くなることです。

Oracle Database 12cリリース1(12.1.0.2)以降、-dbjava機能では次の準備手順が必要です。

サーバー側のJavaクラスが存在するユーザー・スキーマにsqljutl.jarおよびsqljutls.sqlをロードします。

% loadjava -u scott/tiger -r -v -f sqlj/lib/sqljutl.jar
% sqlplus scott/tiger @jpub/sql/sqljutl2.sql

PL/SQLへのサーバー・サイドJavaクラスの公開

JPublisherでは、サーバー・サイドJavaクラス用のPL/SQLラッパーを生成できます。JavaクラスはPL/SQLパッケージにマップされます。それぞれのPL/SQLメソッドがJavaメソッドに対応します。この機能により、PL/SQLコール仕様を作成する必要と、コール仕様で使用されるSQL型を作成する必要がなくなります。

次のように、-dbjavaオプションを使用すると、サーバー・サイドJavaクラス用のPL/SQLラッパーを生成できます。

-dbjava=server-sideJavaClass

server-sideJavaClassの後に名前を指定しないでください。指定すると、JPublisherでサーバー・サイドJavaクラスがクライアント・サイドJavaクラスにマップされます。

関連項目:
「PL/SQLラッパーを介したサーバー・サイドJavaクラスの公開」

例として、次のコマンドを使用してoracle.sqlj.checker.JdbcVersionのためのPL/SQLラッパーを生成します。

% java -dbjava=oracle.sqlj.checker.JdbcVersion

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

oracle/sqlj/checker/JdbcVersionJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading JdbcVersionJPub.java

このコマンドは、Javaストアド・プロシージャのラッパーJdbcVersionJPub.javaとそのPL/SQLラッパーplsql_wrapper.sqlを生成してロードします。これは、パッケージJPUB_PLSQL_WRAPPERを宣言します。JPUB_PLSQL_WRAPPERパッケージを使用すると、oracle.sqlj.checker.JdbcVersionのメソッドをコールできます。

-dbjavaと一緒に-plsqlfileおよび-plsqlpackageを指定することがよくあります。次のコマンドを考えてみます。

% java -dbjava=oracle.sqlj.checker.JdbcVersion -plsqlfile=jdbcversion.sql -plsqlpackage=jdbcversion

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

oracle/sqlj/checker/JdbcVersionJPub.java
jdbcversion.sql
jdbcversion_dropper.sql
Executing jdbcversion_dropper.sql
Executing jdbcversion.sql
Loading JdbcVersionJPub.java

このコマンドにより、PL/SQLパッケージjdbcversionをoracle.sqlj.checker.JdbcVersionのラッパーとして宣言するjdbcversion.sqlが生成されます。このパッケージは次のように宣言されます。

CREATE OR REPLACE PACKAGE jdbcversion AS
FUNCTION toString0 RETURN VARCHAR2;
FUNCTION getDriverMajorVersion RETURN NUMBER;
FUNCTION getDriverMinorVersion RETURN NUMBER;
FUNCTION getDriverName RETURN VARCHAR2;
FUNCTION getDriverVersion RETURN VARCHAR2;
FUNCTION getJdbcLibraryName RETURN VARCHAR2;
FUNCTION getRecommendedRuntimeZip RETURN VARCHAR2;
FUNCTION getRuntimeVersion RETURN VARCHAR2;
FUNCTION getSqljLibraryName RETURN VARCHAR2;
FUNCTION hasNewStatementCache RETURN NUMBER;
FUNCTION hasOracleContextIsNew RETURN NUMBER;
FUNCTION hasOracleSavepoint RETURN NUMBER;
PROCEDURE main0(arg0 JPUBTBL_VARCHAR2);
FUNCTION to_string RETURN VARCHAR2;
END jdbcversion;

Javaストアド・プロシージャの制限により、メソッドtoString()およびmain()がtoString0()およびmain0()に変更されることに注意してください。

jdbcversionパッケージ内のPL/SQLストアド・プロシージャは、次のように実行できます。

SQL> SELECT jdbcversion.toString0 FROM DUAL;

TOSTRING0
--------------------------------------------------------------------------------
Oracle JDBC driver version 10.2 (10.2.0.0.0)
SQLJ runtime: Oracle 9.2.0 for JDBC SERVER/JDK 1.2.x - Built on Oct 10, 2004

-dbjavaコマンドは、静的メソッドとインスタンス・メソッドの両方を公開します。静的メソッドのみを公開する場合は、次の設定を使用します。

-proxyopts=static

サーバー・サイド・クラスに空のpublicコンストラクタがある場合は、そのインスタンス・メソッドを公開できます。インスタンス・メソッドをコールする方法は2通りあります。サーバー内でデフォルトの単一インスタンスを介する方法と、個別のインスタンスを介する方法です。次のオプションにより、サーバー内でのインスタンス・メソッドのコールに使用される方法が決定されます。

-proxyopts=single|multiple

デフォルト設定は次のとおりです。

-proxyopts=single

前述のSQL文は、単一インスタンスを使用してtoString0()メソッドをコールしています。

次のように、oracle.sqlj.checker.JdbcVersionは、-proxyopts=multipleを使用して公開できます。

% jpub -user=hr -dbjava=oracle.sqlj.checker.JdbcVersion -plsqlfile=jdbcversion.sql -plsqlpackage=jdbcversion
-proxyopts=multiple
Enter hr password: password

このコマンドはPL/SQLパッケージjdbcversionを生成しますが、次のメソッドでは前述の例とは異なるメソッドを使用します。

CREATE OR REPLACE PACKAGE jdbcversion AS
FUNCTION toString0(handleJdbcVersion NUMBER) RETURN VARCHAR2;
...
FUNCTION newJdbcVersion RETURN NUMBER;
END jdbcversion;

Oracle Database 10gリリース2からは、追加のメソッドnewJdbcVersion()が作成されています。このメソッドを使用してインスタンスを作成し、そのインスタンスを使用してtoString0()メソッドをコールできます。SQL*Plusで次のスクリプトを実行します。

set serveroutput on
DECLARE
text varchar2(1000);
inst number;
BEGIN
inst := jdbcversion.newJdbcVersion;
text := jdbcversion.toString0(inst);
dbms_output.put_line(text);
END;
/

このスクリプトにより、次が戻されます。

Oracle JDBC driver version 10.2 (10.2.0.0.0)
SQLJ runtime: Oracle 9.2.0 for JDBC
SERVER/JDK 1.2.x - Built on Oct 10, 2004

PL/SQL procedure successfully completed.

次のパラメータ型と戻り型がサポートされます。

- JDBCでサポートされている型

- Java Beans

- サポートされている型の配列

Java BeansはJavaストアド・プロシージャ・レイヤーでは汎用JDBC structクラスのoracle.sql.STRUCTにマップされ、PL/SQLレイヤーではSQLオブジェクト型とSQL表の型にマップされます。次のオプションにより、配列パラメータの処理方法が決定されます。

-proxyopts=arrayin|arrayout|arrayinout|arrayall

デフォルト設定は次のとおりです。

-proxyopts=arrayin

-proxyopts=arrayallを指定すると、配列パラメータを含むメソッドは3つのPL/SQLメソッドにマップされます。たとえば、foo(int[])メソッドについて考えてみます。このメソッドは、次のメソッドにマップされます。

PROCEDURE foo(n NUMBERTBL);
PRECEDURE foo_o(n IN NUMBER);
PROCEDURE foo_io(n IN OUT NUMBER);

最初のメソッドでは配列引数を入力として扱い、2番目のメソッドでは配列を出力値のホルダーとして扱い、3番目のメソッドでは配列を出力値と入力値の両方用のホルダーとして扱います。-proxyopts=arrayin(デフォルト設定)の場合、foo(int[])メソッドは最初のメソッドにマップされます。-proxyopts=arrayoutの場合、foo(int[])メソッドは2番目のメソッドにマップされます。-proxyopts=arrayinoutの場合、foo(int[])メソッドは3番目のメソッドにマップされます。

ここで、2つのクラスを使用する複雑な例について考えてみます。Addクラスでは、メソッド内でTotalおよび配列を使用します。TotalはJava Beanで、このため、サーバー・サイド・クラスの公開によりサポートされています。2つのクラスは次のように定義されています。

public class Add
{
public static int add(int i, int j)
{
i = i + j;
return i;
}
public int add(Total arg)
{
total = total + arg.getTotal();
return total;
}
}

public class Total
{
public void setTotal(int total)
{
this.total = total;
}
public int getTotal()
{
return total;
}
private int total;
}

2つのクラスを次のようにデータベースにロードします。

% loadjava -u hr -r -v -f Add.java Total.java
Password: password

次のコマンドを使用してJPublisherを実行します。

% jpub -user=hr -dbjava=Add  -proxyopts=arrayall

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

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading AddJPub.java

生成されたPL/SQLラッパーplsql_wrapper.sqlには、次の宣言が含まれます。

CREATE OR REPLACE TYPE JPUBOBJ_Total AS OBJECT (total_ NUMBER);
CREATE OR REPLACE TYPE JPUBTBL_NUMBER AS TABLE OF NUMBER;
CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
FUNCTION add(arg0  JPUBOBJ_Total) RETURN NUMBER;
FUNCTION add_io(arg0  JPUBOBJ_Total) RETURN NUMBER;
FUNCTION add(arg0  JPUBTBL_NUMBER,arg1  JPUBTBL_NUMBER) RETURN JPUBTBL_NUMBER;
FUNCTION add_o(arg0 OUT  NUMBER,arg1 OUT  NUMBER) RETURN JPUBTBL_NUMBER;
FUNCTION add_io(arg0 IN OUT  NUMBER,arg1 IN OUT NUMBER) RETURN JPUBTBL_NUMBER;
END JPUB_PLSQL_WRAPPER;

次のSQLスクリプトをSQL*Plusで実行するときに、生成されたPL/SQLラッパーが使用されます。

SQL> set serveroutput on
SQL>
DECLARE
totalx JPUBOBJ_Total;
n NUMBER;
n1 NUMBER;
n2 NUMBER;
add1 JPUBTBL_NUMBER;
add2 JPUBTBL_NUMBER;
add3 JPUBTBL_NUMBER;
BEGIN
totalx := JPUBOBJ_Total(2004);
n := JPUB_PLSQL_WRAPPER.add(totalx);
n := JPUB_PLSQL_WRAPPER.add(totalx);
DBMS_OUTPUT.PUT('total ');
DBMS_OUTPUT.PUT_LINE(n);

add1 := JPUBTBL_NUMBER(10, 20);
add2 := JPUBTBL_NUMBER(100, 200);
add3 := JPUB_PLSQL_WRAPPER.add(add1, add2);
DBMS_OUTPUT.PUT('add ');
DBMS_OUTPUT.PUT(add3(1));
DBMS_OUTPUT.PUT(' ');
DBMS_OUTPUT.PUT_LINE(add3(2));

n1 := 99;
n2 := 199;
add3 := JPUB_PLSQL_WRAPPER.add_io(n1, n2);
DBMS_OUTPUT.PUT('add_io ');
DBMS_OUTPUT.PUT_LINE(n1);
END;
/

このスクリプトにより、次の出力が生成されます。

total 4008
add 110 220
add_io 298
PL/SQL procedure successfully completed.

-dbjavaオプションでは、公開対象のクラスがすでにデータベースに存在することが前提です。かわりに-proxyclassesオプションを使用することもできます。この場合は、公開対象のクラスがCLASSPATHに指定されている必要があります。Add.javaとTotal.javaをコンパイルし、AddとTotalをCLASSPATHに含めます。-dbjavaオプションのかわりに、次のコマンドを使用してAddを公開できます。

% jpub -proxyclasses=Add

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

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql

-proxyclassesオプションにより、生成されたPL/SQLラッパーがロードされます。ただし、生成されたJavaストアド・プロシージャAddJPub.javaはロードされません。これは、このプロシージャでは、公開済のクラスがサーバー上に存在することが必要になるためです。Javaストアド・プロシージャは公開済のクラスとともにロードする必要があります。

たとえば、UNIXシステムの場合は、次のコマンドを使用すると、Add.java、Total.javaおよびAddJPub.javaをロードできます。

% loadjava -u hr -r -v -f Add.java Total.java AddJPub.java
Password: password

Add.java、Total.javaおよびAddJPub.javaがロードされたら、PL/SQLラッパーを使用できます。

Oracle Database 12cリリース1(12.1.0.2)以降、-proxyclasses機能および-java機能では次の準備手順が必要です。

サーバー側のJavaクラスが存在するユーザー・スキーマにsqljutl.jarおよびsqljutls.sqlをロードします。

% loadjava -u scott/tiger -r -v -f sqljutl.jar
% sqlplus scott/tiger @jpub/sql/sqljutl2.sql

PL/SQLへのJavaの公開に使用するメカニズム

JPublisherでは、PL/SQLラッパー(PL/SQLコール仕様とも呼ばれる)を生成することで、サーバー・サイドJavaクラスへの容易なアクセスをサポートしています。PL/SQLラッパーは、1つ以上の指定のJavaクラスのメソッドをコールできるPL/SQLパッケージです。

関連項目:
PL/SQLラッパーの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

PL/SQLでは、静的メソッドのみがサポートされます。静的メソッドのみを含むJavaクラスまたは静的メソッドのみを公開するJavaクラスは、簡単にラップできます。ただし、公開対象のインスタンス・メソッドを含むJavaクラスの場合は、インスタンス・メソッドをPL/SQL用の静的メソッドとして公開するために中間的なラッパー・クラスが必要です。

また、ラップするJavaクラスのメソッド・コール順序にJavaプリミティブ型以外が使用されている場合も、ラッパー・クラスが必要になります。

ラップするクラスのインスタンス・メソッドの場合、JPublisherではラッパー・クラスに次の一方または両方のメカニズムを使用できます。

- ラップされる各クラスをシングルトンとして扱うことができます。これは、1つのデフォルト・インスタンスが使用されることを意味します。このインスタンスは、メソッドが初めてコールされるときに作成され、以降のメソッド・コールごとに再利用されます。ハンドルは不要であり、使用されません。このメカニズムをシングルトン・メカニズムと呼び、これは、JPublisherがWebサービスのクライアント・プロキシ・クラスのラッパー・クラスを提供する場合のデフォルト動作です。
デフォルト・インスタンスへの参照を削除してガベージを収集できるように、releaseXXX()メソッドが用意されています。

- ラップされるクラスのインスタンスは、ハンドル(ID番号とも呼ばれる)を介して識別できます。JPublisherでは、ハンドルとしてlong型の数値を使用し、ラッパー・クラス内に静的メソッドを作成します。これらのメソッドのメソッド・シグネチャは、メソッドの起動対象であるインスタンスのハンドルを含めるように変更されます。これにより、PL/SQLラッパーではラップされたクラスのインスタンスにアクセスするときにハンドルを使用できます。この使用例では、ラップされる各クラスのインスタンスを作成してハンドルを取得する必要があります。その後は、以降のインスタンス・メソッドのコールごとにハンドルを提供します。このメカニズムをハンドル・メカニズムと呼びます。
指定したハンドルに従って個々のインスタンスを解放できるように、releaseXXX(long)メソッドが用意されています。既存のインスタンスをすべて解放する場合に備えて、releaseAllXXX()メソッドも用意されています。

テーブル・ファンクションへのサーバー・サイドJavaクラスの公開

-dbjavaオプションにより、生成されたPL/SQLラッパーからテーブル・ファンクションを生成できます。テーブル・ファンクションを使用するのは、ストアド・ファンクションの戻り値やストアド・プロシージャの出力値ではなく、データベース表を介してデータを公開する場合です。テーブル・ファンクションはデータベース表を戻します。

関連項目:
テーブル・ファンクションの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

特定のメソッド用に生成されるテーブル・ファンクションは、次の条件を満たしている必要があります。

- インスタンス・メソッドをラップする場合は、シングルトン・メカニズムを有効化する必要があります。これは、-dbjavaおよび-proxyclassesのデフォルト設定です。

- ラップされるWebサービス・メソッドは、OUT引数を取るストアド・プロシージャ、またはストアド・ファンクションに対応する必要があります。

JPublisherで-proxyopts=tabfun設定を-dbjavaまたは-proxyclassesオプションと併用すると、生成されたPL/SQLラッパー内の各PL/SQLファンクションにテーブル・ファンクションを1つずつ作成するように要求されます。前述のAddクラスの例を考えてみます。次のコマンドを実行します。

% jpub -user=hr -dbjava=Add  -proxyopts=arrayall,tabfun
Enter hr password: password

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

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading AddJPub.java

このコマンドは、前述の例で生成されたPL/SQLメソッドに加えて次のテーブル・ファンクションを生成します。

CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
FUNCTION add(arg0 JPUBOBJ_Total) RETURN NUMBER;
FUNCTION TO_TABLE_add(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_JPUBOBJ_Total PIPELINED;
FUNCTION add(arg0 JPUBTBL_NUMBER,arg1  JPUBTBL_NUMBER) RETURN JPUBTBL_NUMBER;
FUNCTION TO_TABLE_add0(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_JPUBTBL_NUMBER PIPELINED;
FUNCTION add_o(arg0 OUT NUMBER, arg1 OUT NUMBER) RETURN JPUBTBL_NUMBER;
FUNCTION TO_TABLE_add_o(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_o_JPUBTBL_NUMBER PIPELINED;
FUNCTION add_io(arg0 IN OUT NUMBER, arg1 IN OUT NUMBER) RETURN JPUBTBL_NUMBER;
FUNCTION TO_TABLE_add_io(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_io_JPUBTBL_NUMB PIPELINED;
END JPUB_PLSQL_WRAPPER;
/

テーブル・ファンクションでは、グラフという用語が使用されます。この使用方法の場合、グラフとは、テーブル・ファンクションから戻されるデータベース表のスキーマを定義するSQLオブジェクトです。機能には、グラフ・オブジェクト、グラフ・オブジェクトの表、グラフ・オブジェクトの表を戻すテーブル・ファンクションという3つのレベルがあります。グラフ・オブジェクトの表には、ファンクションへの入力と、そのファンクションからの出力が含まれます。

例として、plsql_wrapper.sqlの次の宣言を考えてみます。ここでは、GRAPH_add_io_JPUBTBL_NUMBER_Jグラフ・オブジェクトとグラフ・オブジェクトのGRAPH_TAB_add_io_JPUBTBL_NUMB表が定義されています。次の2つの型がTO_TABLE_add_ioテーブル・ファンクション用に生成されます。

CREATE OR REPLACE TYPE GRAPH_add_io_JPUBTBL_NUMBER_J AS OBJECT(arg0 NUMBER,
arg1 NUMBER, arg0_out NUMBER, arg1_out NUMBER, res JPUBTBL_NUMBER);
/

CREATE OR REPLACE TYPE GRAPH_TAB_add_io_JPUBTBL_NUMB AS TABLE OF GRAPH_add_io_JPUBTBL_NUMBER_J;
/

テーブル・ファンクションが常にREF CURSORを入力として取ることにも注意してください。TO_TABLE_add_ioテーブル・ファンクションでは、REF CURSORによりarg0およびarg1という2つの引数が想定されます。このテーブル・ファンクションは、GRAPH_TAB_add_io_JPUBTBL_NUMBのインスタンスを戻します。

次のSQLスクリプトを実行します。

SQL> CREATE TABLE tabfun_input(arg0 NUMBER, arg1 NUMBER);
SQL> BEGIN
INSERT INTO tabfun_input VALUES(97, 106);
INSERT INTO tabfun_input VALUES(67, 3);
INSERT INTO tabfun_input VALUES(19, 23);
INSERT INTO tabfun_input VALUES(98, 271);
INSERT INTO tabfun_input VALUES(83, 281);
END;
/

SQL>  SELECT * FROM TABLE(JPUB_PLSQL_WRAPPER.TO_TABLE_add_io(CURSOR(SELECT * FROM tabfun_input)));

この問合せはTO_TABLE_add_ioをコールし、このテーブル・ファンクションの入力と出力が表示されます。

ARG0     ARG1 ARG0_OUT ARG1_OUT RES
-------- -------- -------- -------- -------------------------
97      106      203      106 JPUBTBL_NUMBER(203)
67        3       70        3 JPUBTBL_NUMBER(70)
19       23       42       23 JPUBTBL_NUMBER(42)
98      271      369      271 JPUBTBL_NUMBER(369)
83      281      364      281 JPUBTBL_NUMBER(364)

PL/SQLへのWebサービス・クライアントの公開

JPublisherでは、Webサービス定義言語(WSDL)ファイルをPL/SQLパッケージに公開して、データベース・ユーザーがPL/SQLからWebサービスをコールできるようにします。この機能はWebサービスのコールアウトと呼ばれます。JPublisherでは、WSDLファイルを使用してJavaベースのWebサービス・クライアント・プロキシを生成し、さらにクライアント・プロキシ用のPL/SQLラッパーを生成します。クライアント・プロキシは、JPublisherで起動されるOracle Database Webサービス・アセンブラ・ツールにより生成されます。このツールを起動する前に、次のものがデータベースに存在する必要があります。

- JPublisherにより生成されたクライアント・プロキシ

- JPublisherにより生成されたPL/SQLラッパー

- JPublisherにより生成されたJavaストアド・プロシージャ・ラッパー

- Java API for XML-based Remote Procedure Call(JAX-RPC)のWebサービス・クライアント・ランタイム、またはOracle Simple Object Access Protocol(SOAP)のWebサービス・クライアント・ランタイム

以上のコンポーネントは、JPublisherで自動的にロードすることも、ユーザーが手動でロードすることもできます。実行時に、Webサービスのコールアウトは次のように機能します。

1. ユーザーがPL/SQLラッパーをコールします。次いでPL/SQLラッパーがJavaストアド・プロシージャ・ラッパーをコールします。

2. Javaストアド・プロシージャ・ラッパーがクライアント・プロキシをコールします。

3. クライアント・プロキシがWebサービス・クライアント・ランタイムを使用してWebサービスをコールします。

PL/SQLでサポートされるのは静的メソッドのみのため、クライアント・プロキシ・クラスのインスタンス・メソッドを静的メソッドとして公開するには、中間レイヤーとしてJavaストアド・プロシージャ・ラッパーが必要です。

Webサービスのコールアウトには次のJARファイルが必要です。これらのファイルは、データベースWebサービスのコールアウト・ユーティリティの10gリリース2に組み込まれています。

- dbwsa.jar

- dbwsclientws.jar

- dbwsclientdb101.jar

- dbwsclientdb102.jar

これらのファイルは次の場所からダウンロードできます。

http://download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callout-utility-10131.zip

すべてのJARファイルをORACLE_HOME/sqlj/libにコピーする必要があります。dbwsa.jarファイルは、JPublisherがWSDLファイルを公開するときにCLASSPATHに含まれている必要があります。UNIXシステムでは、jpubコマンドライン・スクリプトにORACLE_HOME/sqlj/lib/dbwsa.jarが含まれています。したがって、このファイルをCLASSPATHに含める必要はありません。

dbwsclientws.jarファイルには、Oracle Databaseのバージョンに関係なく、Webサービス・クライアント・クラスが含まれます。dbwsclientdb101.jarファイルには、Oracle Database 10gリリース1に固有のWebサービス・クライアント・クラスが含まれます。dbwsclientdb102.jarファイルには、Oracle Database 10gリリース2またはOracle Database 11gに固有のWebサービス・クライアント・クラスが含まれます。

Oracle9i Databaseでサポートされているのは、Oracle SOAP Webサービス・クライアントのみです。Oracle9iリリース2(9.2)より前のデータベースにOracle SOAP Webサービス・クライアント・ランタイムをロードするには、次のコマンドを実行します。

% loadjava -u sys -r -v -s -f -grant public \
${J2EE_HOME}/lib/activation.jar \
${J2EE_HOME}/lib/http_client.jar \
${ORACLE_HOME}/lib/xmlparserv2.jar \
${ORACLE_HOME}/soap/lib/soap.jar \
${J2EE_HOME}/lib/mail.jar
Password: password

このコマンドはUNIXシステムの形式です。それでも、Microsoft Windowsユーザーは、Oracle SOAP Webサービス・クライアントに必要なJARファイルを把握することができます。関連のJARファイルは、Oracle9i Application Serverの各リリースに同梱されています。

Oracle Database 9.2にOracle SOAP Webサービス・クライアントをロードするには、次のコマンドを実行します。

% loadjava -u hr -r -v -f -genmissing
${ORACLE_HOME}/j2ee/home/lib/jssl-1_2.jar
${ORACLE_HOME}/soap/lib/soap.jar
${ORACLE_HOME}/dms/lib/dms.jar
${ORACLE_HOME}/j2ee/home/lib/servlet.jar
${ORACLE_HOME}/j2ee/home/lib/ejb.jar
${ORACLE_HOME}/j2ee/home/lib/mail.jar
Password: password

Oracle Database 10gにOracle SOAP Webサービス・クライアントをロードするには、次のコマンドを実行します。

% loadjava -u hr -r -f -v -genmissing
${ORACLE_HOME}/soap/lib/soap.jar
${ORACLE_HOME}/lib/dms.jar
${ORACLE_HOME}/jlib/javax-ssl-1_1.jar
${ORACLE_HOME}/j2ee/home/lib/servlet.jar
${ORACLE_HOME}/j2ee/home/lib/mail.jar
${ORACLE_HOME}/j2ee/home/lib/activation.jar
${ORACLE_HOME}/j2ee/home/lib/http_client.jar
${ORACLE_HOME}/j2ee/home/lib/ejb.jar
Password: password

注意:
ユーザーにGrant Public権限がある場合、ロードしたクラスを他のスキーマから見えるようにするには、前述のコマンドに-grant publicを追加します。

Oracle 10gリリース1データベースにOracle JAX-RPCクライアントをロードするには、次の2つのオプションのいずれかを使用します。

- 次のコマンドを使用して、SYSスキーマにWebサービス・クライアントをロードします。

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

- 次のコマンドを使用して、ユーザー・スキーマにWebサービス・クライアントをロードします。

% loadjava -u hr -r -v -f -genmissing dbwsclientws.jar dbwsclientdb101.jar
Password: password

Oracle 12cリリース1データベースまたはOracle Database 11gにOracle JAX-RPCクライアントをロードするには、次の2つのオプションのいずれかを使用します。

- 次のコマンドを使用して、SYSスキーマにWebサービス・クライアントをロードします。

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

- 次のコマンドを使用して、ユーザー・スキーマにWebサービス・クライアントをロードします。

% loadjava -u hr -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar
Password: password

注意:
ユーザーにGrant Public権限がある場合、ロードしたクラスを他のスキーマから見えるようにするには、前述のコマンドに-grant publicを追加します。

Webサービスのコールアウトでは、JPublisherをJDK 1.4以降で実行する必要があります。次のJPublisherのオプションが、Webサービスのコールアウトに関係します。

-proxywsdl=url
-httpproxy=host:port
-endpoint=url
-proxyopts=soap|jaxrpc|noload|tabfun. Default: -proxyopts=jaxrpc|tabfun.
-sysuser=user/password

ここで

- -proxywsdlオプションでは、公開されるWebサービスを記述するWSDLファイルのURLまたはパスを指定します。

- -httpproxyオプションでは、WSDLファイルがファイアウォールの外側にある場合に、このファイルへのアクセスに使用するHTTPプロキシを指定します。

- -endpointオプションでは、WSDLファイルに指定されているエンドポイントではなく、ここで指定するエンドポイントにクライアントをリダイレクトします。

関連項目:
「JavaおよびPL/SQLラッパー生成用のWSDLドキュメント」および「Webサービスのエンドポイント」

- -proxyopts=soap設定では、PL/SQLラッパーでWebサービスのコールにOracle SOAP Webサービス・クライアント・ランタイムが使用されることを指定します。
-proxyopts=jaxrpc設定では、PL/SQLラッパーでWebサービスのコールにOracle JAX-RPC Webサービス・クライアント・ランタイムが使用されることを指定します。

-proxyopts=tabfun設定では、該当するWebサービス操作に対してテーブル・ファンクションが生成されることを指定します。

- -proxywsdlには-sysuser設定をお薦めします。これは、SYS権限を持つデータベース・ユーザーを指定します。-sysuser設定を使用すると、JPublisherにより、生成されたPL/SQLラッパーを実行できる適切なアクセス権限が割り当てられます。また、-sysuser設定を使用すると、Webサービス・クライアント・ランタイムがデータベースにない場合に、JPublisherでランタイムをロードすることもできます。

たとえば、HelloServiceというJAX-RPC Webサービスが次のエンドポイントにデプロイされているとします。

http://localhost:8888/javacallout/javacallout

このWebサービス用のWSDLドキュメントは次の位置にあるとします。

http://localhost:8888/javacallout/javacallout?WSDL

Webサービスは、システム・プロパティ名を指定するJava文字列を取って、そのプロパティの値を戻すgetProperty操作を提供します。たとえば、getProperty("os.name")はSunOSを戻します。

JPublisherでは、WebサービスのWSDL記述に基づいて、Webサービス・クライアント・プロキシの生成を指示し、クライアント・プロキシ用のJavaおよびPL/SQLラッパーを生成できます。これらの機能を実行するには、次のコマンドを使用します。

% jpub -user=hr -sysuser=sys/sys_password
-url=jdbc:oracle:thin:@localhost:1521:orcl
-proxywsdl=http://localhost:8888/javacallout/javacallout?WSDL
-package=javacallout -dir=genproxy
Enter hr password: password

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

genproxy/HelloServiceJPub.java
genproxy/plsql_wrapper.sql
genproxy/plsql_dropper.sql
genproxy/plsql_grant.sql
genproxy/plsql_revoke.sql
Executing genproxy/plsql_wrapper.sql
Executing genproxy/plsql_grant.sql
Loading genproxy/plsql_proxy.jar

-proxyopts設定を使用すると、JAX-RPCクライアント・プロキシおよびラッパーが生成され、テーブル・ファンクションを使用してWebサービス操作がラップされます。-url設定はデータベースを示し、-user設定はスキーマを示し、ここに、JPublisherは生成されたJavaラッパーとPL/SQLラッパーをロードします。-sysuser設定では、ラッパー・スクリプトの実行パーミッションを付与する権限を持つSYSアカウントを指定します。

plsql_grant.sqlおよびplsql_revoke.sqlスクリプトはJPublisherで生成されます。この2つのスクリプトを使用して、データベース・スキーマ内にPL/SQLラッパーを作成し、これを実行するためのパーミッションを付与し、そのパーミッションを取り消し、データベース・スキーマからPL/SQLラッパーを削除します。

WSDLファイルの内容は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

<definitions name="HelloService"
targetNamespace="http://oracle.j2ee.ws/javacallout/Hello"
xmlns:tns="http://oracle.j2ee.ws/javacallout/Hello"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types/>
<message name="HelloServiceInf_getProperty">
<part name="String_1" type="xsd:string"/>
</message>
<message name="HelloServiceInf_getPropertyResponse">
<part name="result" type="xsd:string"/>
</message>
<portType name="HelloServiceInf">
<operation name="getProperty" parameterOrder="String_1">
<input message="tns:HelloServiceInf_getProperty"/>
<output message="tns:HelloServiceInf_getPropertyResponse"/>
</operation>
</portType>
<binding name="HelloServiceInfBinding" type="tns:HelloServiceInf">
<operation name="getProperty">
<input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
use="encoded"
namespace="http://oracle.j2ee.ws/javacallout/Hello"/>
</input>
<output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
use="encoded"
namespace="http://oracle.j2ee.ws/javacallout/Hello"/>
</output>
<soap:operation soapAction=""/>
</operation>
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
</binding>
<service name="HelloService">
<port name="HelloServiceInfPort" binding="tns:HelloServiceInfBinding">
<soap:address location="/javacallout"/>
</port>
</service>
</definitions>

<message>要素内のHelloServiceInfはサービスBean名であり、生成されたJAX-RPCクライアント・プロキシ・スタブ・クラスにより生成および実装されるインタフェースの名前を決定します。HelloServiceInfインタフェースのシグネチャは次のとおりです。

public interface HelloServiceInf extends java.rmi.Remote
{
public String getProperty(String prop) throws java.rmi.RemoteException;
}

getProperty()メソッドは、WSDLドキュメントに指定されたgetProperty操作に対応します。指定されたシステム・プロパティpropの値を戻します。たとえば、オペレーティング・システムのバージョンを戻すにはos.versionプロパティを指定します。

plsql_wrapper.sqlファイルは、PL/SQLラッパー・パッケージJPUB_PLSQL_WRAPPERを定義します。このパッケージは、PL/SQLからWebサービスをコールするために作成されます。これには、Webサービス操作getPropertyからのテーブル・ファンクションの定義が含まれます。plsql_wrapper.sqlファイル内のスクリプトは次のとおりです。

CREATE OR REPLACE TYPE GRAPH_getProperty AS OBJECT(
p0 VARCHAR2(32767),
res VARCHAR2(32767)
);
/
CREATE OR REPLACE TYPE GRAPH_TAB_getProperty AS TABLE OF GRAPH_getProperty;
/
-- PL/SQL procedures that invoke webserviecs
CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
FUNCTION getProperty(p0 VARCHAR2) RETURN VARCHAR2;
FUNCTION TO_TABLE_getProperty(cur SYS_REFCURSOR) RETURN GRAPH_TAB_getProperty PIPELINED;
END JPUB_PLSQL_WRAPPER;
/

JPublisherコマンドラインにはこのWebサービスを公開するために-userおよび-sysuser設定が指定されているため、生成されたJavaコードとPL/SQLラッパーがデータベースにロードされます。すべてがロードされた後、PL/SQLラッパーを使用してWebサービスを起動できます。

PL/SQLラッパーは、getPropertyおよびTO_TABLE_getPropertyという2つのファンクションで構成されています。getPropertyファンクションは、生成されたクライアント・プロキシ・クラス内でgetProperty()メソッドを直接ラップします。たとえば、次のSQL*Plusコマンドでは、getPropertyを使用してWebサービスを実行中のオペレーティング・システムを判別します。

SQL> SELECT JPUB_PLSQL_WRAPPER.getProperty('os.name') FROM DUAL;
JPUB_PLSQL_WRAPPER.GETPROPERTY('OS.NAME')
-----------------------------------------
SunOS

TO_TABLE_getPropertyは、getPropertyファンクションに基づくテーブル・ファンクションです。これは入力としてREF CURSORを取り、表を戻します。戻される表のスキーマは、GRAPH_getPropertyにより定義されます。この例で、TO_TABLE_getPropertyはVARCHAR2データを含む1列のみの表から取得されたREF CURSORを使用してコールされます。各データ項目はシステム・プロパティ名(os.versionなど)です。TO_TABLE_getPropertyは、各行に入力のREF CURSORからの項目と、その項目を入力として取るgetPropertyコールの結果が含まれる表を戻します。次のコードは、TO_TABLE_getPropertyの使用例です。

SQL> -- Test Table Function
SQL> CREATE TABLE props (name VARCHAR2(50));
SQL> BEGIN
INSERT INTO props VALUES('os.version');
INSERT INTO props VALUES('java.version');
INSERT INTO props VALUES('file.separator');
INSERT INTO props VALUES('file.encoding.pkg');
INSERT INTO props VALUES('java.vm.info');
END;
/
SQL> SELECT * FROM
TABLE(JPUB_PLSQL_WRAPPER.TO_TABLE_getProperty(CURSOR(SELECT * FROM props)));
P0 RES
------------------------------
os.version 5.8
java.version 1.4.1_03
file.separator /
file.encoding.pkg sun.io
java.vm.info mixed mode

この例では、VARCHAR2の1列のみの表が作成されてシステム・プロパティ名が移入され、TO_TABLE_getPropertyを使用してこれらのシステム・プロパティの値が検出されます。この例では、オペレーティング・システムがSun社のSolaris 5.8であることがわかります。

3 データ型およびJava間の型マッピング

この章では、Java間の型マッピングに関するJPublisherのスタイルおよびスタイル・ファイルなど、JPublisherのデータ型マッピング・サポートを説明します。これらのスタイル・ファイルは、主にWebサービスのサポート用に使用されます。この章の内容は、次のとおりです。

- JPublisherのデータ型マッピング

- PL/SQLデータ型のサポート

- JPublisherのスタイルとスタイル・ファイル

JPublisherのデータ型マッピング

この項では、SQLおよびPL/SQLからJavaへのマッピングに関するJPublisherの機能について説明します。この項の内容は、次のとおりです。

- JPublisherのデータ型マッピングの概要

- OracleおよびJDBC型へのSQLとPL/SQLのマッピング

- JPublisherのユーザー型マップとデフォルトの型マップ

- データ型マッピングに関するJPublisherの論理進行

- オブジェクト属性の型

- REF CURSOR型と結果セットのマッピング

- JDBCマッピングにおける接続

関連項目:
「PL/SQLデータ型のサポート」

JPublisherのデータ型マッピングの概要

-builtintypes、-lobtypes、-numbertypesおよび-usertypesの型マッピング・オプションを使用する場合、次のデータ型マッピングの設定からいずれか1つを指定できます。

- oracle

- jdbc

- objectjdbc

- bigdecimal

注意:
objectjdbcおよびbigdecimalは、-numbertypesオプション専用の設定です。

これらのマッピングは、JPublisherで生成されるメソッドで使用される引数および結果の型に影響を与えます。

JPublisherでオブジェクト型に対して生成されるクラスには、オブジェクト属性用のgetXXX()およびsetXXX()アクセッサ・メソッドがあります。VARRAY型またはネストした表型に対してJPublisherで生成されるクラスには、配列またはネストした表の要素にアクセスするgetXXX()メソッドおよびsetXXX()メソッドがあります。ラッパー・メソッドの生成が有効化されている場合、オブジェクト型またはPL/SQLパッケージ用にJPublisherで生成されるクラスにはラッパー・メソッドがあります。これらのラッパー・メソッドが、オブジェクト型またはパッケージのサーバー・メソッド(ストアド・プロシージャ)をコールします。マッピング・オプションは、これらのメソッドで使用する引数および結果の型を制御します。

Java Database Connectivity(JDBC)マッピングおよびObject JDBCマッピングでは、標準のJava操作で処理可能な通常のJava型が使用されます。Oracleマッピングは最も効率のよいマッピングです。oracle.sql型はOracle内部データ型とほぼ一致しているため、JavaとSQLフォーマット間のデータ変換はほとんど、あるいはまったく必要ありません。情報を失うことはなく、データの処理およびデータの取出しにおいてより柔軟性があります。データベース内でデータを操作している場合やデータを移動している場合、標準のSQL型に対するOracleマッピングが最も便利な表現です。たとえば、ある既存の表から別の表へのSELECTおよびINSERT操作を実行している場合がこれに該当します。データ・フォーマット変換が必要な場合は、oracle.sql.*クラスのメソッドを使用してネイティブなJava型に変換できます。

OracleおよびJDBC型へのSQLとPL/SQLのマッピング

表3-1に、SQLデータ型およびPL/SQLデータ型からJava型へのマッピングを示します。PL/SQLメソッドの引数または結果の型として、この表でサポート対象となっているすべてのデータ型を使用できます。データ型のサブセットをオブジェクト属性の型として使用することもできます。

関連項目:
「オブジェクト属性の型」

SQLおよびPL/SQLデータ型列にはすべての使用可能なデータ型が含まれます。

Oracleマッピング列は、すべての型マッピング・オプションをoracleに設定した場合にJPublisherで使用される対応Java型を示します。これらの型はOracleが提供するoracle.sqlパッケージ内にあり、Oracleデータ型をJava型に変換したときに発生するオーバーヘッドが最小となるように設計されています。

関連項目:
oracle.sqlパッケージの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

JDBCマッピング列は、すべての型マッピング・オプションをjdbcに設定した場合にJPublisherで使用される対応Java型を示します。標準SQLデータ型の場合、JPublisherによりJDBC仕様で指定されたJava型が使用されます。Oracle拡張要素であるSQLデータ型の場合、JPublisherによりoracle.sql.*型が使用されます。-numbertypesオプションをobjectjdbcに設定すると、対応する型はJDBCマッピング列の場合と同じになります。ただし、intなどのJavaプリミティブ型は、java.lang.Integerなどの対応するオブジェクト型に置き換えられます。

注意:
PL/SQLのBOOLEANからSQLのNUMBER、さらにJavaのbooleanへのマッピングなど、JPublisherの型マップに明示的に定義されている型の対応付けは、マッピング・オプションの設定の影響を受けません。

PL/SQLにのみ関係する型など、JPublisherで直接サポートされないデータ型がいくつかあります。これらの制限事項は、等価のSQL型とJava型、およびPL/SQL表現とSQL表現の間のPL/SQL変換ファンクションを提供することで回避できます。これらの変換については、後述します。

表3-1 OracleおよびJDBCマッピング・クラスに対するSQLおよびPL/SQLデータ型

SQLおよびPL/SQLデータ型

Oracleマッピング

JDBCマッピング

CHAR、CHARACTER、LONG、STRING、VARCHAR、VARCHAR2

oracle.sql.CHAR

java.lang.String

NCHAR、NVARCHAR2

oracle.sql.NCHAR(注意1)

oracle.sql.NString(注意1)

NCLOB

oracle.sql.NCLOB(注意1)

oracle.sql.NCLOB(注意1)

RAW、LONG RAW

oracle.sql.RAW

byte[]

BINARY_INTEGER、NATURAL、NATURALN、PLS_INTEGER、POSITIVE、POSITIVEN、SIGNTYPE、INT、INTEGER

oracle.sql.NUMBER

int

DEC、DECIMAL、NUMBER、NUMERIC

oracle.sql.NUMBER

java.math.BigDecimal

DOUBLE PRECISION、FLOAT

oracle.sql.NUMBER

double

SMALLINT

oracle.sql.NUMBER

int

REAL

oracle.sql.NUMBER

float

DATE

oracle.sql.DATE

java.sql.Timestamp

TIMESTAMP

TIMESTAMP WITH TZ

TIMESTAMP WITH LOCAL TZ

oracle.sql.TIMESTAMP

oracle.sql.TIMESTAMPTZ

oracle.sql.TIMESTAMPLTZ

java.sql.Timestamp

INTERVALYEARTOMONTH

INTERVALDAYTOSECOND

String(注意2)

String(注意2)

ROWID、UROWID

oracle.sql.ROWID

oracle.sql.ROWID

BOOLEAN

boolean(注意3)

boolean(注意3)

CLOB

oracle.sql.CLOB

java.sql.Clob

BLOB

oracle.sql.BLOB

java.sql.Blob

BFILE

oracle.sql.BFILE

oracle.sql.BFILE

オブジェクト型

生成されたクラス

生成されたクラス

SQLJオブジェクト型

型の作成時に定義されたJavaクラス

型の作成時に定義されたJavaクラス

OPAQUE型

生成されるクラスまたは事前定義済のクラス(注意4)

生成されるクラスまたは事前定義済のクラス(注意4)

RECORD型

SQLオブジェクト型へのマッピングを使用(注意5)

SQLオブジェクト型へのマッピングを使用(注意5)

ネストした表、VARRAY

oracle.sql.ARRAYを使用して実装された生成クラス

java.sql.Array

オブジェクト型の参照

oracle.sql.REFを使用して実装された生成クラス

java.sql.Ref

REF CURSOR

java.sql.ResultSet

java.sql.ResultSet

索引付き表

SQLコレクションへのマッピングを使用(注意6)

SQLコレクションへのマッピングを使用(注意6)

スカラー(数値または文字)

索引付き表

Java配列へのマッピングを使用(注意7)

Java配列へのマッピングを使用(注意7)

ユーザー定義サブタイプ

ベース型と同じ

ベース型と同じ

データ型マッピングの注意 次の注意事項は、前述の表の項目に対応しています。

1. Javaクラスoracle.sql.NCHAR、oracle.sql.NCLOBおよびoracle.sql.NStringは、JDBCの一部ではなく、JPublisherランタイムとともに配布されます。JPublisherでは、これらのクラスを使用して、対応するクラスoracle.sql.CHAR、oracle.sql.CLOBおよびjava.lang.Stringの使用がNCHAR形式で表現されます。

2. SQLのINTERVAL型からJavaのString型へのマッピングは、デフォルトのJPublisher型マップに定義されています。変換にはSYS.SQLJUTLパッケージのファンクションが使用されます。

関連項目:
「JPublisherのユーザー型マップとデフォルトの型マップ」

3. PL/SQLのBOOLEANからSQLのNUMBERおよびJavaのbooleanへのマッピングは、デフォルトのJPublisher型マップに定義されています。このプロセスには、SYS.SQLJUTLパッケージからの変換ファンクションが使用されます。

4. SQLのOPAQUE型であるSYS.XMLTYPEからJavaクラスoracle.xdb.XMLTypeへのマッピングは、デフォルトのJPublisher型マップに定義されています。他のOPAQUE型の場合は、通常、対応するJavaクラスがベンダーから提供されます。この場合は、SQLのOPAQUE型および対応するJavaラッパー・クラス間の対応付けを定義するJPublisher型マップ・エントリを指定する必要があります。型マップ・エントリのないOPAQUE型が検出されると、JPublisherはそのOPAQUE型用のJavaラッパー・クラスを生成します。

関連項目:
「OPAQUE型の型マッピング・サポート」

5. PL/SQLのRECORD型をサポートするために、JPublisherはRECORD型をSQLオブジェクト型にマップした後、SQLオブジェクト型に対応したJava型にマップします。JPublisherでは2つのSQLスクリプトが生成されます。一方のスクリプトは、SQLオブジェクト型を作成し、SQL型とRECORD型の間の変換ファンクションを含むPL/SQLパッケージを作成するためのものです。もう一方のスクリプトは、最初のスクリプトにより作成されたSQL型とPL/SQLパッケージを削除するために使用されます。

関連項目:
「PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート」

6. PL/SQLの索引付き表の型をサポートするために、JPublisherは最初に索引付き表の型をSQLコレクション型にマップした後、そのSQLコレクション型に対応したJavaクラスにマップします。JPublisherでは2つのSQLスクリプトが生成されます。一方のスクリプトは、SQLコレクション型を作成し、SQLコレクション型と索引付き表の型の間の変換ファンクションを含むPL/SQLパッケージを作成するためのものです。もう一方は、最初のスクリプトにより作成されたコレクション型とPL/SQLパッケージを削除するためのものです。

関連項目:
「PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート」

7. JDBCドライバを使用してPL/SQLストアド・プロシージャまたはオブジェクト・メソッドをコールする場合は、PL/SQLのTABLE型とも呼ばれるスカラーの索引付き表が直接サポートされます。この場合は、型マップ・エントリを使用し、JPublisherに対して、PL/SQLのスカラーの索引付き表の型および対応するJava配列型を指定する必要があります。この後、JPublisherでは、このスカラーの索引付き表を使用するPL/SQLまたはオブジェクト・メソッドのシグネチャを自動的に公開することができます。

関連項目:
「スカラーの索引付き表の型マッピング・サポート」

JPublisherのユーザー型マップとデフォルトの型マップ

JPublisherには、-typemapおよび-addtypemapオプションによって制御され、最初は空で始まるユーザー型マップがあります。また、-defaulttypemapおよび-adddefaulttypemapオプションによって制御され、次に示すエントリで始まるデフォルトの型マップもあります。

jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
jpub.adddefaulttypemap=BOOLEAN:boolean:INTEGER:
SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT
jpub.adddefaulttypemap=INTERVAL DAY TO SECOND:String:CHAR:
SYS.SQLJUTL.CHAR2IDS:SYS.SQLJUTL.IDS2CHAR
jpub.adddefaulttypemap=INTERVAL YEAR TO MONTH:String:CHAR:
SYS.SQLJUTL.CHAR2IYM:SYS.SQLJUTL.IYM2CHAR

これらのコマンド(一部の行は折り返されています)は、PL/SQL型、Java型およびSQL型の間のマッピングを示します。該当する場合は、PL/SQL型とSQL型の間で変換に使用する変換ファンクションも指定されます。

関連項目:
「型マップ・オプション」

JPublisherでは、最初にデフォルトの型マップがチェックされます。デフォルトの型マップに含まれているマッピングをユーザー型マップで再定義しようとすると、JPublisherでは警告メッセージが生成され、再定義は無視されます。同様に、以前のマッピングと競合する-adddefaulttypemapまたは-addtypemap設定を介してマッピングを追加しようとすると、無視されて警告が生成されます。

通常、型マップには次の2つの使用例があります。

- JDBCでサポートされないPL/SQLデータ型の型マッピングを指定します。

- ユーザー定義型にマップするためのJavaクラスの再生成を回避します。たとえば、ユーザー定義のSQLオブジェクト型STUDENTがあり、この型をマップするためのStudentクラスがすでに生成されているとします。ユーザー型マップでSTUDENT:Studentマッピングを指定すると、JPublisherではStudentクラスが検索され、再生成なしでマッピングに使用されます。

関連項目:
「例: 型マップを使用した再生成の回避」

カスタム・マッピングを使用するには、次のようにデフォルトの型マップを消去することをお薦めします。

-defaulttypemap=

その後、-addtypemapオプションを使用して、必要なマッピングをユーザー型マップに追加します。

事前定義済のデフォルトの型マップでは、SQLのOPAQUE型SYS.XMLTYPEとJavaラッパー・クラスoracle.xdb.XMLTypeの間の対応付けが定義されます。また、PL/SQLのBOOLEAN型は、SYS.SQLJUTLパッケージに定義されている2つの変換ファンクションを使用して、JavaのbooleanおよびSQLのINTEGERにマップされます。デフォルトの型マップには、SQLのINTERVAL型とJavaのString型のマッピングも提供されています。

ただし、true値とfalse値の他にSQLのNULL値を取得するために、PL/SQLのBOOLEAN型からJavaのオブジェクト型Booleanへのマッピングが必要な場合があります。そのためには、次のようにデフォルトの型マップをリセットします。

-defaulttypemap=BOOLEAN:Boolean:INTEGER:SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT

これにより、指定したJava型がbooleanからBooleanに変更され、他の既存のデフォルトの型マップ・エントリは排除されます。変換の残りの部分は引き続き有効です。

例: 型マップを使用した再生成の回避 次の例では、再生成されたJavaクラスのマッピングを回避するためのJPublisherの型マップを使用します。次の型宣言があるとします。CITY型がTRIP型の属性であることに注意してください。

SQL> CREATE TYPE city AS OBJECT (name VARCHAR2(20), state VARCHAR2(10));
/
SQL> CREATE OR REPLACE TYPE trip AS OBJECT (leave DATE, place city);
/

次のようにJPublisherを起動するとします。

% jpub -u hr -s TRIP:Trip
Enter hr password: password

JPublisherの出力は次のとおりです。

HR.TRIP
HR.CITY

処理対象にはTRIPのみが指定されています。ただし、このコマンドではソース・ファイルCity.java、CityRef.java、Trip.javaおよびTripRef.javaが生成されます。これは、CITYが属性であるためです。

CITYのクラスを再生成せずにTRIPのクラスを再生成する必要がある場合は、次のようにJPublisherを再実行できます。

% jpub -u hr -addtypemap=CITY:City -s TRIP:Trip HR.TRIP
Enter hr password: password

この出力行でわかるように、CITY型は再処理されないため、City.javaおよびCityRef.javaファイルは再生成されません。これは、型マップにCITY:Cityの関係が追加され、マッピングに既存のCityクラスを使用することがJPublisherに伝えられるためです。

データ型マッピングに関するJPublisherの論理進行

JPublisherでは、指定された特定のSQL型またはPL/SQL型をJavaにマップするために、次の論理進行が使用されます。

1. 型マップがチェックされ、マッピングが指定済かどうかが確認されます。

2. SQL型とPL/SQL型に対する事前定義済のJavaマッピングがチェックされます。

3. マップされるデータ型がPL/SQLのRECORD型であるか索引付き表の型であるかがチェックされます。PL/SQLのRECORD型の場合、JPublisherではJavaにマップできるように、対応するSQLオブジェクト型が生成されます。索引付き表の型の場合は、Javaにマップできるように、対応するSQLコレクション型が生成されます。

4. 手順1から3のいずれにも該当しない場合は、そのデータ型をユーザー定義型にする必要があります。JPublisherでは、JPublisherのオプション設定に従って、マップするORADataまたはSQLDataクラスが生成されます。

オブジェクト属性の型

オブジェクト属性の型として表3-1にリストされているSQLデータ型のサブセットを使用できます。使用できる型は次のとおりです。

- CHAR、VARCHAR、VARCHAR2、CHARACTER

- NCHAR、NVARCHAR2

- DATE

- DECIMAL、DEC、NUMBER、NUMERIC

- DOUBLE PRECISION、FLOAT

- INTEGER、SMALLINT、INT

- REAL

- RAW、LONG RAW

- CLOB

- BLOB

- BFILE

- NCLOB

- オブジェクト型、OPAQUE型、SQLJオブジェクト型

- ネストした表、VARRAY型

- オブジェクト参照型

JPublisherでは、次のTIMESTAMP型がオブジェクト属性としてサポートされます。

- TIMESTAMP

- TIMESTAMP WITH TIMEZONE

- TIMESTAMP WITH LOCAL TIMEZONE

注意:
Oracle JDBC実装ではTIMESTAMP型はサポートされません。

REF CURSOR型と結果セットのマッピング

PL/SQLストアド・プロシージャ、PL/SQLファンクションまたはSQL問合せがREF CURSORを戻した場合、JPublisherはREF CURSORをjava.sql.ResultSetにマップするためのメソッドをデフォルトで生成します。

また、ストアド・プロシージャやファンクションによってREF CURSORではなくSQL問合せが戻された場合、JPublisherはREF CURSORを行の配列にマップするためのメソッドを生成します。この配列では、各行がJavaBeanインスタンスで表されます。

また、-style=webservices-commonに設定され、CLASSPATHで次のクラスが使用可能になっている場合、JPublisherはREF CURSORを次の型にマップするためのメソッドを生成します。

- javax.xml.transform.Source

- oracle.jdbc.rowset.OracleWebRowSet

- org.w3c.dom.Document

注意:

- マッピングを生成するためにはCLASSPATHにクラスが指定されている必要があるという依存性は、スタイル・ファイル内のCONDITION文で指定します。CONDITION文には、必須クラスをリストします。

- webservices9およびwebservices10スタイル・ファイルにはwebservices-commonが含まれていますが、これらのマッピングはオーバーライドされます。したがって、-style=webservices9または-style=webservices10に設定すると、JPublisherでこれらのマッピングは生成されません。

必要な場合、JPublisherでクラスを確実に検出できるように次の手順を実行する必要があります。

1. translator.jar、runtime12.jarおよびojdbc5.jarの各ライブラリがCLASSPATHに指定されていることを確認します。これらのファイルには、それぞれJPublisherとSQLJ Translatorのクラス、SQLJランタイムのクラス、JDBCのクラスが含まれています。

2. Sourceにマップするには、Java Development Kit(JDK)1.4を使用します。このクラスは、以前のバージョンのJDKでは定義されていません。

3. OracleWebRowSetにマップするには、CLASSPATHにORACLE_HOME/jdbc/lib/rowset-jsr114.jarを追加します。

4. Documentにマップするには、CLASSPATHにORACLE_HOME/lib/xmlparsev2.jarを追加します。

次のPL/SQLストアド・プロシージャを考えてみます。

TYPE curtype1 IS REF CURSOR RETURN emp%rowtype;
FUNCTION get1 RETURN curtype1;

公開時にCLASSPATH内でOracleWebRowSetクラスが検出されても、DocumentおよびSourceが検出されなければ、JPublisherではget1ファンクション用に次のメソッドが生成されます。

public oracle.jdbc.rowset.OracleWebRowSet get1WebRowSet()
throws java.sql.SQLException;
public java.sql.ResultSet get1() throws java.sql.SQLException;

DocumentおよびSourceを戻すメソッドの名前は、それぞれget1XMLDocument()およびget1XMLSource()となります。

Source、OracleWebRowSetまたはDocumentへのマッピングの無効化

現在、Source、OracleWebRowSetまたはDocumentへのマッピングを明示的に有効化または無効化するためのJPublisherオプションはありません。webservices-commonスタイル・ファイルでの条件は、CLASSPATHにクラスが存在するかどうかのみです。ただし、JPublisherによるREF CURSORのマッピング方法を厳密に制御する必要がある場合は、スタイル・ファイルをコピーして独自に編集できます。次のコードに、例としてコピーおよび編集したwebservices-commonファイルの抜粋を示します。編集内容についてはコードの後に説明します。

BEGIN_TRANSFORMATION
MAPPING
SOURCETYPE java.sql.ResultSet
TARGETTYPE java.sql.ResultSet
RETURN
%2 = %1;
END_RETURN;
END_MAPPING

MAPPING
#CONDITION oracle.jdbc.rowset.OracleWebRowSet
SOURCETYPE java.sql.ResultSet
TARGETTYPE oracle.jdbc.rowset.OracleWebRowSet
TARGETSUFFIX WebRowSet
RETURN
%2 = null;
if (%1!=null)
{
%2 = new oracle.jdbc.rowset.OracleWebRowSet();
%2.populate(%1);
}
END_RETURN
END_MAPPING

#MAPPING
#CONDITION org.w3c.dom.Document oracle.xml.sql.query.OracleXMLQuery
#SOURCETYPE java.sql.ResultSet
#TARGETTYPE org.w3c.dom.Document
#TARGETSUFFIX XMLDocument
#RETURN
#%2 = null;
#if (%1!=null)
#  %2= (new oracle.xml.sql.query.OracleXMLQuery
#                                 (_getConnection(), %1)).getXMLDOM();
#END_RETURN
#END_MAPPING

MAPPING
CONDITION org.w3c.dom.Document oracle.xml.sql.query.OracleXMLQuery
javax.xml.transform.Source javax.xml.transform.dom.DOMSource
SOURCETYPE java.sql.ResultSet
TARGETTYPE javax.xml.transform.Source
TARGETSUFFIX XMLSource
RETURN
%2 = null;
if (%1!=null)
%2= new javax.xml.transform.dom.DOMSource
((new oracle.xml.sql.query.OracleXMLQuery
(new oracle.xml.sql.dataset.OracleXMLDataSetExtJdbc(_getConnection(),
(oracle.jdbc.OracleResultSet) %1))).getXMLDOM());
END_RETURN
END_MAPPING
END_TRANSFORMATION

このファイルをmyrefcursormaps.propertiesにコピーするとします。SOURCETYPEおよびTARGETTYPEエントリに従ってREF CURSORをResultSet、OracleWebRowSet、DocumentおよびSourceにマップすることを意図した4つのMAPPINGセクションがあります。この例では、次の目的で各行が"#"文字を使用してコメント化されています。

- OracleWebRowSetマッピングに対するCONDITION文はコメント化されています。このため、JPublisherでは、OracleWebRowSetがCLASSPATHに含まれているかどうかに関係なく、このマッピング用のメソッドが生成されます。

- Documentマッピングの場合は、MAPPINGセクション全体がコメント化されています。このマッピング用のメソッドは生成されません。

カスタム・マッピングを使用するために、次のオプションでJPublisherを実行します。

% jpub -u hr -style=myrefcursormaps -s MYTYPE:MyType
Enter hr password: password

JDBCマッピングにおける接続

-usertypes=jdbc設定を使用すると、JPublisherではSQLオブジェクト型用のSQLDataが生成されます。SQLDataインスタンス用の基礎となるJDBC接続は、JDBCドライバによって自動設定はされません。したがって、SQLDataインスタンス内の属性にアクセスする前に、setConnectionContext()メソッドを使用してJDBC接続を設定する必要があります。

Addressは、JPublisherによって-usertypes=jdbcを使用して生成されたSQLDataクラスであることを考慮してください。次のコード・セグメントでは、Addressインスタンスの属性がアクセスされています。setConnectionContextコールが、基礎となるJDBC接続を明示的に初期化していることに注意してください。

...
ResultSet rset = stmt.executeQuery();
Address address = (Address) rset.getObject(1);
address.setConnectionContext(new sqlj.runtime.ref.DefaultContext(connection));
String addr = address.getAddress();
...

注意:
他の-usertypes設定の場合、前のコード例で説明したように接続の設定は必要ありません。

一方、JPublisherが-usertypes=oracle設定を使用して、またはデフォルトで生成するORAData型の場合は、接続の初期化は必要ありません。ORADataの場合、基礎となるJDBC接続はResultSetから読み取られた時点ですでに割り当てられています。

PL/SQLデータ型のサポート

JPublisherにより検出されたPL/SQLストアド・プロシージャまたはファンクション(SQLオブジェクト型のメソッドを含む)に、JDBCでサポートされていないPL/SQL型が使用されている場合については、次の3つの使用例があります。

- デフォルトの型マップまたはユーザー型マップでPL/SQL型のマッピングを指定すると、そのマッピングがJPublisherで使用されます。

関連項目:
「JPublisherのユーザー型マップとデフォルトの型マップ」

- 型マップにマッピングがなく、PL/SQL型がRECORD型または索引付き表の型の場合、JPublisherではJDBCがサポートする、対応するSQL型が生成されます。PL/SQLのRECORD型の場合は、RECORD型とJava間のブリッジとしてSQLオブジェクト型が生成されます。索引付き表の型の場合は、ブリッジ用のSQLコレクション型が生成されます。

- 前述の2つの使用例に該当しない場合、JPublisherでは警告メッセージが発行され、生成されたコードにサポート外のPL/SQL型を表す<unsupported type>が使用されます。

次の項では、JDBCでサポートされていないPL/SQL型に対するJPublisherの型マッピング機能の詳細を説明します。

- OPAQUE型の型マッピング・サポート

- スカラーの索引付き表の型マッピング・サポート

- PL/SQL変換ファンクションを介した型マッピングのサポート

- PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート

- PL/SQL変換ファンクションを直接使用する場合とラッパー・ファンクションを使用する場合

- JDBCでサポートされないデータ型に対するその他の代替方法

OPAQUE型の型マッピング・サポート

この項では、SQLのOPAQUE型のJPublisher型マッピング・サポート全般について説明します。

注意:
JPublisherを使用してSQLのOPAQUE型のラッパー・クラスを生成する場合は、Oracle9iリリース2(9.2)以上のインストールとJDBCドライバを使用する必要があります。

Oracle JDBC実装とSQLJ実装では、oracle.sql.ORADataインタフェースを実装するJavaクラスとして公開されるSQLのOPAQUE型がサポートされます。この種のクラスには、次のパブリック・フィールド、静的フィールドおよびメソッドを含める必要があります。

public static String _SQL_NAME = "SQL_name_of_OPAQUE_type";
public static int _SQL_TYPECODE = OracleTypes.OPAQUE;
public static ORADataFactory getORADataFactory() { ... }

SQLのOPAQUE型にマップするJavaラッパー・クラスがあり、クラスがこの要件を満たしている場合は、JPublisherのユーザー型マップを介してマッピングを指定できます。次の構文で-addtypemapオプションを使用し、マッピングをユーザー型マップに追加します。

-addtypemap=sql_opaque_type:java_wrapper_class

Oracle Database 12cでは、SQLのOPAQUE型SYS.XMLTYPEは、JPublisherのデフォルトの型マップを介してJavaのoracle.xdb.XMLTypeクラスにマップされます。これと同じマッピングは、次のようにユーザー型マップを介して明示的に指定できます。

-addtypemap=SYS.XMLTYPE:oracle.xdb.XMLType

JPublisherでは、型の対応付けが指定されていないSQLのOPAQUE型が検出されるたびに、Javaラッパー・クラスが公開されます。HRスキーマに定義されている次のSQL型を考えます。

CREATE TYPE X_TYP AS OBJECT (xml SYS.XMLTYPE);

次のコマンドでは、X_TYPがJavaクラスXTypとして公開されます。

% jpub -u hr -s X_TYP:XTyp
Enter hr password: password

デフォルトでは、xml属性は、SYS.XMLTYPEに対する事前定義済の型マッピングであるoracle.xdb.XMLTypeを使用して公開されます。JPublisherのデフォルト型マップを消去すると、SYS.XMLTYPE属性用のラッパー・クラスXmltypeが自動的に生成されます。この動作は、JPublisherを次のように起動することで確認できます。

% jpub -u hr -s X_TYP:XTyp -defaulttypemap=
Enter hr password: password

-defaulttypemapオプションは、JPublisherのデフォルトの型マップを設定します。前述の例のように、値を指定しない場合は消去されます。

関連項目:
「JPublisherのユーザー型マップとデフォルトの型マップ」および「型マップ・オプション」

スカラーの索引付き表の型マッピング・サポート

スカラーのPL/SQL索引付き表という用語は、VARCHAR型および数値型の要素を持つPL/SQL索引付き表を指します。10gリリース2から、JPublisherでは、PL/SQL索引付き表をカスタムJDBC型へマップする方法にかわって、単純なPL/SQL索引付き表をJava配列にマップできます。オプションplsqlindextableは、単純なPL/SQL索引付き表のマッピング方法を指定します。

-plsqlindextable=custom|array|int

-plsqlindextable=customが設定されている場合、すべての索引付き表がSQLData、CustomDatumまたはORADataなどのカスタムJDBC型にマップされます。-plsqlindextable=arrayまたは-plsqlindextable=intが設定されている場合、単純な索引付き表がJava配列にマップされます。-plsqlindextableintの場合、int値は配列の容量(デフォルトで32768)を指定します。このオプションのデフォルト設定はcustomです。

次のPL/SQLパッケージを考えてみます。

CREATE OR REPLACE PACKAGE indexbytable_package AS
TYPE index_tbl1 IS TABLE OF VARCHAR2(111) INDEX BY binary_integer;
TYPE index_tbl2 IS TABLE OF NUMBER INDEX BY binary_integer;
TYPE varray_tbl3 IS VARRAY(100) OF VARCHAR2(20);
TYPE nested_tbl4 IS TABLE OF VARCHAR2(20);
FUNCTION echo_index_tbl1(a index_tbl1) RETURN index_tbl1;
FUNCTION echo_index_tbl2(a index_tbl2) RETURN index_tbl2;
FUNCTION echo_varray_tbl3(a varray_tbl3) RETURN varray_tbl3;
FUNCTION echo_nested_tbl4(a nested_tbl4) RETURN nested_tbl4;
END;
/

次のコマンドを実行します。

% jpub -u hr -sql=indexbytable_package:IndexbyTablePackage#IndexbyTableIntf -plsqlindextable=32
Enter hr password: password

-plsqlindextable=32の設定は、単純な索引付き表が容量が32のJava配列にマップされることを指定します。次のインタフェースが、IndexbyTableIntf.javaに生成されます。

public interface IndexbyTableIntf
{
public String[] echoIndexTbl1(String[] a);
public java.math.BigDecimal[] echoIndexTbl2(java.math.BigDecimal[] a);
public IndexbytableintfVarrayTbl3 echoVarrayTbl4(IndexbytableintfVarrayTbl3 a);
public IndexbytableintfNestedTbl4 echoVarrayTbl4(IndexbytableintfNestedTbl4 a);
}

生成されたコードでは、単純な索引付き表の型であるindex_tbl1およびindex_tb2が、String[]およびBigDecimal[]にそれぞれマップされます。ただし、ネストした表とVARRAY表はカスタムJDBC型にマップされます。これらの表は索引付きの表ではなく、そのマッピングが-plsqlindextable設定の影響を受けないためです。

PL/SQLの索引付き表から配列へのマッピングには、表が整数で索引付けされている必要があるという制限があります。PL/SQLパッケージに整数で索引付けされた表とVARCHARで索引付けされた表の両方が含まれている場合、-plsqlindexbytable=arrayや-plsqlindexbytable=intの設定は使用できません。使用すると、VARCHARで索引付けされた表のマッピングでランタイム・エラーが発生します。-plsqlindexbytable=customをかわりに使用する必要があります。

索引付き表の要素のマッピングは、JDBC型マッピングに従います。たとえばJDBCマッピングの場合、SMALLINTはJavaのint型にマップされます。したがって、SMALLINTの索引付き表はint[]にマップされます。-plsqlindexbytable=arrayまたは-plsqlindexbytable=int設定は、数値に対してOracleマッピングが有効になっている場合、つまり-numbertypes=oracleの場合は無視されます。理由は、索引付き表にマップされるJava配列の要素は文字列または数値のJava型であることが必要なのに対して、OracleマッピングではSQLの数値がoracle.sql型にマップされるためです。

Oracle JDBCドライバでは、数値または文字の要素を持つPL/SQLのスカラーの索引付き表が直接サポートされます。数値要素を持つ索引付き表は、次のJava配列型にマップできます。

- int[]

- double[]

- float[]

- java.math.BigDecimal[]

- oracle.sql.NUMBER[]

文字要素を持つ索引付き表は、次のJava配列型にマップできます。

- String[]

- oracle.sql.CHAR[]

次の場合は、索引付き表の型について特定の情報を説明にそって指定する必要があります。

- OUTまたはIN OUTパラメータの位置に索引付き表の型を使用するときは常に、最大要素数を指定する必要があります。その他の場合はオプションです。最大要素数は、Java配列割当て用の通常の構文を使用して指定できます。たとえば、最大100個の要素に対応できる型を示すint[100]、または最大20個の要素に対応できる型を示すoracle.sql.CHAR[20]を指定できます。

- 文字要素を持つ索引付き表の場合は、必要に応じて個々の要素の最大サイズをバイト数で指定できます。この設定を定義するには、SQLと同様のサイズ構文を使用します。たとえば、IN引数に使用する索引付き表の場合は、String[](30)を指定できます。また、最大長が20で各要素が255バイトを超えない索引付き表の場合は、oracle.sql.CHAR[20](255)を指定できます。

ユーザーの型マップに、スカラーの索引付き表であるPL/SQL型および対応するJava配列型の間の対応付けを指定する指示を追加するには、JPublisherの-addtypemapオプションを使用します。前述の構文を使用して指定したサイズ・ヒントは生成されるSQLJクラスに埋め込まれるため、実行時にJDBCに与えられます。

一例として、HRスキーマ内のINDEXBY PL/SQLパッケージの定義から抜粋した次のコード部分を考えてみます。このコードがindexby.sqlというファイルで使用可能であるとします。

CREATE OR REPLACE PACKAGE indexby AS

--  jpub.addtypemap=HR.INDEXBY.VARCHAR_ARY:String[1000](4000)
--  jpub.addtypemap=HR.INDEXBY.INTEGER_ARY:int[1000]
--  jpub.addtypemap=HR.INDEXBY.FLOAT_ARY:double[1000]

TYPE varchar_ary IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
TYPE integer_ary IS TABLE OF INTEGER        INDEX BY BINARY_INTEGER;
TYPE float_ary   IS TABLE OF NUMBER         INDEX BY BINARY_INTEGER;

FUNCTION get_float_ary RETURN float_ary;
PROCEDURE pow_integer_ary(x integer_ary, y OUT integer_ary);
PROCEDURE xform_varchar_ary(x IN OUT varchar_ary);

END indexby;
/
CREATE OR REPLACE PACKAGE BODY indexby IS ...
/

3つの索引付き表の型のマッピングに必要な-addtypemapディレクティブを次に示します。

-addtypemap=HR.INDEXBY.VARCHAR_ARY:String[1000](4000)
-addtypemap=HR.INDEXBY.INTEGER_ARY:int[1000]
-addtypemap=HR.INDEXBY.FLOAT_ARY:double[1000]

使用中のオペレーティング・システム・シェルによっては、大カッコ[...]や丸カッコ(...)を含むオプションを引用符で囲む必要があるため注意してください。この種のオプションを次のようにJPublisherのプロパティ・ファイルに挿入すると、引用符で囲まずにすみます。

jpub.addtypemap=HR.INDEXBY.VARCHAR_ARY:String[1000](4000)
jpub.addtypemap=HR.INDEXBY.INTEGER_ARY:int[1000]
jpub.addtypemap=HR.INDEXBY.FLOAT_ARY:double[1000]

関連項目:
「プロパティ・ファイルの構造および構文」および「ユーザー型マップへの追加エントリ」

また、便利な機能として、プロパティ・ファイル内のJPublisherディレクティブは、接頭辞--(2つのハイフン)を付けると認識されますが、jpub.または-- jpub.で始まらないエントリは無視されます。そのため、JPublisherディレクティブをSQLスクリプトに挿入し、同じSQLスクリプトをJPublisherのプロパティ・ファイルとして再利用できます。したがって、次のように、INDEXBYパッケージを定義するためにindexby.sqlスクリプトを起動した後、JPublisherを実行して、このパッケージをJavaクラスIndexByとして公開できます。

% jpub -u hr -s INDEXBY:IndexBy -props=indexby.sql
Enter hr password: password

前述のように、スカラーの索引付き表のマッピングは、Oracle JDBCドライバでのみ使用できます。他のドライバを使用している場合や、ドライバに依存しないコードを作成する場合は、索引付き表の型に対応するSQL型と、2つの型の間でマップする変換ファンクションを定義する必要があります。

関連項目:
「PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート」

PL/SQL変換ファンクションを介した型マッピングのサポート

この項では、JPublisherでJavaコード内のPL/SQL型をサポートするために使用されるメカニズムについて説明します。このメカニズムでは、JDBCからアクセスできるように各PL/SQL型および対応するSQL型の間で変換を行うPL/SQL変換ファンクションが使用されます。

通常、Javaプログラムでは、PL/SQL固有の型のバインドをサポートしていません。この種の型をJavaから使用するには、PL/SQLコードを使用してSQL型にマップし、これらのSQL型にJavaからアクセスする必要があります。ただし、1つの例外はスカラーの索引付き表の型です。

JPublisherでは、型マップの使用により、このタスクが簡単になります。特定のPL/SQL型の場合、JPublisherの型マップ・エントリに次の情報を指定します。

- PL/SQLの型の名前(通常は次の書式を使用)

SCHEMA.PACKAGE.TYPE

- 対応するJavaラッパー・クラスの名前

- PL/SQLの型に対応するSQL型の名前
この型をJavaラッパー型に直接マップできるようにする必要があります。たとえば、SQL型がNUMBERの場合、対応するJava型はint、double、Integer、Double、java.math.BigDecimalまたはoracle.sql.NUMBERとなります。SQL型がオブジェクト型の場合、対応するJava型はoracle.sql.ORADataまたはjava.sql.SQLDataインタフェースを実装するオブジェクト・ラッパー・クラスとなります。通常、このオブジェクト・ラッパー・クラスはJPublisherにより生成されます。

- SQL型をPL/SQL型にマップするPL/SQL変換ファンクションの名前

- PL/SQL型をSQL型にマップするPL/SQL変換ファンクションの名前

この-addtypemapは、次の書式で指定します。

-addtypemap=plsql_type:java_type:sql_type:sql_to_plsql_fun:plsql_to_sql_fun

関連項目:
「型マップ・オプション」

たとえば、PL/SQLのBOOLEAN型をサポートするための型マップ・エントリを考えてみます。これは次の指定で構成されます。

- PL/SQL型の名前(BOOLEAN)

- Javaのbooleanにマップするための指定

- 対応するSQL型(INTEGER)
JDBCでは、boolean値は特殊な数値とみなされます。

- SQLからPL/SQLにマップするPL/SQLファンクションの名前(INT2BOOL)
ファンクションのコードは次のとおりです。

FUNCTION int2bool(i INTEGER) RETURN BOOLEAN IS
BEGIN IF i IS NULL THEN RETURN NULL;
ELSE RETURN i<>0;
END IF;
END int2bool;

- PL/SQLからSQLにマップするPL/SQLファンクションの名前(BOOL2INT)
ファンクションのコードは次のとおりです。

FUNCTION bool2int(b BOOLEAN) RETURN INTEGER IS
BEGIN IF b IS NULL THEN RETURN NULL;
ELSIF b THEN RETURN 1;
ELSE RETURN 0;
END IF;
END bool2int;

前述の指定をすべて次の型マップ・エントリに使用できます。

-addtypemap=BOOLEAN:boolean:INTEGER:INT2BOOL:BOOL2INT

この型マップ・エントリでは、SQL型、Java型、2つの変換ファンクションが、それぞれSQL、JavaおよびPL/SQLで定義されているものとみなされます。PL/SQLのBOOLEANに関するエントリは、すでにJPublisherのデフォルトの型マップに存在することに注意してください。前述の型マップ・エントリをテストする場合は、デフォルトの型マップをオーバーライドする必要があります。この操作には、JPublisherの-defaulttypemapオプションを次のようにして使用できます。

% jpub -u hr -s SYS.SQLJUTL:SQLJUtl -defaulttypemap=BOOLEAN:boolean:INTEGER:INT2BOOL:BOOL2INT
Enter hr password: password

注意:

- 前述の例のINT2BOOLやBOOL2INTの場合など、JPublisherで変換ファンクションが(通常はSYS.SQLJUTLパッケージ内で)事前定義されている場合があります。その他、RECORD型および索引付き表の型などの場合は、JPublisherが実行中に変換ファンクションを生成します。

- このマニュアルでは、SQL型とPL/SQL型の間のマッピングとしての変換について説明していますが、このアプローチにPL/SQL限定という制限事項はありません。様々なSQL型の間でもマップできます。事実、JPublisherのデフォルトの型マップでは、VARCHAR2値との間でマップされるSQLのINTERVAL型をサポートするために、このマッピングが行われています。

PL/SQLのラッパー・ファンクションもJPublisherにより作成される場合があることに注意してください。各ラッパー・ファンクションが、PL/SQL型を使用するストアド・プロシージャをラップします。これが元のストアド・プロシージャをコールして、適切な変換ファンクションを使用して対応するSQL型のみがJavaに公開されるようにそのPL/SQLの出入力を処理します。次のJPublisherオプションでは、PL/SQL型を使用するPL/SQLストアド・プロシージャをコールするコードのJPublisherによる作成方法が制御されます。これには、変換ファンクションの使用方法やラッパー・ファンクションの使用方法なども含まれます。

- -plsqlpackage=plsql_package
このオプションでは、JPublisherでPL/SQL変換ファンクションが生成されるPL/SQLパッケージの名前を指定します。これは、サポートされない各PL/SQL型を対応するSQL型に変換するファンクションと、対応する各SQL型をPL/SQL型に変換するファンクションです。オプションで、-plsqlmapオプションの設定によっては、パッケージに元のストアド・プロシージャのラッパー・ファンクションも含まれます。各ラッパー・ファンクションにより、該当する変換ファンクションがコールされます。

パッケージ名を指定しないと、JPublisherはJPUB_PLSQL_WRAPPERを使用します。

- -plsqlfile=plsql_wrapper_script,plsql_dropper_script
このオプションでは、JPublisherにより作成されるラッパー・スクリプトおよび削除スクリプトの名前を指定します。ラッパー・スクリプトにより、サポートされないPL/SQL型にマップするために必要なSQL型と、PL/SQLパッケージも作成されます。削除スクリプトでは、これらのSQL型およびPL/SQLパッケージが削除されます。

このファイルが存在している場合は、上書きされます。ファイル名を指定しないと、JPublisherはplsql_wrapper.sqlおよびplsql_dropper.sqlという名前のファイルに書き込みます。

- -plsqlmap=flag
このオプションでは、JPublisherでPL/SQL型を使用するストアド・プロシージャのラッパー・ファンクションを生成するかどうかを指定します。各ラッパー・ファンクションは、対応するストアド・プロシージャと、ストアド・プロシージャのPL/SQLの出入力用の適切なPL/SQL変換ファンクションをコールします。対応するSQL型のみがJavaに公開されます。flagには、次のいずれかを設定できます。

- true
これはデフォルト設定です。必要な場合にのみPL/SQLラッパー・ファンクションが生成されます。指定のストアド・プロシージャをコールしてPL/SQL型を直接変換するJavaコードが単純で、かつ、PL/SQL型がINパラメータまたはファンクションの戻り値にのみ使用される場合、生成されるコードはかわりにストアド・プロシージャを直接コールします。その後、該当する変換ファンクションを介してPL/SQLの出入力を処理します。

PL/SQL型がOUTまたはIN OUTパラメータとして使用される場合は、元のストアド・プロシージャをコールする前または後にPL/SQL表現とSQL表現の間で変換する必要があるため、ラッパー・ファンクションが必要です。

- false
PL/SQLラッパー・ファンクションは生成されません。シグネチャ内にダイレクト・コールと変換でサポートできないPL/SQL型が検出された場合、その特定のストアド・プロシージャに対するJavaコードの生成は省略されます。

- always
PL/SQL型を使用するストアド・プロシージャごとに、PL/SQLラッパー・ファンクションが生成されます。この設定は、オリジナルのPL/SQLパッケージを補完するプロキシPL/SQLパッケージを生成する場合に役立ちます。オリジナル・パッケージ内でJDBCを介してアクセスできないファンクションまたはプロシージャについては、JDBCでアクセス可能なシグネチャが提供されます。

関連項目:
「PL/SQL変換ファンクションを直接使用する場合とラッパー・ファンクションを使用する場合」および「PL/SQLコード生成オプション」

PL/SQLのRECORD型と索引付き表の型の型マッピング・サポート

JPublisherでは、PL/SQLのRECORD型を引数または戻り型として使用するPL/SQLストアド・プロシージャまたはファンクションを公開するたびに、この型を自動的に公開します。これは、PL/SQLの索引付き表の型の場合も同じです。RECORD型または索引付き表を公開する唯一の方法となります。この種の型の公開をJPublisherのオプション設定を使用して明示的に要求する方法はありません。

注意:
JPublisherにおけるPL/SQLのRECORD型および索引付き表の型のサポートには、次の制限があります。

- RECORDまたは索引付き表の引数からJDBCでサポート可能なSQL型へのマッピングには、中間的なラッパー・レイヤーが必要です。また、JPublisherでは、索引付き表のセマンティクスは完全にはサポートされません。索引付き表の構造はJavaのハッシュテーブルに似ていますが、JPublisherによりSQLのTABLE型にマップされると情報が失われます。

- JDBC OCIドライバを使用し、スカラーの索引付き表の公開のみが必要な場合は、Javaとこれらの型の間で直接のマッピングを使用できます。

次の項では、JPublisherでのPL/SQLのRECORD型と索引付き表の型のサポートについて説明します。

- RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ

- RECORD型のサポート

- 索引付き表の型のサポート

RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ

次のPL/SQLパッケージを使用して、PL/SQLのRECORD型と索引付き表の型に対するJPublisherのサポート例を示します。

CREATE OR REPLACE PACKAGE company IS
TYPE emp_rec IS RECORD (empno NUMBER, ename VARCHAR2(10));
TYPE emp_tbl IS TABLE OF emp_rec INDEX BY binary_integer;
PROCEDURE set_emp_rec(er emp_rec);
FUNCTION get_emp_rec(empno number) RETURN emp_rec;
FUNCTION get_emp_tbl RETURN emp_tbl;
END;

このパッケージでは、PL/SQLのRECORD型EMP_RECおよびPL/SQLの索引付き表の型EMP_TBLが定義されています。次のコマンドを使用してCOMPANYパッケージを公開します。

% jpub -u hr -s COMPANY:Company -plsqlpackage=WRAPPER1
-plsqlfile=wrapper1.sql,dropper1.sql
Enter hr password: password

JPublisherの出力は次のとおりです。

HR.COMPANY
HR."COMPANY.EMP_REC"
HR."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER1 to file wrapper1.sql.
Wrote the dropping script to file dropper1.sql

この例では、JPublisherによりCOMPANYパッケージのJavaラッパー・クラス用のCompany.javaと次のSQLおよびJavaエンティティが生成されます。

- wrapper1.sqlスクリプト。このスクリプトにより、PL/SQLのRECORD型と索引付き表の型に対応するSQL型が作成され、SQL型とPL/SQL型の間の変換ファンクションも作成されます。

- dropper1.sqlスクリプト。このスクリプトでは、wrapper1.sqlにより作成されたSQL型と変換ファンクションが削除されます。

- CompanyEmpRec.javaソース・ファイル。PL/SQLのRECORD型用に生成されるSQLオブジェクト型のJavaラッパー・クラスが含まれます。

- CompanyEmpTbl.javaソース・ファイル。PL/SQLの索引付き表の型用に生成されるSQLコレクション型のJavaラッパー・クラスが含まれます。

RECORD型のサポート

この項では、「RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ」の例を引き続き説明します。PL/SQLのRECORD型EMP_RECの場合、JPublisherでは対応するSQLオブジェクト型 COMPANY_EMP_RECが生成されます。また、両者間の変換ファンクションも生成されます。この例では、wrapper1.sql内でEMP_REC用に次のように生成されます。

CREATE OR REPLACE TYPE COMPANY_EMP_REC AS OBJECT (
EMPNO NUMBER(22),
ENAME VARCHAR2(10)
);
/
-- Declare package containing conversion functions between SQL and PL/SQL types
CREATE OR REPLACE PACKAGE WRAPPER1 AS
-- Declare the conversion functions the PL/SQL type COMPANY.EMP_REC
FUNCTION PL2COMPANY_EMP_REC(aPlsqlItem COMPANY.EMP_REC)
RETURN COMPANY_EMP_REC;
FUNCTION COMPANY_EMP_REC2PL(aSqlItem COMPANY_EMP_REC)
RETURN COMPANY.EMP_REC;
END WRAPPER1;
/

また、SQLオブジェクト型COMPANY_EMP_RECがJavaソース・ファイルCompanyEmpRec.javaに公開されます。

PL/SQLのRECORD型が公開された後、マッピングを型マップに追加できます。JPublisherのサンプル・プロパティ・ファイルdone.propertiesのエントリを次に示します。

jpub.addtypemap=HR.COMPANY.EMP_REC:CompanyEmpRec:COMPANY_EMP_REC:
WRAPPER1.COMPANY_EMP_REC2PL:WRAPPER1.PL2COMPANY_EMP_REC

RECORD型EMP_RECを参照するパッケージまたは型を公開するときには、この型マップ・エントリを使用します。たとえば次のJPublisherコールでは、この型マップ・エントリとともにdone.propertiesが使用されています。

% jpub -u hr -p done.properties -s COMPANY -plsqlpackage=WRAPPER2
-plsqlfile=wrapper2.sql,dropper2.sql
Enter hr password: password

JPublisherの出力は次のとおりです。

HR.COMPANY
HR."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER2 to file wrapper2.sql.
Wrote the dropping script to file dropper2.sql

索引付き表の型のサポート

この項では、「RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ」の例を引き続き説明します。

索引付き表の型をサポートするには、PL/SQLの索引付き表の型との間の変換が可能なSQLコレクション型を定義する必要があります。JPublisherでは、PL/SQLのネストした表とVARRAYも同じ方法でサポートされます。そのため、次に示すEMP_TBLの3つの定義の場合、実際には同じコードが生成されます。

TYPE emp_tbl IS TABLE OF emp_rec INDEX BY binary_integer;
TYPE emp_tbl IS TABLE OF emp_rec;
TYPE emp_tbl IS VARRAY OF emp_rec;

PL/SQLの索引付き表の型EMP_TBLの場合、JPublisherではSQLコレクション型、および索引付き表の型とSQLコレクション型の間の変換ファンクションが生成されます。

前述のRECORD型の説明で示したファンクションに加えて、JPublisherでは次のファンクションが生成されます。

-- Declare the SQL type for the PL/SQL type COMPANY.EMP_TBL
CREATE OR REPLACE TYPE COMPANY_EMP_TBL AS TABLE OF COMPANY_EMP_REC;
/
-- Declare package containing conversion functions between SQL and PL/SQL types
CREATE OR REPLACE PACKAGE WRAPPER1 AS
-- Declare the conversion functions for the PL/SQL type COMPANY.EMP_TBL
FUNCTION PL2COMPANY_EMP_TBL(aPlsqlItem COMPANY.EMP_TBL)
RETURN COMPANY_EMP_TBL;
FUNCTION COMPANY_EMP_TBL2PL(aSqlItem COMPANY_EMP_TBL)
RETURN COMPANY.EMP_TBL;
...
END WRAPPER1;

さらに、SQLコレクション型がCompanyEmpTbl.javaに公開されます。

PL/SQLのRECORD型の場合と同様に、PL/SQLの索引付き表の型が公開されると、公開結果(Javaラッパー・クラス、SQLコレクション型および変換ファンクションなど)を使用して、そのPL/SQLの索引付き表の型が関係するPL/SQLパッケージを公開できます。たとえば、JPublisherの起動に使用するプロパティ・ファイル(たとえばdone.properties)に次のエントリを追加すると、JPublisherでは指定した型マップが使用され、その索引付き表の型は再公開されません。

jpub.addtypemap=HR.COMPANY.EMP_TBL:CompanyEmpTbl:COMPANY_EMP_TBL:
WRAPPER1.COMPANY_EMP_TBL2PL:WRAPPER1.PL2COMPANY_EMP_TBL

関連項目:
「JPublisherのユーザー型マップとデフォルトの型マップ」

PL/SQL変換ファンクションを直接使用する場合とラッパー・ファンクションを使用する場合

PL/SQL型を使用するストアド・プロシージャの起動コードをJavaで生成する場合、JPublisherでは次のいずれかの操作モードを使用できます。

- ストアド・プロシージャを直接コールし、これが該当する変換ファンクションを介してPL/SQLの出入力を処理します。

- PL/SQLラッパー・ファンクションをコールし、ラッパー・ファンクションはストアド・プロシージャをコールし、該当する変換ファンクションを介してPL/SQLの出入力を処理します。JPublisherにより生成されるラッパー・ファンクションは、対応するSQL型を出入力に使用します。

JPublisherで最初のモードを使用するか、第2のモードを使用するか、あるいはどちらのモードも使用しないかは、-plsqlmapオプションで状況に応じて指定します。

関連項目:
「PL/SQLラッパー・ファンクションの生成」

一例として、PL/SQLの索引付き表の型EMP_TBLを戻すPL/SQLストアド・プロシージャHR.COMPANY.GET_EMP_TBLを考えてみます。「RECORD型と索引付き表の型のサポートを示すサンプル・パッケージ」で紹介したCOMPANYパッケージが、JPublisherで次のコマンドを使用して処理されるとします。

% jpub -u hr -s COMPANY:Company -plsqlpackage=WRAPPER1
-plsqlfile=wrapper1.sql,dropper1.sql -plsqlmap=false
Enter hr password: password

JPublisherの出力は次のとおりです。

HR.COMPANY
HR."COMPANY.EMP_REC"
HR."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER1 to file wrapper1.sql.
Wrote the dropping script to file dropper1.sql

このコマンドにより、JPublisherでは次の要素が作成されます。

- PL/SQLのRECORD型EMP_RECにマップするSQLオブジェクト型COMPANY_EMP_REC

- PL/SQLの索引付き表の型EMP_TBLにマップするSQLコレクション型COMPANY_EMP_TBL

- COMPANY、COMPANY_EMP_RECおよび COMPANY_EMP_TBLにマップするJavaクラス

- PL/SQLの索引付き表の型とSQLコレクション型の間で変換を行うPL/SQL変換ファンクションを含むPL/SQLパッケージWRAPPER1

この例では、変換ファンクションPL2COMPANY_EMP_TBLがPL/SQLのEMP_TBL型をSQLのCOMPANY_EMP_TBL型に変換します。-plsqlmap=falseに設定されているため、ラッパー・ファンクションは作成されません。生成されたJavaコードでは、次のJDBC文を使用してストアド・プロシージャがコールされます。

conn.prepareOracleCall =
("BEGIN :1 := WRAPPER1.PL2COMPANY_EMP_TBL(HR.COMPANY.GET_EMP_TBL()) \n; END;");

HR.COMPANY.GET_EMP_TBLが直接にコールされ、そのEMP_TBL出力がPL2COMPANY_EMP_TBL変換ファンクションで処理されて必要なSQL型COMPANY_EMP_TBLが戻されます。

これに対して、-plsqlmap=alwaysに設定してJPublisherを実行すると、WRAPPER1にもPL/SQL型を使用するPL/SQLストアド・プロシージャごとにPL/SQLラッパー・ファンクションが含まれます。この場合、指定のストアド・プロシージャについて生成されたJavaコードは、ストアド・プロシージャではなくラッパー・ファンクションをコールします。この例のラッパー・ファンクションWRAPPER1.GET_EMP_TBLは、元のストアド・プロシージャをコールし、その出力を変換ファンクションを介して処理します。

FUNCTION  GET_EMP_TBL()
BEGIN
RETURN WRAPPER1.PL2COMPANY_EMP_TBL(HR.COMPANY.GET_EMP_TBL())
END;

生成されたJavaコードでは、ラッパー・ファンクションをコールするJDBC文は次のようになります。

conn.prepareOracleCall("BEGIN :1=HR.WRAPPER1.GET_EMP_TBL() \n; END;");

-plsqlmap=trueの場合、JPublisherでは、可能な場合は元のストアド・プロシージャへのダイレクト・コールが使用されます。ただし、直接コールして変換するためのJavaコードが複雑すぎるストアド・プロシージャや、PL/SQL型をOUTまたはIN OUTパラメータとして使用するストアド・プロシージャの場合、JPublisherではラッパー・ファンクションが生成され、そのファンクションが生成されたコード内でコールされます。

JDBCでサポートされないデータ型に対するその他の代替方法

JDBCでサポートされないPL/SQL型にアクセスするためにJPublisherで使用されるメカニズムについては前述しました。この方法でJPublisherを使用するかわりに、次のいずれかの方法を使用できます。

- その型を使用しないようにPL/SQLメソッドを書きなおします。

- 次のような無名ブロックを記述します。

- JDBCでサポートされる入力タイプを、PL/SQLストアド・プロシージャで使用される入力タイプに変換します。

- PL/SQLストアド・プロシージャで使用される出力タイプを、JDBCでサポートされる出力タイプに変換します。

JPublisherのスタイルとスタイル・ファイル

JPublisherのスタイル・ファイルを使用すると、Java間の型マッピングを指定できます。これにより、生成されるクラスをWebサービスで確実に使用できます。一例として、java.sql.Clobやoracle.sql.CLOBなどのCLOB型はWebサービスで使用できませんが、java.lang.StringなどのWebサービスでサポートされている型に変換すると、データを使用できます。JPublisherでは、スタイル・ファイルとJava間の型変換の使用を実装するユーザー・サブクラスを生成する必要があります。

通常、スタイル・ファイルはOracleに用意されていますが、編集や独自作成が必要になる場合があります。

次の項では、スタイルとスタイル・ファイルの機能および使用方法について説明します。

- スタイル・ファイルの指定と位置

- スタイル・ファイルの形式

- Oracleスタイル・ファイルでの主要なJava間の型マッピングのサマリー

- 複数のスタイル・ファイルの使用

スタイル・ファイルの指定と位置

JPublisherの-styleオプションを使用してスタイル・ファイル名を指定します。

-style=stylename

JPublisherでは、指定したstylenameに基づいて次のようにスタイル・ファイルが検索され、最初に検出されたファイルが使用されます。

1. CLASSPATH内で次のリソースが検索されます。

/oracle/jpub/mesg/stylename.properties

2. リソース名または修飾リソース名としてstylenameを使用し、CLASSPATH内で次のリソースが検索されます。

/stylename-dir/stylename-base.properties

3. ファイル名または修飾ファイル名としてstylenameを使用し、カレント・ディレクトリ内で次のファイルが検索されます。

stylename.properties

この場合、stylenameには必要に応じてディレクトリ・パスを含めることができます。たとえば-style=mydir/foo設定を使用すると、カレント・ディレクトリに相対のmydir/foo.propertiesが検索されます。

一致するファイルが見つからない場合は、例外が生成されます。

関連項目:
「Java間の型マッピング用のスタイル・ファイル」

最初の使用例で、リソース/oracle/jpub/mesg/webservices.propertiesがORACLE_HOME/sqlj/lib/translator.jarに存在し、CLASSPATH内でtranslator.jarが検出されると、-style=webservices設定では、カレント・ディレクトリにwebservices.propertiesファイルが存在する場合でもtranslator.jarの/oracle/jpub/mesg/webservices.propertiesが使用されます。

ただし、-style=mystyleを指定すると、/oracle/jpub/mesg内でリソースmystyle.propertiesが検出されない場合にも、mystyle.propertiesファイルがカレント・ディレクトリにあれば、それが使用されます。

注意:
現在、Oracleには次の3つのスタイル・ファイルが用意されています。

/oracle/jpub/mesg/webservices-common.properties
/oracle/jpub/mesg/webservices10.properties
/oracle/jpub/mesg/webservices9.properties

これらはtranslator.jarファイル内にあり、このファイルをCLASSPATHに含める必要があります。各ファイルが、Oracle JDBC型をWebサービスでサポートされるJava型にマップします。webservices-common.propertiesファイルは汎用であり、webservices10.propertiesおよびwebservices9.propertiesの両方に含まれていることに注意してください。

Oracle Database 12cでWebサービスを使用するには、次のスタイル・ファイルを指定します。

-style=webservices10

Oracle9iのWebサービスを使用するには、-style=webservices9を指定します。

スタイル・ファイルの形式

スタイル・ファイルの主要部分はTRANSFORMATIONセクションです。このセクションは、TRANSFORMATIONタグとEND_TRANSFORMATIONタグの間のすべてです。ここには、オブジェクト属性またはメソッドのシグネチャに使用される型に適用される型変換、つまりJava間のマッピングが記述されています。

利便性を考慮してOPTIONSセクションが用意されており、ここにその他のJPublisherオプション設定を指定できます。このセクションにより、スタイル・ファイルでは、マッピングの指定に加えて他のJPublisherプロパティ・ファイルの機能を置き換えることができます。

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

- スタイル・ファイルのTRANSFORMATIONセクション

- スタイル・ファイルのOPTIONSセクション

注意:
以下の説明はスタイル・ファイルに関する一般的な情報です。この情報は変更される可能性があります。

スタイル・ファイルのTRANSFORMATIONセクション

この項では、スタイル・ファイルのTRANSFORMATIONセクションのテンプレートをコメント付きで提供します。TRANSFORMATIONセクションには、指定する各マッピング用のMAPPINGセクションがあります。MAPPINGセクションはMAPPINGタグで始まり、END_MAPPINGタグで終わります。各MAPPINGセクションには、多数のサブタグおよび追加情報が含まれています。MAPPINGセクションでは、SOURCETYPEタグおよびTARGETTYPEタグが必須のサブタグです。通常は、各TARGETTYPEセクションで、少なくともRETURN、INおよびOUTのケース情報をそれぞれ対応するタグを使用して指定します。次のコードでは、一般的なTRANSFORMATIONセクションの構造を示します。

TRANSFORMATION

IMPORT
# Packages to be imported by the generated classes
END_IMPORT

# THE FOLLOWING OPTION ONLY APPLIES TO PL/SQL PACKAGES
# This interface should be implemented/extended by
# the methods in the user subclasses and interfaces
# This option takes no effect when subclass is not generated.
SUBCLASS_INTERFACE java_interface

# THE FOLLOWING OPTION ONLY APPLIES TO PL/SQL PACKAGES
# Each method in the interface and the user subclass should
# throw this exception (the default SQLException will be caught
# and re-thrown as an exception specified here)
# This option takes no effect when subclass is not generated.
SUBCLASS_EXCEPTION Java_exception_type

STATIC
# Any code provided here is inserted at the
# top level of the generated subclass regardless
# of the actual types used.
END_STATIC

# Enumerate as many MAPPING sections as needed.

MAPPING
SOURCETYPE Java_source_type
# Can be mapped to several target types.
TARGETTYPE Java_target_type

# With CONDITION specified, the source-to-target
# mapping is carried out only when the listed Java
# classes are present during publishing.
# The CONDITION section is optional.
CONDITION list_of_java_classes

IN
# Java code for performing the transformation
# from source type argument %1 to the target
# type, assigning it to %2.
END_IN
IN_AFTER_CALL
# Java code for processing IN parameters
# after procedure call.
END_IN_AFTER_CALL
OUT
# Java code for performaing the transformation
# from a target type instance %2 to the source
# type, assigning it to %1.
END_OUT
RETURN
# Java code for performing the transformation
# from source type argument %1 to the target
# type and returning the target type.
END_RETURN

# Include the code given by a DEFINE...END_DEFINE block
# at the end of this template file.
USE defined_name

# Holder for OUT/INOUT of the type defined by SOURCETYPE.
HOLDER Java_holder_type
END_TARGETTYPE

# More TARGETTYPE sections, as needed

END_MAPPING

DEFAULT_HOLDER
# JPublisher will generate holders for types that do
# not have HOLDER entries defined in this template.
# This section includes a template for class definitions
# from which JPublisher will generate .java files for
# holder classes.
END_DEFAULT_HOLDER

# More MAPPING sections, as needed

DEFINE defined_name
# Any code provided here is inserted at the
# top level of the generated class if the
# source type is used.
END_DEFINE
# More DEFINE sections, as needed

END_TRANSFORMATION

注意:

- スタイル・ファイルには、ISO8859_1エンコーディングを使用します。このエンコーディングで直接表すことのできない文字は、Unicodeエスケープ・シーケンスで表す必要があります。

- 複数のMAPPINGセクションで同じSOURCETYPEを指定できます。引数の型の場合、JPublisherでは最後に検出されたMAPPINGセクションが使用されます。

関連項目:
ホルダーの詳細は、「JAX-RPCホルダーを使用した出力パラメータ渡し」を参照してください。

スタイル・ファイルのOPTIONSセクション

スタイル・ファイルのOPTIONSセクションでは、必要なJPublisherオプション設定をJPublisherプロパティ・ファイルの標準形式で指定できます。同様の構文は次のとおりです。

OPTIONS
# Comments
jpub.option1=value1
jpub.option2=value2
...
END_OPTIONS

Oracleスタイル・ファイルでの主要なJava間の型マッピングのサマリー

Oracleスタイル・ファイルwebservices-common.properties、webservices9.propertiesおよびwebservices10.propertiesには、それぞれのSOURCETYPEおよびTARGETTYPE指定を介して、Webサービス・サポート用の多数の重要なJava間の型マッピングおよびREF CURSORのマッピングが指定されています。これらのマッピングを表3-2にまとめてあります。

表3-2 Oracleスタイル・ファイルでのJava間の型マッピングのサマリー

ソースの型

ターゲットの型

oracle.sql.NString

java.lang.String

oracle.sql.CLOB

java.lang.String

oracle.sql.BLOB

byte[]

oracle.sql.BFILE

byte[]

java.sql.Timestamp

java.util.Date

java.sql.ResultSet

oracle.jdbc.rowset.OracleWebRowSet

org.w3c.dom.Document

javax.xml.transform.Source

関連項目:
「REF CURSOR型と結果セットのマッピング」

複数のスタイル・ファイルの使用

JPublisherでは、コマンドラインで複数の-styleオプションを使用して次の動作を指定できます。

- OPTIONSセクションの連結。

- TRANSFORMATIONセクションの連結。ただし、MAPPINGセクションのエントリは規定に従ってオーバーライドされます。後からコマンドラインで指定したスタイル・ファイルのMAPPINGエントリが、先にコマンドラインで指定したスタイル・ファイルの、同じSOURCETYPE指定を持つMAPPINGエントリをオーバーライドします。

この機能は、前に定義した型マッピングを上書きする場合や、新しい型マッピングを追加する場合に役立ちます。たとえば、SYS.XMLTYPEをjava.lang.Stringにマップする場合、-style=xml2stringの設定をJPublisherのコマンドラインに追加できます。この例では、./xml2string.propertiesスタイル・ファイルがアクセスされるものとします。このスタイル・ファイルの定義は次のとおりです。

OPTIONS
jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
END_OPTIONS
TRANSFORM
MAPPING
SOURCETYPE oracle.xdb.XMLType
TARGETTYPE java.lang.String
# XMLType => String
OUT
%2 = null;
if (%1!=null) %2=%1.getStringVal();
END_OUT
# String => XMLType
IN
%1 = null;
if (%2!=null)
{
%1 = new %p.%c(_getConnection());
%1 = %1.createXML(%2);
}
END_IN
END_TARGETTYPE
END_MAPPING
END_TRANSFORM

引き続き同じ例で、次のPL/SQLストアド・プロシージャが定義されているとします。

PROCEDURE foo (arg XMLTYPE);

このストアド・プロシージャはベース・クラスで次のようにマップされます。

void foo (arg oracle.xdb.XMLType);

また、ユーザー・サブクラスでは次のようにマップされます。

void foo (arg String);

注意:
JPublisherでは、デフォルトでSYS.XMLTYPEはoracle.xdb.XMLTypeにマップされます。

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

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

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

- JPublisher出力のフィルタ機能

- 下位互換性および移行

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

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

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

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

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

関連項目:

- 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では、クラスは生成できましたがインタフェースは生成できませんでした。

関連項目:
「Javaインタフェースの生成」

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

/oracle/jpub/mesg/webservices-common.properties
/oracle/jpub/mesg/webservices10.properties
/oracle/jpub/mesg/webservices9.properties

関連項目:
「JPublisherのスタイルとスタイル・ファイル」

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

関連項目:
「REF CURSOR型と結果セットのマッピング」

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

関連項目:
「JPublisher出力のフィルタ機能」

- データベース内の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つのモードでサポートされています。

関連項目:
「ネイティブJavaインタフェースを介したサーバー・サイドJavaクラスの公開」および「サーバー・サイドJavaのコール(コールイン)」

- SQL問合せまたはDML文の公開に対するサポート
JPublisherには、特定のSELECT、UPDATE、INSERTまたは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を指定します。

関連項目:
「Webサービスのコールアウトを容易にするオプション」

静的プロキシと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と同様に機能します。

関連項目:
「生成されるコード: サーバー・サイドJavaのコールイン」

JPublisher出力のフィルタ機能

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

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

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

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

- 生成されるメソッドの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メソッドとみなされないように、生成される一部のメソッドの名前が変更されます。そのために、メソッド名に接頭辞としてアンダースコア(_)が追加されます。

関連項目:
「JavaBeans仕様に準拠したコード生成」

下位互換性および移行

この項では、下位互換性、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の下位互換性

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

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

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

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

JPublisherの下位互換性

JPublisherランタイムは、ojdbc14.jar、ojdbc5.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.DBURITYPE、SYS.XDBURITYPEおよびSYS.HTTPURITYPEをjava.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

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

関連項目:
「PL/SQL変換ファンクションを介した型マッピングのサポート」および「型マップ・オプション」

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

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

関連項目:
「JPublisherによる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()メソッドをコールして接続コンテキスト・インスタンスを取得する必要があります。

関連項目:
「SQLJクラスでの接続コンテキストおよびインスタンス」

- -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が使用されます。
次の例では、UserClassがBaseClassを拡張するとします。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ファイルの明示的生成

- Oracle9i互換モード

- Oracle8i互換モード

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

関連項目:
「下位互換性オプション」

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

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

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

関連項目:
「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以降は削除されています。

関連項目:
「Oracle9i DatabaseとOracle Database 10gの間でのJPublisherの動作変更」

- 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のデフォルトの動作と同様に、階層内のカレント・ディレクトリに出力ファイルが生成されます。

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

- 「SQLJ接続コンテキスト・クラス」

- 「パッケージのクラスおよびラッパー・メソッドの生成」

- 「ユーザー定義型用の下位互換性を持つOracleマッピング」

- 「生成されたソース・ファイルとクラス・ファイルの出力ディレクトリ」

関連項目:
「Oracle8i互換モード」

5 生成されるクラスおよびインタフェース

この章では、JPublisherにより生成されるクラス、インタフェースおよびサブクラスについて説明します。この章の内容は、次のとおりです。

- 出力パラメータの取扱い

- オーバーロードされたメソッドの変換

- SQLJクラスの生成

- 非SQLJクラスの生成

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

- JPublisherのサブクラス

- 継承のサポート

出力パラメータの取扱い

Java Database Connectivity(JDBC)を介してコールされるストアド・プロシージャでは、通常のJavaメソッドと同じ方法ではパラメータは渡されません。このことは、JPublisherで生成されるラッパー・メソッドをコールするときに記述するコードに影響します。

通常のJavaメソッドをコールすると、Javaオブジェクトであるパラメータはオブジェクト参照として渡されます。そのメソッドでオブジェクトを変更できます。

ただし、JDBCを介してストアド・プロシージャをコールすると、各パラメータのコピーがストアド・プロシージャに渡されます。プロシージャでパラメータを変更する場合は、変更されたパラメータのコピーがコール元に戻されます。このため、変更されたパラメータの前および後の値は別々のオブジェクトとなります。

JPublisherで生成されるラッパー・メソッドには、対応するストアド・プロシージャをコールするためのJDBC文が含まれます。CREATE TYPEまたはCREATE PACKAGE宣言で宣言されたストアド・プロシージャに対するパラメータには、使用可能なパラメータ・モード、IN、OUTおよびIN OUTがあります。IN OUTまたはOUTのパラメータは、新規に作成されたオブジェクトのラッパー・メソッドに戻されます。これらの新規の値はコール元に戻す必要がありますが、ラッパー・メソッド内の仮パラメータはコール元で参照できる実際のパラメータには影響を与えません。

Javaの場合、OUTまたはIN OUTの指定はありませんが、ホルダーを介して値を戻すことができます。JPublisherでは、PL/SQLのOUTまたはIN OUTパラメータを処理するホルダーのかわりに、次の代替メカニズムのいずれかを指定できます。

- 配列

- Java API for XML-based Remote Procedure Call(JAX-RPC)ホルダー・タイプ

- ファンクションの戻り

-outargumentsオプションを使用すると、どのメカニズムを使用するかを指定できます。この機能はWebサービスに特に有効です。

関連項目:
「出力引数のホルダー型」

以降の各項では、この3つのメカニズムについて説明します。

- 配列を使用した出力パラメータ渡し

- JAX-RPCホルダーを使用した出力パラメータ渡し

- ファンクションの戻りを使用した出力パラメータ渡し

配列を使用した出力パラメータ渡し

Javaで出力値を戻すという問題を解決する場合、単一要素配列のラッパー・メソッドにOUTまたはIN OUTパラメータを渡す方法があります。配列は、パラメータを保持するコンテナとみなされます。このメカニズムは次のように動作します。

1. そのパラメータの前の値を配列の要素[0]に割り当てます。

2. 配列をラッパー・メソッドへ渡します。

3. ラッパー・メソッドはパラメータの後の値を配列の要素[0]に割り当てます。

4. メソッドを実行した後に配列から後の値を抽出します。

-outarguments=arrayの設定(デフォルト)は、JPublisherに対し、この単一要素配列メカニズムを使用してOUTまたはIN OUT引数を公開するように指示します。

たとえば、次のようにします。

Person [] pa = {p};
x.f(pa);
p = pa[0];

xがJPublisherで生成されたクラスのインスタンスで、このクラスのf()メソッドはIN OUTパラメータとしてSQLのPERSONオブジェクトを使用するストアド・プロシージャのラッパー・メソッドであるとします。PERSON型はPerson Javaクラスにマップされ、pはPersonのインスタンスで、paは単一要素のPerson配列です。

OUTまたはIN OUTパラメータを渡すためのこのメカニズムでは、パラメータごとにユーザー・プログラムのコードに何行か追加する必要があります。たとえば、次のSQL*Plusコマンドにより作成されたPL/SQLファンクションの例を考えてみます。

SQL> CREATE OR REPLACE FUNCTION g (
a0 NUMBER,
a1 OUT NUMBER,
a2 IN OUT NUMBER,
a3 CLOB,
a4 OUT CLOB,
a5 IN OUT CLOB)
RETURN CLOB IS
BEGIN
RETURN NULL;
END;

-outarguments=arrayに設定すると、これは次のように公開されます。

public oracle.sql.CLOB g (
java.math.BigDecimal a0,
java.math.BigDecimal a1[],
java.math.BigDecimal a2[],
oracle.sql.CLOB a3,
oracle.sql.CLOB a4[],
oracle.sql.CLOB a5[])

インスタンスのメソッドのthisオブジェクトに変更があると、前述のような問題が発生します。

thisオブジェクトは異なる方法で渡される追加パラメータです。CREATE TYPE文で宣言されるそのモードはINまたはIN OUTになります。thisオブジェクトのモードを明示的に宣言しない場合のモードは、ストアド・プロシージャが結果を戻さない場合にはIN OUT、結果を戻す場合はINになります。

thisオブジェクトのモードがIN OUTの場合、ラッパー・メソッドはthisの新規の値を戻す必要があります。JPublisherで生成されたコードでは、次のように状況に応じてこの機能が異なる方法で実装されます。

- 結果を戻さないストアド・プロシージャの場合、thisの新規の値がラッパー・メソッドの結果として戻されます。
たとえば、SQLオブジェクト型MYTYPEに次のメンバー・プロシージャがあるとします。

MEMBER PROCEDURE f1(y IN OUT INTEGER);

また、JPublisherで対応するJavaクラスMyJavaTypeが生成されるとします。このクラスでは、次のメソッドが定義されます。

MyJavaType f1(int[] y)

f1()メソッドは、変更後のthisオブジェクトの値をMyJavaTypeインスタンスとして戻します。

- ストアド・ファンクション(結果を戻すストアド・プロシージャ)の場合、ラッパー・メソッドは結果としてストアド・ファンクションの結果を戻します。thisの新規の値は単一要素の配列で戻され、ラッパー・メソッドに追加の引数(最後の引数)として渡されます。
SQLオブジェクト型MYTYPEに次のメンバー関数があるとします。

MEMBER FUNCTION f2(x IN INTEGER) RETURNS VARCHAR2;

対応するJavaクラスMyJavaTypeで次のメソッドが定義されます。

String f2(int x, MyJavaType[] newValue)

f2()メソッドはVARCHAR2値をJava文字列として戻し、変更後のthisオブジェクトの値をMyJavaType配列の配列要素として戻します。

注意:
PL/SQLの静的プロシージャまたはファンクションの場合、JPublisherではラッパー・クラスに静的メソッドではなくインスタンスのメソッドが生成されます。これは、データベース接続を各ラッパー・クラスのインスタンスに対応付けるための方法です。接続インスタンスはラッパー・クラスのインスタンスの初期化に使用されるため、ラッパー・メソッドをコールするときに、接続または接続コンテキスト・インスタンスを明示的に提供する必要はありません。

JAX-RPCホルダーを使用した出力パラメータ渡し

JAX-RPC仕様では、単純なXMLデータ型とその他の型のJavaマッピングについて、javax.xml.rpc.holdersパッケージ内でホルダー・クラスが明示的に指定されています。通常、ホルダー・クラス名の場合は、型名にHolderが追加されます。たとえば、BigDecimalHolderはBigDecimalのホルダー・クラスです。

-outarguments=holderに設定すると、JPublisherではホルダー・インスタンスを使用してストアド・プロシージャからのOUTおよびIN OUT引数が公開されます。ホルダー設定は、JPublisherスタイル・ファイル内で指定します。設定は、該当するマッピングのTARGETTYPEセクションのHOLDERサブタグ内で指定します。ホルダー・クラスを指定しない場合、JPublisherではデフォルトに従って選択されます。

関連項目:
「JPublisherのスタイルとスタイル・ファイル」

JAX-RPCおよびホルダーの概要は、次の場所で入手可能なJava API for XML-based RPC (JAX-RPC) 1.0仕様を参照してください。

http://jcp.org/aboutJava/communityprocess/final/jsr101/index.html

たとえば、次のSQL*Plusコマンドにより作成されたPL/SQLファンクションの例を考えてみます。

SQL> CREATE OR REPLACE FUNCTION g (
a0 NUMBER,
a1 OUT NUMBER,
a2 IN OUT NUMBER,
a3 CLOB,
a4 OUT CLOB,
a5 IN OUT CLOB)
RETURN CLOB IS
BEGIN
RETURN NULL;
END;

webservices10スタイル・ファイルに-outarguments=holderのエントリが含まれ、g()ファンクションを公開する次のJPublisherコマンドを使用するとします。

% jpub -u hr  -s toplevel"(g)":ToplevelG -style=webservices10
Enter hr password: password

公開されるインタフェースを次に示します。

public java.lang.String g
(java.math.BigDecimal a0,
javax.xml.rpc.holders.BigDecimalHolder _xa1_out_x,
javax.xml.rpc.holders.BigDecimalHolder _xa2_inout_x,
java.lang.String a3,
javax.xml.rpc.holders.StringHolder _xa4_out_x,
javax.xml.rpc.holders.StringHolder _xa5_inout_x)
throws java.rmi.RemoteException;

この場合は、追加の抽象レベルが存在します。oracle.sql.CLOBはWebサービスでサポートされないため、StringHolderのJAX-RPCホルダー・クラスであるStringにマップされます。

ファンクションの戻りを使用した出力パラメータ渡し

JAX-RPCホルダー型または配列を使用しないWebサービスでは、メソッドのシグネチャのサポートに対する回避策として-outarguments=return設定を使用できます。JAX-RPCホルダーのサポートがない場合は、-outarguments=return設定を使用するとOUT または IN OUTデータをファンクションの結果で戻すことができます。

次のSQL*Plusコマンドにより作成されたPL/SQLファンクションの例を考えてみます。

SQL> CREATE OR REPLACE FUNCTION g (
a0 NUMBER,
a1 OUT NUMBER,
a2 IN OUT NUMBER,
a3 CLOB,
a4 OUT CLOB,
a5 IN OUT CLOB)
RETURN CLOB IS
BEGIN
RETURN NULL;
END;

g()ファンクションを公開する次のJPublisherコマンドを考えてみます。webservices10スタイル・ファイルには-outarguments=holderが指定されていますが、-style設定の後に-outarguments=return設定があるため、この設定が優先されます。

% jpub -u hr  -s toplevel"(g)":ToplevelG -style=webservices10 -outarguments=return
Enter hr password: password

JPublisherの出力は次のようになります。

HR.top_level_scope
ToplevelGUser_g_Out

JPublisherの出力を調べると、HRのトップレベルが処理されることがわかります。また、戻りデータを介してg()ファンクションの出力値をサポートするためにToplevelGUser_g_Out Javaクラスが作成されることを示しています。

注意:

- ユーザー・クラス名に追加される_g_Outは、ファンクションの戻りで出力パラメータを渡す使用例で出力データを含むクラスを作成する場合の、JPublisherのネーミング規則に従っています。_gには処理されるファンクションの名前が反映され、_Outには対応するPL/SQLコール仕様のOUT修飾子が反映されています。したがって、ToplevelGUser_g_Outは、ToplevelGUserクラスのg()メソッドの出力データ用に作成されるJava型です。ユーザー・クラス名は、webservices10スタイル・ファイルで指定されたネーミング規則に従います。

- 通常、JPublisher出力には、処理されるSQLまたはPL/SQLエンティティの名前のみが反映されますが、ToplevelGUser_g_Outに直接対応するエンティティは存在しません。

JPublisherでは、入力パラメータを取って出力パラメータを戻す次のインタフェースが生成されます。

public ToplevelGUser_g_Out g
(java.math.BigDecimal a0,
java.math.BigDecimal xxa2_inoutxx,
java.lang.String a3,
java.lang.String xxa5_inoutxx)
throws java.rmi.RemoteException;

TopLevelGUser_g_Outクラスは次のように生成されます。

public class ToplevelGUser_g_Out{
public ToplevelGUser_g_Out() { }
public java.math.BigDecimal getA1Out()  { return a1_out; }
public void setA1Out(java.math.BigDecimal a1_out) { this.a1_out = a1_out; }
public java.math.BigDecimal getA2Inout()   { return a2_inout; }
public void setA2Inout(java.math.BigDecimal a2_inout)
{ this.a2_inout = a2_inout; }
public java.lang.String getA4Out()   { return a4_out; }}

ToplevelGUser_g_Out戻り型には、ファンクションのコール元に渡されるOUTおよびIN OUTパラメータの値がカプセル化されます。前の項のように、oracle.sql.CLOBはwebservices10スタイル・ファイルによりStringにマップされます。

オーバーロードされたメソッドの変換

PL/SQLでは、Javaと同様に、オーバーロードされたメソッド、つまり同じ名前でシグネチャが異なる2つ以上のメソッドを作成できます。ただし、PL/SQLで異なるシグネチャを持つ複数のオーバーロードされたメソッドが、Java(特にユーザー・サブクラス)で同じシグネチャを持つ場合があります。たとえば、次のPL/SQLストアド・プロシージャを考えてみます。

PROCEDURE foo(x CLOB);
PROCEDURE foo(x NCHAR);

JPublisherで-style=webservices-common設定を使用してこれらのストアド・プロシージャを処理すると、Javaではすべてが同じシグネチャを持つことになります。

void foo(String x);
void foo(String x);

関連項目:
「スタイル・ファイルの指定と位置」

JPublisherは、戻り型の1文目と各引数の型(該当する場合)の1文字目をメソッド名に追加し、この種の名前の競合を解決します。それでも競合が残る場合は、番号も追加されます。前述の競合は次のように解決されます。

void foo(String x);
void fooS(String x);

PL/SQLでは、同じファミリの型のオーバーロードが許可されないことに注意してください。たとえば、次の例は無効です。

PROCEDURE foo(x DECIMAL);
PROCEDURE foo(x INT);
PROCEDURE foo(x INTEGER);

かわりに、プロシージャを同じファミリからの戻り型を使用するファンクションとみなします。次の例は、引数の型が異なるため有効です。

FUNCTION foo(x FLOAT) RETURN DECIMAL;
FUNCTION foo(x VARCHAR2) RETURN INT;
FUNCTION foo(x Student_T) RETURN INTEGER;

デフォルトでは、これらはJavaメソッドに次のようにマップされます。

java.math.BigDecimal foo(Float x);
java.math.BigDecimal foo(String x);
java.math.BigDecimal foo(StudentT x);

JPublisherでは、シグネチャが異なるため、すべての名前にfoo()を使用できます。ただし、すべてのメソッド名を一意にする必要がある場合(Webサービスでは必須)、JPublisherの-methodsオプションにunique設定を使用します。-methods=に設定すると、各メソッドは前述のネーミング・メカニズムを使用して次のように公開されます。

java.math.BigDecimal foo(Float x);
java.math.BigDecimal fooBS(String x);
java.math.BigDecimal fooBS1(StudentT x);

関連項目:
「パッケージのクラスおよびラッパー・メソッドの生成」

SQLJクラスの生成

-methods=all(デフォルト)または-methods=true設定の場合、通常、JPublisherはORADataおよびSQLData実装を使用して、PL/SQLパッケージ用とオブジェクト型用のSQLJクラスを生成します。ただし、オブジェクト型にメソッドが定義されていない場合、SQLJクラスは生成されず、生成されるJavaクラスはSQLJランタイムを必要としません。

SQLJクラスには、オブジェクト型およびパッケージのサーバー・メソッド(ストアド・プロシージャ)をコールするラッパー・メソッドが含まれます。この項では、この種のクラスの使用方法について説明します。

関連項目:
「JPublisherによるSQLJ実装の使用」および「下位互換性オプション」

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

- SQLJクラスの生成に関する重要な注意事項

- PL/SQLパッケージ用のSQLJクラスの使用

- オブジェクト型用のSQLJクラスの使用

- SQLJクラスでの接続コンテキストおよびインスタンス

- setFrom()、setValueFrom()およびsetContextFrom()メソッド

SQLJクラスの生成に関する重要な注意事項

JPublisherで生成されるSQLJクラスについての注意事項は、次のとおりです。

- SQL型階層のJavaラッパー・クラスを生成する場合にいずれかの型にストアド・プロシージャが含まれていると、デフォルトでは、ストアド・プロシージャを含む型のみではなく、すべてのSQL型のSQLJクラスが生成されます。

注意:
JPublisherの-methods=false設定を使用すると、SQLJクラスの生成を明示的に抑制できます。この場合は、すべてが非SQLJクラスとなります。

- JPublisherに用意されているクラスには、release()メソッドが含まれています。JPublisherで生成されたラッパー・クラスのインスタンスが暗黙的にDefaultContextインスタンスを構成する場合は、release()メソッドを使用して、不要になった時点でこの接続コンテキスト・インスタンスを解放する必要があります。ただし、この使用例は、ラッパー・クラスのインスタンスを作成して使用する際に次の提案の1つ以上に従うことで回避できます。

- 明示的に提供するSQLJ接続コンテキストを使用してラッパー・クラスのインスタンスを構成します。

- setConnectionContext()メソッドを介して、ラッパー・クラスのインスタンスをSQLJ接続コンテキスト・インスタンスに明示的に対応付けます。

- ラッパー・クラスのインスタンスに静的なSQLJのデフォルト接続コンテキスト・インスタンスを暗黙的に使用します。これは、接続情報を指定しない場合に発生します。

関連項目:
「SQLJクラスでの接続コンテキストおよびインスタンス」

- Oracle8i互換モードでは、DefaultContextインスタンスまたはユーザー指定クラスのインスタンスを取るコンストラクタのかわりに、単にConnectionContextインスタンスを取るコンストラクタがあります。これは、DefaultContextクラスなど、標準sqlj.runtime.ConnectionContextインタフェースを実装するどのクラスのインスタンスでもかまいません。

PL/SQLパッケージ用のSQLJクラスの使用

JPublisherでPL/SQLパッケージ用に生成されるクラスを使用する場合は、次の手順を実行します。

1. クラスのインスタンスを構成します。

2. クラスのラッパー・メソッドをコールします。

クラスのコンストラクタは、データベース接続をクラスのインスタンスに対応付けます。SQLJ DefaultContextインスタンス、またはJPublisherの実行時に-contextオプションで指定したクラスのインスタンスを取るコンストラクタがあります。JDBC Connectionインスタンスを取るコンストラクタもあります。また、引数を取らないコンストラクタもあります。引数のないコンストラクタをコールするのは、DefaultContextインスタンスを取るコンストラクタにSQLJのデフォルト・コンテキストを渡すのと同じです。JPublisherには、接続コンテキストやデフォルト・コンテキストなどのSQLJ概念をよく理解していないJDBCプログラマが使用しやすいように、Connectionインスタンスを使用するコンストラクタが用意されています。

関連項目:
「SQLJクラスの生成に関する重要な注意事項」

thisオブジェクトの接続コンテキストがラッパー・メソッドで使用されているため、ラッパー・メソッドはすべてインスタンス・メソッドになります。

PL/SQLパッケージ用に生成されたクラスには、接続コンテキスト以外のインスタンス・データがないため、通常は使用する接続コンテキストごとにクラス・インスタンスを1つ構成します。デフォルトのコンテキストが唯一の使用するコンテキストである場合は、引数のないコンストラクタを1度コールできます。

PL/SQLパッケージ用に生成されたクラスのインスタンスには、PL/SQLパッケージ変数のコピーは含まれていません。それはORADataクラスでもSQLDataクラスでもなく、ホスト変数としても使用できません。

オブジェクト型用のSQLJクラスの使用

JPublisherでSQLオブジェクト型またはSQL OPAQUE型用に生成されたJavaクラスのインスタンスを使用するには、最初にJavaオブジェクトを初期化する必要があります。そのためには、次の方法があります。

- Javaオブジェクトに対して初期化済のJavaオブジェクトを割り当てます。

- SQLオブジェクトのコピーを次の方法でJavaオブジェクトに取り込みます。SQLオブジェクトをJPublisherで生成されたラッパー・メソッドのOUT引数またはファンクション・コールの戻り値として使用する方法があります。また、ユーザー記述のJDBCコールを介してSQLオブジェクトを取り出す方法もあります。下位互換性モードでSQLJソース・ファイルを直接使用する場合は、SQLJの#sql文を介してSQLオブジェクトのコピーを取り出すことができます。

- 引数のないコンストラクタでJavaオブジェクトを構成し、setXXX()メソッドを使用してその属性を設定するか、すべてのオブジェクト属性の値を受け入れるコンストラクタでJavaオブジェクトを構成します。その後、setConnection()またはsetConnectionContext()メソッドを使用して、ラッパー・メソッドをコールする前にオブジェクトをデータベース接続に関連付ける必要があります。オブジェクトをJDBCまたはSQLJ接続に明示的に関連付けずに、そのメソッドをコールすると、メソッドはSQLJのデフォルト・コンテキストに暗黙的に関連付けられます。
クラスの他のコンストラクタは接続をクラス・インスタンスに関連付けます。DefaultContextインスタンス、またはJPublisherの実行時に-contextオプションを通じて指定したクラスのインスタンスを取るコンストラクタと、Connectionインスタンスを取るコンストラクタがあります。接続コンテキストやデフォルト・コンテキストなどのSQLJ概念をよく理解していないJDBCプログラマが使用しやすいように、Connectionインスタンスを使用するコンストラクタが用意されています。

関連項目:
「SQLJクラスの生成に関する重要な注意事項」

Javaオブジェクトを初期化すると、次を実行できます。

- オブジェクトのアクセッサ・メソッドをコールできます。

- オブジェクトのラッパー・メソッドをコールできます。

- オブジェクトを他のラッパー・メソッドに渡すことができます。

- オブジェクトをJDBCコールのホスト変数として使用できます。下位互換性モードでSQLJソース・ファイルを直接使用する場合は、SQLJの#sql文でオブジェクトをホスト変数として使用できます。

対応するSQLオブジェクト型の属性ごとにJava属性があり、属性ごとにgetXXX()およびsetXXX()アクセッサ・メソッドがあります。JPublisherでは属性に対してフィールドは生成されません。たとえば、fooと呼ばれる属性の場合、fooと呼ばれる対応するJava属性と、アクセッサ・メソッドgetFoo()およびsetFoo()があります。

クラスにはデフォルトで、サーバーに存在し実行される関連付けられたOracleオブジェクト・メソッドをコールするラッパー・メソッドが含まれます。サーバー・メソッドの種類に関係なく、ラッパー・メソッドはすべてインスタンス・メソッドです。thisオブジェクト内のDefaultContextは、ラッパー・メソッドで使用されます。

Oracleマッピングを使用すると、JPublisherではOracle JDBCドライバ用に次のメソッドが生成されます。

- create()

- toDatum()

この種のメソッドは、ORADataおよびORADataFactoryインタフェースで指定され、通常は直接使用することを意図していません。また、JPublisherでは、メソッドsetFrom(otherObject)、setValueFrom(otherObject)およびsetContextFrom(otherObject)が生成されます。これらのメソッドを使用すると、オブジェクト・インスタンス間で値や接続情報をコピーできます。

SQLJクラスでの接続コンテキストおよびインスタンス

JPublisherでSQLJ接続コンテキスト・インスタンスの作成に使用されるクラスは、JPublisherの実行時に-contextオプションに設定する値に応じて異なります。次のクラスを使用できます。

- -context=DefaultContext(デフォルト設定)に設定すると、JPublisherでは標準sqlj.runtime.ref.DefaultContextクラスのインスタンスが使用されます。

- ユーザー定義のクラス(つまり、CLASSPATHに指定され、標準sqlj.runtime.ConnectionContextインタフェースを実装するクラス)に設定すると、JPublisherではそのクラスのインスタンスが使用されます。

- -context=generatedに設定すると、JPublisherで生成されたクラスで静的Ctx接続コンテキスト・クラスが宣言されます。JPublisherでは、このクラスのインスタンスが接続コンテキスト・インスタンスに使用されます。この方法はOracle8i互換モードの場合には適切ですが、通常はお薦めしません。

関連項目:
「SQLJ接続コンテキスト・クラス」

注意:
Oracle8i Databaseとは異なり、JPublisherで_ctx接続コンテキスト・インスタンスを宣言するためのルーチンはなくなりました。ただし、このルーチンは、Oracle8i互換モードで、_ctxが静的_Ctx接続コンテキスト・クラスのprotectedインスタンスとして宣言されている場合に使用されます。
_ctxに依存する従来型コードがない場合に、JPublisherで生成されたクラスで接続コンテキスト・インスタンスを取得して操作するには、getConnectionContext()およびsetConnectionContext()メソッドを使用してください。

JPublisherで生成されたラッパー・クラスのインスタンス内で、SQLJ接続コンテキスト・インスタンスまたはJDBC接続インスタンスを使用する場合は、次のことを考慮してください。

- JPublisherで生成されたラッパー・クラスには、SQLJ接続コンテキスト・インスタンスを明示的に指定できるように、setConnectionContext()メソッドが用意されています。このメソッドの定義は次のとおりです。

void setConnectionContext(conn_ctxt_instance);

これにより、SQLJ接続コンテキストとして渡された接続コンテキスト・インスタンスが、ラッパー・クラス・インスタンスにインストールされます。この接続コンテキスト・インスタンスは、JPublisherの接続コンテキスト(通常はDefaultContext)に対して-context設定を通じて指定したクラスのインスタンスである必要があります。

基礎となるJDBC接続には、データベース・オブジェクトを最初に実体化するために使用される接続との互換性が必要であることに注意してください。特に、一部のオブジェクトは、オブジェクト参照型やBLOBなど、特定の接続にのみ有効な属性を持つ場合があります。

コンストラクタを通じて接続コンテキスト・インスタンスをすでに指定している場合には、setConnectionContext()メソッドを使用して再設定する必要はありません。

注意:
setConnectionContext()メソッドを使用して接続コンテキスト・インスタンスを明示的に設定すると、接続コンテキストが正常にクローズされないという問題を回避できます。この問題が発生するのは、暗黙的に作成された接続コンテキスト・インスタンスの場合のみです。

- 該当する場合は、ラッパー・クラス・インスタンスの次のいずれかのメソッドを使用して、接続または接続コンテキスト・インスタンスを取得します。

- Connection getConnection()

- ConnCtxtType getConnectionContext()

getConnectionContext()メソッドは、JPublisherの-context設定で指定された接続コンテキスト・クラス(通常はDefaultContext)のインスタンスを戻します。

戻される接続コンテキスト・インスタンスは、明示的に設定されたインスタンス、またはJPublisherにより暗黙的に作成されたインスタンスです。

注意:
これらのメソッドは、生成されたSQLJクラス内でのみ使用できます。必要な場合は、確実にSQLJクラスが生成されるように-methods=alwaysに設定できます。

- JPublisherで生成されたSQLJクラス用に接続コンテキスト・インスタンスを明示的に設定していない場合は、getConnectionContext()メソッドのコール時にJDBC接続インスタンスから暗黙的に作成されます。
この場合は、処理の終了時にrelease()メソッドを使用して、SQLJランタイム内のリソースを解放する必要があります。これにより、メモリー・リンクが発生する可能性がなくなります。

setFrom()、setValueFrom()およびsetContextFrom()メソッド

JPublisherには、生成されるSQLJクラスに次のユーティリティ・メソッドが用意されています。

- setFrom(anotherObject)
このメソッドは、接続および接続コンテキスト情報など、同じベース型の別のオブジェクトからコールするオブジェクトを初期化します。コール側のオブジェクトで暗黙的に作成された既存の接続コンテキスト・オブジェクトが解放されます。

- setValueFrom(anotherObject)
このメソッドは、同じベース型の別のオブジェクトからコールするオブジェクトの基礎となるフィールド値を初期化します。このメソッドは、接続または接続コンテキスト情報を転送しません。

- setContextFrom(anotherObject)
このメソッドは、同じベース型の別のオブジェクトの接続設定からコールするオブジェクトの、接続および接続コンテキスト情報を初期化します。コール側のオブジェクトで暗黙的に作成された既存の接続コンテキスト・オブジェクトが解放されます。このメソッドは、オブジェクト値に関連する情報を転送しません。

setFrom()メソッドとsetValueFrom()メソッドおよびsetContextFrom()メソッドの組合せのセマンティックは同じです。

非SQLJクラスの生成

-methods=false設定の場合、またはSQLオブジェクト型でメソッドが定義されていない場合、JPublisherではオブジェクト型のラッパー・メソッドは生成されません。この場合、生成されたクラスは実行時にSQLJランタイムを必要としません。したがって、JPublisherでは非SQLJクラス、つまりSQLJランタイムApplication Programming Interface(API)をコールしないクラスが生成されます。これは、ORAData実装とSQLData実装のどちらを使用する場合も同じです。

注意:

- -methods=false設定の場合、ラッパー・メソッドがなければ役に立たないため、PL/SQLパッケージのコードは生成されません。

- JPublisherでは、-methodsオプションの設定がfalseまたはtrueのどちらでも、参照型、VARRAY型およびネストした表型用に同じJavaコードが生成されます。

-methods=false設定のときのオブジェクト型用や、参照型、VARRAY型またはネストした表型用にJPublisherで生成されるクラスのインスタンスを使用するには、最初にオブジェクトを初期化する必要があります。

オブジェクトを初期化するには、次の方法があります。

- Javaオブジェクトに対して初期化済のJavaオブジェクトを割り当てます。

- SQLオブジェクトのコピーを次の方法でJavaオブジェクトに取り込みます。SQLオブジェクトを他のクラスのJPublisherで生成されたラッパー・メソッドを介してアクセスするOUT引数またはファンクション・コールの戻り値として使用する方法があります。また、ユーザー記述のJDBCコールを介してSQLオブジェクトを取り出す方法もあります。下位互換性モードでSQLJソース・ファイルを直接使用する場合は、SQLJの#sql文を介してSQLオブジェクトのコピーを取り出すことができます。

- 引数のないコンストラクタでJavaオブジェクトを構成して、そのデータを初期化するか、属性値に基づいてJavaオブジェクトを構成します。

SQLJクラスに生成されたコンストラクタとは異なり、非SQLJクラスに生成されたコンストラクタは接続引数を使用しません。かわりに、オブジェクトがJDBCのStatement、CallableStatementまたはPreparedStatementオブジェクトに渡されるか戻されると、JPublisherでは、Statement、CallableStatementまたはPreparedStatementオブジェクトの構成に使用する接続が適用されます。

これは、同じオブジェクトを様々な場合に様々な接続で使用できるという意味ではなく、使用できない場合もあります。オブジェクトは、特定の接続に対してのみ有効な参照またはBLOBなどのサブコンポーネントを持つ場合があります。

オブジェクトのデータを初期化するには、クラスがオブジェクト型を表す場合はsetXXX()メソッドを使用し、クラスがVARRAYまたはネストした表型を表す場合はsetArray()またはsetElement()メソッドを使用します。クラスが参照型を表す場合は、null参照の構成のみが可能です。非nullの参照は、すべてデータベースから取り込まれます。

オブジェクトを初期化すると、次を実行できます。

- オブジェクトを他のクラスのラッパー・メソッドに渡すことができます。

- オブジェクトをJDBCコールのホスト変数として使用できます。下位互換性モードでSQLJソース・ファイルを直接使用する場合は、SQLJの#sql文でオブジェクトを使用できます。

- オブジェクトの状態を読取り/書込みを行うメソッドをコールできます。これらのメソッドはユーザーのプログラム内のJavaオブジェクトで動作し、データベース内のデータには影響しません。オブジェクトの状態の読取り/書込みを行うには、次の方法があります。

- オブジェクト型を表すクラスの場合は、getXXX()およびsetXXX()アクセッサ・メソッドをコールします。

- VARRAYまたはネストした表を表すクラスの場合は、getArray()、setArray()、getElement()およびsetElement()メソッドをコールします。
getArray()およびsetArray()メソッドは配列を全体として戻すか、あるいは変更します。getElement()およびsetElement()メソッドは配列の個別の要素を戻すか、あるいは変更します。

データベースでデータを更新する場合は、Java配列をデータベースに再挿入する必要があります。

- オブジェクト参照は不変なエンティティであるため変更できません。ただし、getValue()およびsetValue()メソッドを使用して、参照するSQLオブジェクトの読取り/書込みができます。
getValue()メソッドは、オブジェクト参照で参照されているSQLオブジェクトのコピーを戻します。setValue()メソッドは、オブジェクト型を入力として表すJavaクラスのインスタンスを使用して、データベース内のSQLオブジェクト型インスタンスを更新します。オブジェクト型用に生成されたクラスのgetXXX()およびsetXXX()アクセッサ・メソッドとは異なり、getValue()およびsetValue()メソッドでSQLオブジェクトの読取り/書込みを行います。

getValue()およびsetValue()メソッドでは、それぞれ参照先である基礎となるデータベース・オブジェクトの値の読取りと書込みのために、データベースとのラウンドトリップが発生することに注意してください。

JDBCコードでgetORADataFactory()メソッドを使用すると、ORADataFactoryオブジェクトを戻すことができます。このORADataFactoryオブジェクトを、oracle.jdbcパッケージのArrayDataResultSet、OracleCallableStatementおよびOracleResultSetクラス内でgetORAData()メソッドに渡すことができます。Oracle JDBCドライバでは、ORADataFactoryオブジェクトを使用して、JPublisherで生成されたクラスのインスタンスが作成されます。

さらに、VARRAYおよびネストした表型を表すクラスには、oracle.sql.ARRAYクラスの機能を実装するメソッドがあります。これらのメソッドを次に示します。

- getBaseTypeName()

- getBaseType()

- getDescriptor()

ただし、VARRAYおよびネストした表型用にJPublisherで生成されたクラスはoracle.sql.ARRAYクラスを拡張しません。

Oracleマッピングを使用すると、JPublisherではOracle JDBCドライバ用に次のメソッドが生成されます。

- create()

- toDatum()

この種のメソッドは、ORADataおよびORADataFactoryインタフェースで指定され、通常は直接使用することを意図していません。ただし、2つのオブジェクト参照Javaラッパー型の間で変換する場合には使用できます。

Javaインタフェースの生成

JPublisherには、クラス生成機能のみでなくインタフェース生成機能も用意されています。この機能は、WSDLコンテンツの生成に使用するAPIを表すJavaインタフェースを手動で作成する必要がなくなるため、特にWebサービスに有効です。

-sqlオプションでは次の構文がサポートされます。

-sql=sql_package_or_type:JavaClass#JavaInterface

または

-sql=sql_package_or_type:JavaClass:JavaUserSubclass#JavaSubInterface

クラスとともにインタフェース名を指定すると、そのクラスのパブリック属性またはラッパー・メソッド(あるいはその両方)がインタフェースで提供され、生成されるクラスにそのインタフェースが実装されます。

関連項目:
「SQLユーザー定義型の公開」および「PL/SQLパッケージの公開」

インタフェースは、生成されるクラスまたはユーザー・サブクラスの両方ではなく、どちらか一方についてのみ指定します。生成されるベース・クラス用のインタフェースとユーザー・サブクラス用インタフェースとの違いには、Java間の型変換が関係します。サブクラスのメソッドのシグネチャは、Java間のマッピングの関係でベース・クラスでのシグネチャとは異なる場合があります。

関連項目:
「JPublisherのスタイルとスタイル・ファイル」

JPublisherのサブクラス

ユーザー定義のSQL型の変換時に、JPublisherにより生成されたカスタムJavaクラスの機能を拡張できます。

その方法の1つは、JPublisherで生成されたクラスにメソッドを手動で追加することです。ただし、将来JPublisherを実行してクラスを再生成することになると思われる場合、この方法は望ましくありません。この方法で変更されたクラスを再生成すると、変更内容(追加したメソッドなど)が上書きされます。JPublisher出力を別のファイルに送る場合にも、変更内容をそのファイルにマージする必要があります。

生成されたクラスの機能を拡張する場合に望ましい方法は、クラスの拡張です。JPublisherにはクラス拡張メカニズムが用意されており、必要に応じてカスタマイズできるように元のベース・クラスがスタブ・サブクラスとともに生成されます。コードでSQL型が参照されるたびに(引数として使用される場合など)、そのSQL型がベース・クラスではなくサブクラスにマップされます。

JPublisherで生成されるサブクラスには、Java間の型変換に関する使用例もあります。SQL型からJava型へのマッピングには、Webサービスでサポートされていない型など、目的に適さないJava型が使用される場合があります。JPublisherでは、スタイルおよびスタイル・ファイルのメカニズムを使用して、適切なJava型を使用するためのJava変換間ステップを追加できます。

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

- JPublisherで生成されたクラスの拡張

JPublisherで生成されたクラスの拡張

JPublisherでADDRESS SQLオブジェクト型からJAddressクラスを生成するとします。また、MyAddressクラスを記述してADDRESSオブジェクトを表すと想定します。このMyAddressはJAddressが提供する機能を拡張します。

この使用例では、JPublisherを使用してベースJavaクラスJAddressとサブクラスMyAddressの初期バージョンを生成し、この初期バージョンに必要な機能を追加できます。次にJPublisherを使用してADDRESSオブジェクトをJAddressクラスのかわりにMyAddressクラスにマップします。

これを実行するために、JPublisherで生成されるコードが次の方法で変更されます。

- JAddressRefではなくMyAddressRef参照クラスを生成します。

- SQL型がADDRESSの属性を表すため、あるいはSQL型がADDRESSのVARRAYおよびネストした表の要素を表すために、JAddressクラスではなくMyAddressクラスを使用します。

- ORADataFactoryインタフェースを使用してSQL型がADDRESSであるJavaオブジェクトを構成する場合に、JAddressファクトリではなくMyAddressファクトリを使用します。

- JAddressクラス用のコードを生成または再生成します。また、MyAddressクラス用のコードの初期バージョンも生成されます。これを変更して、独自の追加機能を挿入できます。ただし、MyAddressクラスのソース・ファイルがすでに存在している場合は、JPublisherによってそれがそのまま残ります。

関連項目:
「Oracle8i DatabaseとOracle9i Databaseの間のJPublisherの動作変更」

代替クラスへのマッピングの構文

JPublisherは代替クラスに対するマッピング処理を効率化する機能を備えています。-sqlコマンドライン・オプション設定で次の構文を使用します。

-sql=object_type:generated_base_class:map_class

MyAddress/JAddressの例の場合は、次のようになります。

-sql=ADDRESS:JAddress:MyAddress

コマンドラインではなくINPUTファイルに行を入力すると、次のようになります。

SQL ADDRESS GENERATE JAddress AS MyAddress

この構文で、JAddressはJPublisherでJAddress.javaに生成されるベース・クラスの名前を示しますが、MyAddressは実際にADDRESSにマップするクラスの名前です。最終的には、MyAddress.java内のコードを取り扱う必要があります。カスタム機能を追加するには、このコードを必要に応じて更新します。ADDRESS属性を持つオブジェクトを取り出すと、この属性はMyAddressのインスタンスとして作成されます。あるいはADDRESSオブジェクトを直接取り出すと、MyAddressのインスタンスに取り込まれます。

関連項目:
「変換対象のオブジェクト型およびパッケージの宣言」および「INPUTファイルの構造および構文」

生成クラスを拡張するクラスの書式化

ユーザー・サブクラスの初期バージョンが存在しない場合は、JPublisherにより自動的に生成されます。このサブクラスに、カスタム・コードを挿入します。たとえば、前述の例ではJPublisherによってMyAddress.javaファイルに生成されています。

次の点に注意してください。

- クラスには引数のないコンストラクタがあります。適切な初期化オブジェクトを構成する場合は、スーパークラスのコンストラクタを明示的または暗黙的にコールするのが最も簡単な方法です。

- クラスはORADataインタフェースまたはSQLDataインタフェースを実装します。この実装は、スーパークラスから必要なメソッドを継承することで暗黙的に行われます。

- ORADataクラスを拡張すると、サブクラスもORADataFactoryインタフェースを実装します。create()メソッドの実装は、次のようになります。

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

ただし、クラスが継承階層に含まれている場合、生成されたメソッドはcreate()と同じシグネチャおよび本体を持つprotected ORAData createExact()に変わります。

継承のサポート

この項では、ORAData型の継承のサポートについて説明します。この項の内容は、次のとおりです。

- JPublisherでの継承サポートの実装方法。

- サブタイプの参照クラスではベース型の参照クラスが拡張されない理由、およびある参照型から別の参照型(通常はサブクラスまたはスーパークラス)への変換方法。

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

- ORADataのオブジェクト型および継承

- ORADataの参照型および継承

- SQLDataのオブジェクト型および継承

- SQL FINAL、NOT FINAL、NOT INSTANTIABLEを使用する効果

ORADataのオブジェクト型および継承

次のSQLオブジェクト型について考えます。

CREATE TYPE PERSON AS OBJECT (
...
) NOT FINAL;

CREATE TYPE STUDENT UNDER PERSON (
...
);

CREATE TYPE INSTRUCTOR UNDER PERSON (
...
);

対応するJavaクラスを作成する次のJPublisherコマンドについて考えます。

% jpub -user=hr -sql=PERSON:Person,STUDENT:Student,INSTRUCTOR:Instructor -usertypes=oracle
Enter hr password: password

この例では、JPublisherによりPersonクラス、StudentクラスおよびInstructorクラスが生成されます。STUDENTとINSTRUCTORはPERSONのサブタイプであるため、StudentクラスとInstructorクラスはPersonクラスを拡張します。

継承階層のルートにあるクラス(この例ではPerson)には、継承階層全体のすべての情報が含まれ、その型マップは必要な情報で自動的に初期化されます。JPublisherを使用してクラス階層に必要なクラスをすべて生成すると、追加のアクションは不要です。そのままでクラス階層の型マップを適切に移入できます。

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

- 部分的に生成された型階層を組み合せる場合の事前作業

- JPublisherで生成されたコードでの型階層のマッピング

部分的に生成された型階層を組み合せる場合の事前作業

SQL型階層に対してJPublisherを数回実行し、そのたびに対応するJavaラッパー・クラスの一部のみを生成する場合は、クラス階層のルートにある型マップが適切に初期化されるように、ユーザー・アプリケーションで事前作業を実行する必要があります。

前述の例で、次のJPublisherコマンドを実行したとします。

% jpub -user=hr -sql=PERSON:Person,STUDENT:Student -usertypes=oracle
Enter hr password: password
% jpub -user=hr -sql=PERSON:Person,INSTRUCTOR:Instructor -usertypes=oracle
Enter hr password: password

この場合は、これらのマップされた型をコードで使用する前に、生成されたクラス(少なくともリーフ・クラス)のインスタンスを作成する必要があります。たとえば、次のようにします。

new Instructor(); // required
new Student();    // required
new Person();     // optional

JPublisherで生成されたコードでの型階層のマッピング

Personクラスには次のメソッドが含まれます。

Person create(oracle.sql.Datum d, int sqlType)

このメソッドは、DatumインスタンスをカスタムJavaオブジェクトとしての表現に変換します。PERSONとして宣言されたSQLオブジェクトがPerson変数に取り出されるたびに、Oracle JDBCドライバによりコールされます。ただし、SQLオブジェクトが実際にはSTUDENTオブジェクトである場合があります。この場合、create()メソッドではPersonインスタンスではなくStudentインスタンスを作成する必要があります。

この種の状況を処理するには、カスタムJavaクラスのcreate()メソッドで、oracle.sql.Datum引数に対応するSQLオブジェクト型のサブタイプを表すサブクラスのインスタンスを作成できる必要があります。これにより、作成されたJavaオブジェクトの実際の型が、SQLオブジェクトの実際の型と一致することが保証されます。JPublisherでは、カスタムJavaクラスが作成される場合と作成されない場合があります。

ただし、カスタムJavaクラス階層のルート・クラスにあるcreate()メソッドのコードでは、サブクラスを指定する必要はありません。実際、サブクラスが指定された場合には、新規サブクラスを記述または作成するときに、ベース・クラス用のコードを変更する必要があります。JPublisherを使用してクラス階層全体を再生成するとベース・クラスが自動的に変更されます。ただし、常に階層を再生成できるとはかぎりません。たとえば、拡張するJavaクラスのソース・コードへのアクセス権がない場合などです。

かわりに、JPublisherで生成されたコードは、カスタムのJavaクラス階層の各サブクラスに静的な初期化ブロックを作成することで、クラス階層の増分拡張を行うことができます。この静的な初期化ブロックでは、ルート・クラスにはサブクラスに関して必要な情報が与えられ、ルート・レベルのJavaクラスで宣言されたデータ構造が初期化されます。サブクラスのインスタンスが実行時に作成されると、その型がデータ構造に登録されます。この暗黙的なマッピング・メカニズムのため、SQLDataの使用例とは異なり、明示的な型マップは不要です。

注意:
この実装により既存のクラスを修正せずに拡張できますが、デメリットもあります。クラス階層を使用してデータベースからオブジェクトを読み取る前に、サブクラスの静的初期化ブロックが処理される必要があります。これが発生するのは、new()をコールして各サブクラスのオブジェクトをインスタンス化する場合です。サブクラスのコンストラクタにより、すぐ上位のスーパークラスのコンストラクタがコールされるため、リーフ・クラスのみがインスタンス化されます。
かわりに、実行可能な場合は、クラス階層全体を生成または再生成できます。

ORADataの参照型および継承

この項では、カスタム参照クラス間での変換方法と、JPublisherによってサブタイプ用に生成されるカスタム参照クラスが、ベース型の参照クラスを拡張しない理由について説明します。

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

- 別の参照型への参照型のインスタンスのキャスト

- 参照型の継承がオブジェクト型の継承に従わない理由

- 参照型間の手動変換

- 例: 参照型間の手動変換

別の参照型への参照型のインスタンスのキャスト

「ORADataのオブジェクト型および継承」の例では、基礎となるオブジェクト型のラッパー・クラスに加えて、強い型指定の参照用にPersonRef、StudentRefおよびInstructorRefを取得しています。

StudentRefインスタンスがあり、それをPersonRefインスタンスの必要なコンテキスト内で使用することが必要な場合があります。この場合は、強い型指定の参照クラスに生成される静的メソッドcast()を使用します。

StudentRef s_ref = ...;
PersonRef p_ref = PersonRef.cast(s_ref);

逆に、PersonRefインスタンスがあり、それをInstructorRefインスタンスへと限定できることがわかっている場合があります。

PersonRef pr = ...;
InstructorRef ir = InstructorRef.cast(pr);

参照型の継承がオブジェクト型の継承に従わない理由

ここでは、参照型を関連オブジェクト型の階層に従わせることが望ましくない理由を、例をあげて説明します。わかりやすいように、前項と同じ例のサブセットについて考えます。

CREATE TYPE PERSON AS OBJECT (
...
) NOT FINAL;

CREATE TYPE STUDENT UNDER PERSON (
...
);

さらに次のJPublisherコマンドを考えてみます。

% jpub -user=hr -sql=PERSON:Person,STUDENT:Student -usertypes=oracle
Enter hr password: password

Java型PersonおよびStudentが生成され、さらにPersonRef型とStudentRef型も生成されます。

StudentクラスはPersonクラスを拡張するため、StudentRefでPersonRefが拡張されると予期できます。ただし、StudentRefクラスは独立クラスとしてPersonRefのサブタイプより強いコンパイル時の型保証を提供できるため、これには該当しません。また、PersonRefオブジェクトではデータベース内のPersonオブジェクトの変更などが可能ですが、これはStudentRefオブジェクトではできません。

PersonRefクラスの最も重要なメソッドは次のとおりです。

- Person getValue()

- void setValue(Person c)

StudentRefクラスで対応するメソッドは次のとおりです。

- Student getValue()

- void setValue(Student c)

StudentRefクラスがPersonRefクラスを拡張すると、次の問題が発生します。

- Javaでは、PersonRefクラス内でオーバーライドするメソッドがPersonオブジェクトを戻す場合、StudentRefのgetValue()メソッドがStudentオブジェクトを戻すことは、たとえ適切であっても許可されません。

- StudentRefのsetValue()メソッドはPersonRefのsetValue()メソッドをオーバーライドしません。これは、この2つのメソッドのシグネチャが異なるためです。

StudentRefメソッドにPersonRefメソッドと同じシグネチャおよび結果の型を指定しても、この問題は修正できません。これは、オブジェクトをPersonRefではなくStudentRefとして宣言することで得られる追加の型保証が失われるためです。

参照型間の手動変換

参照型は関連オブジェクト型の階層に従わないため、2つの参照型の間では直接変換することはできません。これはJPublisherの制限です。背景情報として、この項では生成されたcast()メソッドによる参照型間の変換操作について説明します。

注意:
これらの手動手順に従うことはお薦めしません。ここではあくまでも参考のために説明しています。かわりに、cast()メソッドを使用できます。

次の例に、XxxxRef参照型からYyyyRef参照型への変換に使用できるコードを示します。

java.sql.Connection conn = ...;  // get underlying JDBC connection
XxxxRef xref = ...;
YyyyRef yref = (YyyyRef) YyyyRef.getORADataFactory().
create(xref.toDatum(conn),oracle.jdbc.OracleTypes.REF);

この変換は2つのステップで構成され、各ステップに独自のメリットがあります。

1. xrefを強いXxxxRef型から弱いoracle.sql.REF型に変換します。

oracle.sql.REF ref  = (oracle.sql.REF) xref.toDatum(conn);

2. oracle.sql.REF型からターゲットのYyyyRef型に変換します。

YyyyRef yref = (YyyyRef) YyyyRef.getORADataFactory().
create(ref,oracle.jdbc.OracleTypes.REF);

注意:
この変換では、タイプ・チェックは行われません。この変換が実際に許可されるかどうかは、使用中のアプリケーションおよびSQLスキーマに応じて異なります。

例: 参照型間の手動変換

次の例にはSQL定義とJavaコードが含まれており、前述のポイントを示しています。

SQL定義 次のSQL定義について考えます。

CREATE TYPE person_t AS OBJECT (ssn NUMBER, name VARCHAR2(30), dob DATE) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE instructor_t UNDER person_t (title VARCHAR2(20)) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE instructorPartTime_t UNDER instructor_t (num_hours NUMBER);
/
SHOW ERRORS

CREATE TYPE student_t UNDER person_t (deptid NUMBER, major VARCHAR2(30)) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE graduate_t UNDER student_t (advisor instructor_t);
/
SHOW ERRORS

CREATE TYPE studentPartTime_t UNDER student_t (num_hours NUMBER);
/
SHOW ERRORS

CREATE TABLE person_tab OF person_t;

INSERT INTO person_tab VALUES (1001, 'Larry', TO_DATE('11-SEP-60'));

INSERT INTO person_tab VALUES (instructor_t(1101, 'Smith', TO_DATE('09-OCT-1940'), 'Professor'));

INSERT INTO person_tab VALUES (instructorPartTime_t(1111, 'Myers', TO_DATE('10-OCT-65'), 'Adjunct Professor', 20));

INSERT INTO person_tab VALUES (student_t(1201, 'John', To_DATE('01-OCT-78'), 11, 'EE'));

INSERT INTO person_tab VALUES (graduate_t(1211, 'Lisa', TO_DATE('10-OCT-75'), 12, 'ICS',
instructor_t(1101, 'Smith', TO_DATE ('09-OCT-40'), 'Professor')));

INSERT INTO person_tab VALUES (studentPartTime_t(1221, 'Dave', TO_DATE('11-OCT-70'), 13, 'MATH', 20));

JPublisherのマッピング JPublisherの実行時に次のマッピングがあるとします。

Person_t:Person,instructor_t:Instructor,instructorPartTime_t:InstructorPartTime,
graduate_t:Graduate,studentPartTime_t:StudentPartTime

SQLJクラス 参照型間の変換例のSQLJクラスを次に示します。

import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;

public class Inheritance
{
public static void main(String[] args) throws SQLException
{
System.out.println("Connecting.");
java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
oracle.jdbc.OracleConnection conn =
(oracle.jdbc.OracleConnection) java.sql.DriverManager.getConnection
("jdbc:oracle:oci8:@", "hr", "hr");
// The following is only required in 9.0.1
// or if the Java class hierarchy was created piecemeal
System.out.println("Initializing type system.");
new Person();
new Instructor();
new InstructorPartTime();
new StudentT();
new StudentPartTime();
new Graduate();
PersonRef p_ref;
InstructorRef i_ref;
InstructorPartTimeRef ipt_ref;
StudentTRef s_ref;
StudentPartTimeRef spt_ref;
GraduateRef g_ref;
OraclePreparedStatement stmt =
(OraclePreparedStatement)conn.prepareStatement
("select ref(p) FROM PERSON_TAB p WHERE p.NAME=:1");
OracleResultSet rs;

System.out.println("Selecting a person.");
stmt.setString(1, "Larry");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
p_ref = (PersonRef) rs.getORAData(1, PersonRef.getORADataFactory());
rs.close();

System.out.println("Selecting an instructor.");
stmt.setString(1, "Smith");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
i_ref = (InstructorRef) rs.getORAData(1, InstructorRef.getORADataFactory());
rs.close();

System.out.println("Selecting a part time instructor.");
stmt.setString(1, "Myers");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
ipt_ref = (InstructorPartTimeRef) rs.getORAData
(1, InstructorPartTimeRef.getORADataFactory());
rs.close();

System.out.println("Selecting a student.");
stmt.setString(1, "John");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
s_ref = (StudentTRef) rs.getORAData(1, StudentTRef.getORADataFactory());
rs.close();

System.out.println("Selecting a part time student.");
stmt.setString(1, "Dave");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
spt_ref = (StudentPartTimeRef) rs.getORAData
(1, StudentPartTimeRef.getORADataFactory());
rs.close();

System.out.println("Selecting a graduate student.");
stmt.setString(1, "Lisa");
rs = (OracleResultSet) stmt.executeQuery();
rs.next();
g_ref = (GraduateRef) rs.getORAData(1, GraduateRef.getORADataFactory());
rs.close();
stmt.close();

// Assigning a part-time instructor ref to a person ref
System.out.println("Assigning a part-time instructor ref to a person ref");
oracle.sql.Datum ref = ipt_ref.toDatum(conn);
PersonRef pref = (PersonRef) PersonRef.getORADataFactory().
create(ref,OracleTypes.REF);
// or just use: PersonRef pref = PersonRef.cast(ipt_ref);
// Assigning a person ref to an instructor ref
System.out.println("Assigning a person ref to an instructor ref");
InstructorRef iref = (InstructorRef) InstructorRef.getORADataFactory().
create(pref.toDatum(conn), OracleTypes.REF);
// or just use: InstructorRef iref = InstructorRef.cast(pref);
// Assigning a graduate ref to an part time instructor ref.
// This should produce an error, demonstrating that refs
// are type safe.
System.out.println ("Assigning a graduate ref to a part time instructor ref");
InstructorPartTimeRef iptref =
(InstructorPartTimeRef) InstructorPartTimeRef.getORADataFactory().
create(g_ref.toDatum(conn), OracleTypes.REF);
// or just use: InstructorPartTimeRef iptref =
// InstructorPartTimeRef.cast(g_ref);
conn.close();
}
}

SQLDataのオブジェクト型および継承

JPublisherで-usertypes=oracleのかわりに-usertypes=jdbc設定を使用すると、JPublisherで生成されるカスタムJavaクラスでは、Oracle ORADataインタフェースのかわりに標準SQLDataインタフェースが実装されます。標準SQLDataメソッドのreadSQL()およびwriteSQL()には、データの読取りと書込みに関してORAData/ORADataFactoryメソッドのcreate()およびtoDatum()と同等の機能があります。

JPublisherでは、SQL階層に対応するSQLDataクラスの生成時に、Javaの型はSQL型と同じ階層になります。これは、JPublisherでSQLオブジェクト型の階層に対応するORADataクラスが生成される場合と同じです。ただし、SQLDataの実装では、JPublisherがORADataクラスに自動的に生成する暗黙的なマッピングのインテリジェント機能がありません。

SQLDataの使用例では、SQLオブジェクト型とJavaの型の間に適切なマッピングが得られるように、型マップを手動で提供する必要があります。JDBCアプリケーションでは、接続のデフォルトの型マップを正常に初期化するか、getObject()の入力パラメータとして型マップを明示的に指定できます。

関連項目:
『Oracle Database JDBC開発者ガイド』

また、SQLData実装では、強い型指定のオブジェクト参照に対するサポートがないことに注意してください。すべてのオブジェクト参照は弱い型指定のjava.sql.Refインスタンスです。

SQL FINAL、NOT FINAL、NOT INSTANTIABLEを使用する効果

この項では、SQL修飾子FINAL、NOT FINALまたはNOT INSTANTIABLEの使用が、JPublisherで生成されるラッパー・クラスに与える効果について説明します。

SQL修飾子FINALまたはNOT FINALをSQL型またはSQL型のメソッドに使用しても、生成されるJavaラッパー・コードには影響しません。このため、JPublisherユーザーは常に、クラスを拡張して生成された動作をオーバーライドすることで、生成されたJavaラッパー・クラスをカスタマイズできます。

NOT INSTANTIABLE SQL修飾子をSQL型のメソッドに使用すると、Javaラッパー・クラスにそのメソッド用のコードは生成されません。したがって、そのメソッドをコールするには、インスタンス化できるSQLサブタイプに対応するなんらかのラッパー・クラスにキャストする必要があります。

SQL型にNOT INSTANTIABLEを使用すると、protectedコンストラクタで対応するラッパー・クラスが生成されます。これにより、インスタンス化できるSQL型に対応するサブクラス経由でなければ、そのクラスのインスタンスを作成できないことがわかります。

6 コマンドライン・オプションおよび入力ファイル

この章では、プログラムの動作を指定するJPublisherのオプション設定および入力ファイルの使用方法と構文の詳細を説明します。内容は次のとおりです。

- JPublisherオプション

- JPublisher入力ファイル

JPublisherオプション

この項では、JPublisherのコマンドライン・オプションについて説明します。この項の内容は、次のとおりです。

- JPublisherのオプションのサマリー

- JPublisherオプションのヒント

- 表記規則

- 入力ファイルおよび公開する項目に関するオプション

- 接続オプション

- データ型マッピングのオプション

- 型マップのオプション

- Javaコード生成オプション

- PL/SQLコード生成オプション

- 出入力オプション

- Webサービスのコールアウトを容易にするオプション

- SQLJ機能にアクセスするためのオプション

- 下位互換性オプション

- Java環境オプション

- SQLJ移行オプション

JPublisherのオプションのサマリー

表6-1に、JPublisherのオプションを示します。「デフォルト値」列の「NA」は適用外(not applicable)を表します。「カテゴリ」列は、この章内でそのオプションの概要を説明している項を示しています。

表6-1 JPublisherのオプションのサマリー

オプション名

説明

デフォルト値

カテゴリ

-access

JPublisherにより生成されたメソッド定義に組み込まれるアクセス修飾子を指定します。

public

Javaコード生成

-adddefaulttypemap

JPublisherのデフォルトの型マップにエントリを追加します。

NA

型マップ

-addtypemap

JPublisherのユーザー型マップにエントリを追加します。

NA

型マップ

-builtintypes

数値またはラージ・オブジェクト(LOB)以外の組込みデータ型のデータ型マッピング(jdbcまたはoracle)を指定します。

jdbc

データ型マッピング

-case

JPublisherで生成されるJava識別名の大/小文字を指定します。

mixed

Javaコード生成

-classpath

JPublisherで変換時およびコンパイル時にJavaソースおよびクラスを解決できるように、JavaのCLASSPATHへ追加します。

空

Java環境

-compatible

互換モードを指定し、-usertypes=oracleの動作を変更します。

関連項目: 「JPublisherの下位互換性モードと設定」

oradata

下位互換性

-compile

Javaのコンパイルを進行させるか抑制するかを指定します。このオプションは、下位互換性モードにおけるSQLJ変換にも影響します。

true

出入力

-compiler-executable

デフォルト以外のバージョンを使用する場合のJavaコンパイラのバージョンを指定します。

NA

Java環境

-context

JPublisherでSQLJ接続コンテキストに使用するクラスを指定します。DefaultContextクラス、ユーザー指定クラスまたはJPublisherで生成されるインナー・クラスのいずれかです。

DefaultContext

接続

-defaulttypemap

JPublisherで使用するデフォルトの型マップを設定します。

「JPublisherのユーザー型マップとデフォルトの型マップ」を参照してください。

型マップ

-d

コンパイル済クラス・ファイルの格納に使用するルート・ディレクトリを指定します。

空(カレント・ディレクトリに直接存在するすべてのファイル)

出入力

-dir

生成されるソース・ファイルの格納に使用するルート・ディレクトリを指定します。

空(カレント・ディレクトリに直接存在するすべてのファイル)

出入力

-driver

JPublisherでデータベースへのJava Database Connectivity(JDBC)接続に使用するドライバのクラスを指定します。

oracle.jdbc.
OracleDriver

接続

-encoding

JPublisherの入力および出力ファイルのJavaにおける文字のエンコーディングを指定します。

システム・プロパティfile.encodingの値

出入力

-endpoint

Webサービスのエンドポイントを指定します。このオプションは、-proxywsdlオプションと併用します。

NA

Webサービス

-filtermodes

指定したパラメータ・モードに従ってコード生成をフィルタ処理します。

NA

Javaコード生成

-filtertypes

指定したパラメータ型に従ってコード生成をフィルタ処理します。

NA

Javaコード生成

-generatebean

生成されるコードがJavaBeans仕様に準拠することを保証します。

false

Javaコード生成

-genpattern

生成されるコードのネーミング・パターンを定義します。

NA

Javaコード生成

-gensubclass

ユーザー・サブクラス用のスタブ・コードを生成するかどうかと生成方法を指定します。

true

Javaコード生成

-httpproxy

ファイアウォールを介してアクセスできるように、Webサービス定義言語(WSDL)ドキュメントのURLを解決するプロキシURLを指定します。このオプションは、-proxywsdlオプションと併用します。

NA

Webサービス

-inputまたは-i

JPublisherで変換する型およびパッケージをリストするファイルを指定します。

NA

入力ファイル/項目

-java

JPublisherでクライアント・サイド・クラスの生成に使用するサーバー・サイドJavaクラスを指定します。

NA

入力ファイル/項目

-lobtypes

JPublisherでBLOB型およびCLOB型に使用するデータ型マッピング(jdbcまたはoracle)を指定します。

oracle

データ型マッピング

-mapping

オブジェクト属性の型とメソッドの引数の型について、生成されたメソッドでサポートするマッピングを指定します。

注意: このオプションは、XXXtypesマッピング・オプションが優先されるために非推奨になっていますが、下位互換性のためにサポートされています。

objectjdbc

データ型マッピング

-methods

JPublisherで変換済SQLオブジェクトとPL/SQLパッケージのストアド・プロシージャ用にラッパー・メソッドを生成するかどうかを指定します。このオプションは、JPublisherでSQLJクラスと非SQLJクラスのどちらを生成するか、またPL/SQLラッパー・クラスを生成するかどうかも指定します。オーバーロードされたメソッドを許可するかどうかを指定する設定が用意されています。

all

Javaコード生成

-numbertypes

JPublisherで数値データ型に使用するデータ型マッピング(jdbc、objectjdbc、bigdecimalまたはoracleなど)を指定します。

objectjdbc

データ型マッピング

-omit_schema_names

JPublisherに対して、生成されるコードでSQL型の名前の参照にスキーマを含めないように指定します。

使用禁止(スキーマ名を型名に含めます)

Javaコード生成

-outarguments

PL/SQL出力パラメータのJava実装に使用するホルダーの型(配列、Java API for XML-based Remote Procedure Call(JAX-RPC)ホルダーまたはファンクション・コールの戻り値)を指定します。

array

Javaコード生成

-overwritedbtypes

SQL型の作成時に名前の競合を無視するかどうかを指定します。

true

PL/SQLコード生成

-package

JPublisherでJavaラッパー・クラスが生成されるJavaパッケージの名前を指定します。

NA

Javaコード生成

-plsqlfile

JPublisherで生成済のPL/SQLコードに使用されるPL/SQL型とPL/SQLパッケージについて、SQL変換タイプを作成するラッパー・スクリプトと削除する削除スクリプトを指定します。

plsql_wrapper.sql、plsql_dropper.sql

PL/SQLコード生成

-plsqlmap

PL/SQL型を使用するストアド・プロシージャのPL/SQLラッパー・ファンクションを生成するかどうかを指定します。

true

PL/SQLコード生成

-plsqlpackage

JPublisherでコール仕様、変換ファンクションおよびラッパー・ファンクションなどのPL/SQLコードを生成するPL/SQLパッケージを指定します。

JPUB_PLSQL_WRAPPER

PL/SQLコード生成

-propsまたは-p

コマンドラインにリストされているオプション以外のJPublisherオプションを含むファイルを指定します。

NA

入力ファイル/項目

-proxyclasses

JPublisherで-proxyopts設定に従ってラッパー・クラスとPL/SQLラッパーを生成するJavaクラスを指定します。Webサービスの場合、通常はかわりに-proxywsdlを使用します(実際には-proxyclassesが使用されます)。

NA

Webサービス

-proxyopts

JavaラッパーとPL/SQLラッパーの必須レイヤーおよび追加の関連設定を指定します。

-proxywsdlおよび-proxyclassesオプションへの入力として使用されます。

jaxrpc

Webサービス

-proxywsdl

Webサービスのクライアント・プロキシ・クラスおよび関連Javaラッパー・クラスがPL/SQLラッパーとともに生成されるWSDLドキュメントのURLを指定します。

NA

Webサービス

-serializable

オブジェクト型用に生成されたコードでjava.io.Serializableインタフェースを実装するかどうかを指定します。

false

Javaコード生成

-sqlまたは-s

JPublisherでJavaクラスおよびオプションでサブクラスとインタフェースを生成するオブジェクト型、パッケージまたはパッケージのサブセットを指定します。

NA

入力ファイル/項目

-sqlj

JPublisherでSQLJ Translatorの起動に使用するSQLJオプションの設定を指定します。

NA

SQLJ

-sqlstatement

JPublisherで、該当するメソッドを持つJavaクラス(およびオプションでサブクラスとインタフェース)を生成する対象のSQL問合せまたはデータ操作言語(DML)文を指定します。

NA

入力ファイル/項目

-style

Java間の型マッピングに使用するスタイル・ファイルの名前を指定します。

NA

データ型マッピング

-sysuser

データベース内でWebサービスのクライアント・プロキシ・クラスにアクセスするラッパーを実行するためのパーミッションの付与に使用できる、スーパーユーザー・アカウントの名前とパスワードを指定します。

NA

Webサービス

-tostring

オブジェクト型用のtoString()メソッドを生成するかどうかを指定します。

false

Javaコード生成

-typemap

JPublisherの型マップを指定します。

空

型マップ

-types

JPublisherでコードを生成するオブジェクト型を指定します。

注意: このオプションは-sqlが優先されるために非推奨になっていますが、下位互換性のためにサポートされています。

NA

入力ファイル/項目

-url

JPublisherでデータベースの接続に使用するURLを指定します。

jdbc:oracle:oci:@

接続

-userまたは-u

接続に使用するOracleユーザー名およびパスワードを指定します。

NA

接続

-usertypes

JPublisherでユーザー定義のSQL型に使用するjdbcまたはoracle型マッピングを指定します。

oracle

データ型マッピング

-vm

デフォルト以外のバージョンを使用する場合のJavaのバージョンを指定します。

NA

Java環境

JPublisherオプションのヒント

JPublisherオプションには、次のような使用上の注意があります。

- JPublisherでは、常に-userオプションまたはその短縮形の-uが必要です。

- オプションはその出現順に処理されます。INPUTファイルからのオプションは、-inputまたは-iオプションが出現した時点で処理されます。同様に、プロパティ・ファイルからのオプションは、-propsまたは-pオプションが出現した時点で処理されます。

- 特定のオプションが複数回出現すると、通常、JPublisherではそのオプションで最後に出現した値が使用されます。ただし、次のオプションの場合はこれは該当せず、累積されます。
-sql

-types(非推奨)

-java

-addtypemapまたは-adddefaulttypemap

-style

- 通常、オプションと対応するオプション値は等号(=)で区切ります。ただし、次のオプションをコマンドラインで指定する場合は、セパレータとして空白も使用できます。
-sqlまたは-s、-userまたは-u、-propsまたは-p、および-inputまたは-i

- -sqljオプションを使用する場合は、-sqljオプションに続くSQLJ設定で等号を使用するため、等号のかわりに空白を使用する必要があります。次の例を考えてみます。-sqljの後の各エントリはSQLJオプションです。

% jpub -user=hr -sql=PERSON:Person -sqlj -optcols=true
-optparams=true -optparamdefaults=datatype1(size1),datatype2(size)
Enter hr password: password

- コマンドラインまたはプロパティ・ファイルで-packageオプションを使用して、生成されたクラス用のJavaパッケージを指定することをお薦めします。たとえば、コマンドラインでは次のように入力できます。

% jpub -sql=Person -package=e.f ...

または、プロパティ・ファイルに次のように入力できます。

jpub.sql=Person
jpub.package=e.f
...

これらの文により、Javaパッケージe.f内のクラスPerson(つまり、クラスe.f.Person)の作成をJPublisherに指示します。

関連項目:
「プロパティ・ファイルの構造および構文」

- INPUTファイルまたはコマンドラインで型またはパッケージを指定しない場合、JPublisherではユーザーのスキーマのすべての型およびパッケージが、コマンドラインまたはプロパティ・ファイルで指定したオプションに従って変換されます。

表記規則

後続の項で使用されるJPublisherオプション構文は、次の表記規則に従います。

- 中カッコ{...}は選択可能な値のリストを囲みます。中カッコ内の値から1つのみを指定します。

- 縦線|は中カッコ内の複数の選択項目を区切ります。

- イタリック体の部分はユーザー入力項目です。実際の値または文字列を指定します。

- 太字の部分はデフォルト値を示します。

- 大カッコ[...]はオプション項目を囲みます。ただし、大カッコや丸カッコが構文の一部になっていて、そのとおりの入力が必要な場合があります。その場合、このマニュアルでは太字の[...]または(...)を使用しています。

- 項目(またはカッコで囲まれた複数の項目)の直後に省略記号...がある場合は、その項目を何回でも繰り返すことができます。

- このマニュアルでは、この項で説明されている記号以外の記号は示されたとおりに入力します。たとえば、「.(ピリオド)」や「@」などです。

入力ファイルおよび公開する項目に関するオプション

この項では、主要な入力を指定する次のJPublisherオプションについて説明します。主要な入力とは、JPublisherの入力ファイル(INPUTファイルやプロパティ・ファイルなど)、あるいは公開する項目(SQLオブジェクト、PL/SQLパッケージ、SQL問合せ、SQL DML文またはサーバー・サイドJavaクラスなど)です。

- 入力ファイルのオプション: -input、-props

- 公開する項目のオプション: -java、-sql、-sqlstatement、-types

これらのオプションについてアルファベット順に説明します。

変換対象のオブジェクトとパッケージの名前を含むファイル

-inputオプションでは、JPublisherで公開するSQLエンティティ、PL/SQLエンティティまたはサーバー・サイドJavaクラスの名前を読み取るファイルの名前と、関連情報または指示を指定します。JPublisherでは、リストに指定した各項目が公開されます。INPUTファイルは、Javaクラス定義を必要とする型を示す型宣言のMakeファイルとみなすことができます。

-inputオプションの構文は次のとおりです。

-input=filename
-i filename

この2つの書式はシノニムです。2番目の書式は、便利なコマンドライン短縮形です。

JPublisherでは、INPUTファイルにない他のクラスの変換が必要な場合があります。これは、変換実行前にINPUTファイル内の型の依存関係が分析されて、必要に応じて他の型が変換されるためです。

INPUTファイルまたはコマンドラインで公開する項目を指定していない場合、JPublisherは、接続先のデータベース・スキーマで宣言されているユーザー定義のSQL型とPL/SQLパッケージをすべて変換します。

関連項目:
「追加の型変換」および「INPUTファイルの構造および構文」

公開対象のサーバー・サイドJavaクラスの宣言

-javaオプションを使用すると、サーバー・サイド・クラスにアクセスするクライアント・サイド・スタブ・クラスを作成できます。これは、データベース・クライアントからJavaストアド・プロシージャおよびファンクションをコールするには、関連PL/SQLラッパーへのJDBCコールが必要だった、以前のリリースのJPublisherからの改善点です。

-javaオプションの構文は次のとおりです。

-java=class_or_package_list

-javaオプションの機能は、-sqlオプションの機能をミラー化したものです。サーバー・サイドSQLオブジェクトまたはPL/SQLパッケージにアクセスするクライアント・サイドJavaクラスが作成されるのではなく、サーバー・サイドJavaクラスにアクセスするクライアント・サイドJavaスタブ・クラスが作成されます。

-javaオプションを使用する場合は、サーバー・サイドJavaクラスまたはパッケージのカンマ区切りのリストを指定します。

注意:

- -javaオプションを使用するには、データベース接続用の-userおよび-url設定も指定する必要があります。

- クライアントでは、サーバーと同じJava Development Kit (JDK)を使用することをお薦めします。

たとえば、次のようにします。

-java=foo.bar.Baz,foo.baz.*

または、デフォルトでサーバー・サイド名を使用するかわりに、Bazに対応するクライアント・サイド・クラス名を指定するには、次のようにします。

-java=foo.bar.Baz:MyBaz,foo.baz.*

この設定では、foo.bar.MyBazではなくMyBazが作成されます。

または

-java=foo.bar.Baz:foo.bar.MyBaz,foo.baz.*

また、スキーマも指定できます。

-java=foo.bar.Baz@HR

スキーマを指定すると、そのスキーマのみが検索されます。スキーマを指定しない場合は、ログイン・ユーザーのスキーマが-userオプションの設定に従って検索されます。これが最も一般的な使用例です。

たとえば、サーバー上の次のメソッドをコールする必要があるとします。

public String oracle.sqlj.checker.JdbcVersion.to_string();

次の-java設定を使用します。

-java=oracle.sqlj.checker.JdbcVersion

注意:
JPublisherでは、スキーマ(指定のスキーマまたはログイン・ユーザーのスキーマ)内で指定のクラスが見つからない場合、Class.forName()メソッドを使用してJava仮想マシン(JVM)内のシステム・クラス(通常はJava実行環境(JRE)クラスまたはJDKクラス)でクラスが検索されます。

-javaオプション用のコード生成 -javaオプションを使用する際、生成されたコードでは次のAPIが使用されます。

public class Client
{
public static String getSignature(Class[]);
public static Object invoke(Connection, String, String,
String, Object[]);
public static Object invoke(Connection, String, String,
Class[], Object[]);
}

このAPIのクラスはoracle.jpub.reflectパッケージにあるため、クライアント・アプリケーションではこのパッケージをインポートする必要があります。

-java=oracle.sqlj.checker.JdbcVersionに設定すると、JPublisherで生成されるコードには次のコールが含まれます。

Connection conn = ...;
String serverSqljVersion = (String)
Client.invoke(conn, "oracle.sqlj.checker.JdbcVersion",
"to_string", new Class[]{}, new Object[]{});

Class[]配列はメソッドのパラメータ型用で、Object[]配列はパラメータ値用です。この場合、to_stringにはパラメータがないため、各配列は空です。

次の点に注意してください。

- シリアライズ可能な型(int[]やString[]など)を引数として渡すことができます。

- このAPIのセマンティクスは、PL/SQLラッパーを介してJavaストアド・プロシージャまたはファンクションをコールする場合のセマンティクスとは次のように異なります。

- 引数にはOUTまたはIN OUTを使用できません。戻り値は、すべてファンクションの結果の一部である必要があります。

- 例外は正常に戻されます。

- メソッドのコールには、実行者権限が使用されます。定義者権限を取得するためのチューニング機能は用意されていません。

関連項目:
実行者権限と定義者権限の詳細は、『Oracle Database Java開発者ガイド』を参照してください。

公開対象のサーバー・サイドJavaクラスの宣言

サーバー・サイドJavaクラスの公開に関連するオプションは、次のとおりです。

- -dbajva=class_list

- -proxyopts=single|multiple|static|arrayin|arrayout|arrayinout
|arrayall|noload

- -compatible=10.1

- -sysuser=user/password

- -plsqlfile=wrapper[,dropper]

- -plsqlpackage=name

Oracle Database 10gリリース1 (10.1)には、サーバー・サイドJavaクラスを公開するための-javaオプションが導入されています。Oracle Database 10gリリース2 (10.2)には、サーバー・サイドJavaクラスの公開に対して新しい方法が導入されています。-dbjavaオプションを使用すると、サーバー・サイドJavaクラスをPL/SQLまたはクライアント・サイドJavaクラスに公開できます。class_list指定は、指定したサーバーにあるサーバー・サイド・クラスのカンマ区切りのリストです。class_list項目の書式は、classname[:name[#interface]]です。パッケージ名を指定することもできます。次のオプションを考えてみます。

-dbajva=classname[:name[#interface]]

nameを指定しない場合、サーバー・サイドJavaクラスclassnameがPL/SQLに公開され、指定した場合は、nameというクライアント・サイドJavaクラスに公開されます。interfaceを指定した場合は、クライアント・サイドJavaクラス用にインタフェース・ファイルが生成されます。

-proxyoptsオプションを-dbjavaと併用すると、インスタンス・メソッドのマップにシングルトン・インスタンスを使用するか複数インスタンスを使用するかが示されます。また、配列パラメータを持つメソッドをマップするかどうかも示します。この場合、配列はIN、OUT、IN OUT、または全モードと想定されます。-proxyopts=static設定は、静的メソッドのみが公開されることを指定します。デフォルト設定の-proxyopts=single,arrayinは、インスタンス・メソッドがシングルトン・インスタンスを使用してコールされ、配列パラメータが入力とみなされるということを示します。-proxyopts=noload設定は、JPublisherに対して、生成されたPL/SQLラッパーおよびJavaストアド・プロシージャ・ラッパーのロードを禁止します。

-compatible=10.1オプションにより、-dbjavaが-javaに等しくなります。

公開対象のサーバー・サイドJavaクラスの宣言

サーバー・サイドJavaクラスの公開に関連するオプションは、次のとおりです。

- -proxyclasses=class_or_jar_list

- -proxyopts=single|multiple|static|arrayin|arrayout|arrayinout
|arrayall

- -plsqlfile=wrapper[,dropper]

- -plsqlpackage=name

-proxyclassesオプションは-dbjavaとよく似ています。-dbjavaでは公開対象のクラスがデータベース内に存在する必要がありますが、-proxyclassesではクラスがCLASSPATH内に存在する必要があります。通常、-proxyclassesを使用すると、公開済クラスおよび生成済ラッパーを後でデータベースにロードできます。
-proxyclassesオプションにより生成されるのは、PL/SQLラッパーのみです。-dbjavaとは異なり、サーバー・サイドJavaクラス用のクライアント・サイドJavaコードは生成されません。また-dbjavaとは異なり、-proxyclassesでは生成されたJavaストアド・プロシージャをデータベースにロードしません。

-proxyclassesオプションを使用すると、JPublisherでPL/SQLラッパーを作成するJavaクラス(緩やかなクラスまたはJava Archive(JAR)ファイル)のカンマ区切りのリストを指定できます。状況によっては、PL/SQLからのアクセス用にJPublisherでJavaラッパー・クラスも作成される場合があります。処理される各クラスにはパブリック・メソッドまたは静的メソッドが必要で、インスタンス・メソッドを公開するクラスの場合は引数のないpublicコンストラクタが必要です。

まとめると、-proxyoptsオプションの設定に応じて、処理されるクラスごとに次が生成されます。

- PL/SQLからのアクセスを可能にするPL/SQLラッパー。これは常に生成されます。

- 公開するインスタンス・メソッドが存在する場合、Javaインスタンス・メソッドを静的メソッドとして公開するラッパー・クラス。

インスタンスのメソッドは、PL/SQLからアクセスできるように静的メソッドとして公開する必要があります。また、ラップするクラスのメソッド・コール順序にJavaプリミティブ型以外が使用されている場合も、ラッパー・クラスが必要になります。

-proxyclassesオプションを直接使用している場合は、JARファイルおよびCLASSPATH内に存在するJavaクラスを指定できます。クラスとJARファイルは、次のように指定できます。

- クラス名。foo.bar.Bazまたはfoo.bar.Baz.classなど。

- パッケージ名。foo.bar.*(@serverモードの場合のみ)など。

- JARまたはZIPファイル名。foo/bar/baz.jarまたはBaz.zipなど。

- JARまたはZIPファイル名とそれに続くクラスまたはパッケージをカッコで囲んだリスト。baz.jar (foo.MyClass1, foo.bar.MyClass2, foo1.*)など。

JavaおよびPL/SQLラッパー生成用の設定

-proxyoptsオプションは、-dbjava、-proxywsdlおよび-proxyclassesオプションで入力として使用され、サーバー・サイドJavaクラスのラッパー・クラスおよびPL/SQLラッパーの生成時のJPublisher動作を指定します。

-proxyoptsオプションの構文は次のとおりです。

-proxyopts=setting1,setting2,...

このオプションでは、後述する基本設定を個別にまたは組み合せて使用します。この説明で、処理対象クラスとは、-dbjavaオプション、-proxywsdlオプションまたは-proxyclassesオプションを使用してラップされたクラスを意味します。

Javaラッパー・クラスが生成される場合、-packageオプションの設定によりパッケージがオーバーライドされないかぎり、foo.bar.MyClassクラスのラッパー・クラスはfoo.bar.MyClassJPubとなります。

基本の-proxyoptsの設定は次のように使用できます。

- static設定を使用すると、処理対象クラスの静的メソッドの取扱い処理を指定できます。
この設定を使用すると、PL/SQLラッパーには、静的メソッドごとにラッパー・プロシージャが生成されます。この設定を使用しない場合、静的メソッドは無視されます。静的メソッドのみを含むクラスの場合は、メソッドのコール順序にJavaプリミティブ型のみを使用する処理対象クラスに、ラッパー・クラスは不要です。

- multipleまたはsingle設定を使用すると、インスタンスのメソッドを静的メソッドとして公開する場合に、処理対象クラスのインスタンス・メソッドの取扱いを指定できます。どちらの場合も、処理対象クラスごとに、PL/SQLラッパーが生成されるのみではなく、インスタンス・メソッドを静的メソッドでラップする中間的なJavaクラスが生成されます。
instance設定を使用すると、インスタンスのメソッドをそのまま維持する場合に、処理対象クラスのインスタンス・メソッドの取扱いを指定できます。

これらの設定の機能は次のとおりです。

- multiple
処理対象クラスごとに、Javaラッパー・クラスにはハンドルを使用して各インスタンス・メソッドと同等の静的メソッドが含められ、各ハンドルにより、ラップされるクラスのインスタンスが識別されます。

- single
実行時に、ラップされるクラスごとにデフォルトのインスタンスが1つのみ使用されます。処理対象クラスごとに、Javaラッパー・クラスにはインスタンス・メソッドの静的ラッパー・メソッドが含まれ、ハンドルを使用する必要はありません。これはシングルトン・メカニズムです。

- instance
インスタンス・メソッドは、Javaラッパー・クラス内でインスタンス・メソッドとしてラップされます。

注意:
instance設定はWebサービスには該当しません。

前述の設定のいずれか、あるいは、singleを暗黙的に示すjaxrpcまたはsoap設定が指定されていない場合、インスタンス・メソッドは無視されます。いずれかを設定した場合は、引数のないパブリック・コンストラクタを提供するクラスのみが処理されます。両方の設定を使用すると、両方のスタイルによるラッパー・クラスを生成できます。

- jaxrpcまたはsoap設定を使用すると、Webサービス・クライアント・プロキシ・クラスのインスタンスのメソッドを公開できます。これらの設定の機能は次のとおりです。

- jaxrpc
これはデフォルト設定です。これはJAX-RPCクライアント・プロキシ・クラスをラップする場合に便利な設定で、Oracle Application Server 10gリリース10.0.1以降で使用する場合に適しています。JPublisherでは、処理対象クラスごとにJavaラッパー・クラスが作成され、PL/SQLラッパーも作成されます。クライアント・プロキシ・クラスには公開対象の静的メソッドがなく、デフォルトではシングルトン・メカニズムを使用してインスタンス・メソッドが公開されます。したがって、JAX-RPCクライアント・プロキシ・クラスを処理する場合は、-proxyopts=jaxrpcに設定すると-proxyopts=singleが暗黙的に設定されます。jaxrpc設定でも、JAX-RPCクライアント固有の特殊コードが生成されます。

- soap
この設定はjaxrpc設定と等価ですが、JAX-RPCクライアント・プロキシ・クラスではなくSOAPクライアント・プロキシ・クラスがラップされます。これは、Oracle Application Server 10g(9.0.4)以前のリリースで使用する場合に適しています。

-proxyoptsオプションの基本的な使用方法を次に示します。

-proxyopts=jaxrpc

-proxyopts=soap

-proxyopts=static

-proxyopts=static,instance

-proxyopts=single

-proxyopts=single,multiple

-proxyopts=static,multiple

static,instance設定では、静的メソッドとインスタンス・メソッドが公開されます。single,multiple設定では、シングルトン・メカニズムおよびハンドル・メカニズムの両方を使用して、インスタンス・メソッドのみが公開されます。static,multiple設定では、インスタンス・メソッドを静的メソッドとして公開するためのハンドル・メカニズムを使用して、静的メソッドおよびインスタンス・メソッドが公開されます。

注意:
-proxyoptsオプションは、-proxywsdlオプションと併用するよりも、-proxyclassesオプションと明示的に併用する方が一般的です。-proxywsdlをOracle Application Server 10g リリース10.0.xで使用する場合は、デフォルトの-proxyopts=jaxrpc設定で十分です。

その他に、より高度な-proxyopts設定も用意されています。各設定の機能は次のとおりです。

- noload
この設定を使用して、生成されるコードをデータベースにロードする必要がないことを示します。デフォルトでは、生成されるコードはロードされます。

- recursive
この設定を使用して、別のクラスを拡張するクラスを処理するときに、継承されるメソッドのPL/SQLラッパーとJavaラッパー(該当する場合)も作成することを示します。

- tabfun
この設定をjaxrpcまたはsoap設定と使用すると、JPublisherではラップされるWebサービス操作ごとにPL/SQLパッケージ用のPL/SQLテーブル・ファンクションが生成されます。これにより、データはストアド・プロシージャまたはファンクションではなく、データベース表を介して公開されます。

Webサービス操作に配列型をパラメータ型として含める場合、-proxyopts=tabfun設定を使用しないでください。この場合、JPublisherでは、SQLテーブルをパラメータ型としてPL/SQLストアド・プロシージャが生成されます。したがって、-proxyopts=tabfun設定では、生成されるPL/SQLラッパーでコンパイル・エラーが生じます。

- deterministic
この設定を使用して、生成されるPL/SQLラッパーにラップされるメソッドがDETERMINISTICであることを示します。通常は、この設定をtabfun設定とともに使用します。DETERMINISTICはPL/SQLの注釈です。

関連項目:
DETERMINISTICファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

- main(0,...)
この設定をstatic設定とともに使用して、クラスにpublic void String main(String[])メソッドがある場合に生成されるラッパー・メソッドを定義します。サポートする引数の数ごとに、別個のメソッドが生成されます。次の例に示すように、引数の数を示すときはカンマまたはハイフンを使用できます。

- mainまたはmain(0)の場合は、引数が0(ゼロ)個のときにのみラッパー・メソッドが生成されます。

- main(0,1)の場合は、引数が0(ゼロ)個および1個のときにラッパー・メソッドが生成されます。これはデフォルト設定です。

- main(0-3)の場合は、引数が0(ゼロ)個、1個、2個および3個のときにラッパー・メソッドが生成されます。

- main(0,2-4)の場合は、引数が0(ゼロ)個、2個、3個および4個のときにラッパー・メソッドが生成されます。

main()メソッドのラッパー・メソッドの引数の最大数は、PL/SQLの制限に従います。

次の例では、デフォルトでjaxrpcの基本設定を使用します。ここでは、テーブル・ファンクションも使用し、ラップされるメソッドがDETERMINISTICであると指定しています。

-proxyopts=tabfun,deterministic

次の例では、staticモードを明示的に設定し、クライアント・プロキシ・クラスではないクラスを処理し、生成されるコードをデータベースにロードしないように指定しています。

-proxyopts=static,noload

入力プロパティ・ファイル

-propsオプションは、JPublisherオプション設定を指定するJPublisherプロパティ・ファイルの名前を指定します。JPublisherでは、-propsオプションが指定されているコマンドラインからプロパティ・ファイルの内容が順序どおり挿入されたかのように処理されます。

-propsオプションの構文は次のとおりです。

-props=filename
-p filename

この2つの書式はシノニムです。2番目の書式は、便利なコマンドライン短縮形です。

複数のプロパティ・ファイルがコマンドラインにある場合、JPublisherでは他のコマンドライン・オプションとともに、それらのプロパティ・ファイルが表示順に処理されます。

関連項目:
「プロパティ・ファイルの構造および構文」

注意:
エンコーディング設定は、JPublisherの-encodingオプションとJavaのfile.encoding設定のいずれを使用して設定する場合にも、Javaプロパティ・ファイルには適用しないでください。プロパティ・ファイルでは、常に8859_1エンコーディングが使用されます。これは、JPublisher固有の機能ではなくJava全般の機能です。ただし、プロパティ・ファイルではUnicodeエスケープ・シーケンスを使用できます。

変換対象のオブジェクト型およびパッケージの宣言

-sqlオプションを使用して、公開する必要のあるSQLユーザー定義型(オブジェクトまたはコレクションなど)あるいはPL/SQLパッケージを指定します。オプションで、生成する必要のあるユーザー・サブクラスやインタフェースも指定できます。PL/SQLパッケージ全体または指定したサブセットを公開できます。

-sqlオプションの構文は次のとおりです。

-sql={toplevel|object_type_and_package_translation_syntax}
-s {toplevel|object_type_and_package_translation_syntax}

このオプションの2つの書式(-sqlおよび-s)はシノニムです。書式-sは、便利なコマンドラインの短縮形として使用できるように用意されています。

INPUTファイルを汎用的に使用する必要がない場合は、-sqlオプションを使用できます。-sqlオプションを使用すると、JPublisherで変換する、SQLで宣言された1つ以上のデータベース・エンティティをリストできます。または、同じコマンドラインに複数の-sqlオプションを指定する方法や、プロパティ・ファイル内で複数のjpub.sqlオプションを指定する方法があります。

同じ-sql宣言内では、ユーザー定義型の名前とパッケージ名を混在できます。JPublisherでは、それぞれの項目がオブジェクト型かパッケージであるかを検出できます。また、キーワードtoplevel付きの-sqlオプションを使用して、スキーマ内のすべてのパッケージに属さないPL/SQLプロシージャ・ファンクションを変換できます。toplevelキーワードは大/小文字を区別しません。

INPUTファイルまたはコマンドラインに変換対象の型やパッケージを入力しない場合、JPublisherでは接続先のスキーマ内にあるすべての型およびパッケージが変換されます。この項では、-sqlオプションを等価のINPUTファイル構文に変換して説明します。

関連項目:
「変換文について」

次のいずれかの構文モードを使用できます。

- -sql=name_a
JPublisherでは、生成されたクラスにデフォルト設定に従って名前が与えられ、name_aが公開されます。INPUTファイルでは、このオプションは次のように指定します。

SQL name_a

- -sql=name_a:class_c
生成されたJavaクラスclass_cとしてname_aが公開されます。INPUTファイルでは、このオプションは次のように指定します。

SQL name_a AS class_c

- -sql=name_a:class_b:class_c
この場合、name_aはオブジェクト型を表す必要があります。Javaクラスclass_bと、class_bを拡張するスタブ・クラスclass_cが生成されます。class_cのコードを提供すると、Javaコードでname_aを表すために使用されます。INPUTファイルでは、このオプションは次のように指定します。

SQL name_a GENERATE class_b AS class_c

- -sql=name_a:class_b#intfc_b

- -sql=name_a:class_b:class_c#intfc_c
この構文書式のいずれかを使用すると、JPublisherでJavaインタフェースが生成されます。この機能はWebサービスに特に有効です。最初の書式では、class_bはname_aを表し、intfc_bを実装します。2番目の書式では、class_cはname_aを表し、class_bを拡張し、intfc_cを実装します。

関連項目:
「Javaインタフェースの生成」

インタフェースは、生成されるクラスまたはユーザー・サブクラスの両方ではなく、どちらか一方についてのみ指定します。INPUTファイルでは、この構文は次のようになります。

SQL name_a
[GENERATE  class_b
[ implements intfc_b] ]
[AS        class_c
[ implements intfc_c ] ]
...

注意:

- JPublisherのコマンドラインでサポートされるのは、大/小文字区別のないSQL名のみです。SQLでユーザー定義型が大/小文字を区別して引用符で囲んで定義されている場合は、コマンドラインにそのユーザー定義型を引用符で囲んで指定するのではなく、JPublisherのINPUTファイルにその名前を指定する必要があります。

- 必要なクラス名とインタフェース名がパターンに従っている場合は、-genpatternコマンドライン・オプションを使用できます。

複数の変換項目を入力する場合は、空白を使用せずに各項目をカンマで区切る必要があります。次の例では、CORPORATIONをパッケージ、EMPLOYEEおよびADDRESSをオブジェクト型と想定します。

-sql=CORPORATION,EMPLOYEE:OracleEmployee,ADDRESS:JAddress:MyAddress

JPublisherではこのコマンドが次のように解析されます。

SQL CORPORATION
SQL EMPLOYEE AS OracleEmployee
SQL ADDRESS GENERATE JAddress AS MyAddress

JPublisherでは次の処理が実行されます。

- CORPORATIONパッケージにラッパー・クラスが作成されます。

- オブジェクト型EMPLOYEEがOracleEmployeeとして変換されます。

- オブジェクト参照クラスOracleEmployeeRefが生成されます。

- ADDRESSがJAddressとして変換されますが、ADDRESSオブジェクトがMyAddressクラスで表されるようにコードおよび参照が生成されます。

- JAddressを拡張するMyAddressスタブが生成されます。ここにカスタム・コードを記述します。

- オブジェクト参照クラスMyAddressRefが生成されます。

JPublisherで接続先スキーマにあるトップレベルのPL/SQLサブプログラムをすべて変換する場合は、-sqlオプションに続けてキーワードtoplevelを入力します。JPublisherでは、トップレベルのPL/SQLサブプログラムがパッケージ内にあるかのように扱われます。たとえば、次のようにします。

-sql=toplevel

JPublisherでは、パッケージに属さないプロシージャやファンクション用にラッパー・クラスtoplevelが生成されます。このクラスを異なる名前で生成する場合は、クラス名を次のように宣言できます。

-sql=toplevel:MyClass

これは次のINPUTファイル構文のシノニムであることに注意してください。

SQL toplevel AS MyClass

同様に、JPublisherで他のスキーマにあるトップレベルのPL/SQLサブプログラムをすべて変換する場合は、次のように入力します。

-sql=schema_name.toplevel

この例で、schema_nameは、トップレベルのサブプログラムを含むスキーマの名前です。さらに、次の構文を使用して、PL/SQLパッケージ内またはトップレベルにあるストアド・プロシージャのサブセットのみを公開する機能も用意されています。

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

ストアド・プロシージャ名はプラス記号(+)で区切ります。また、SQLのトップレベルの場合は、次の構文を使用します。

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

次の構文はJPublisherのINPUTファイル用で、ストアド・プロシージャの名前はカンマで区切ります。

SQL plsql_package (proc1, proc2, proc3, ...) AS ...

注意:

- INPUTファイルでは、ストアド・プロシージャ名に大/小文字区別がある場合は引用符で囲みます。たとえば、"proc1"のように指定します。JPublisherでは、引用符で囲まれていない名前は大/小文字区別がないものとみなされます。

- 大/小文字区別のある名前は、JPublisherのコマンドラインではサポートされません。

- 指定するストアド・プロシージャ名の末尾にワイルドカード文字%を使用できます。たとえば、myfunc%と指定すると、myfunc1など、名前がmyfuncで始まるストアド・プロシージャと一致します。

また、次の構文を使用し、ストアド・プロシージャ名と引数の型に従ってサブセットを指定することもできます。

myfunc(sqltype1, sqltype2, ...)

この場合、名前および引数の数と型が一致するストアド・プロシージャのみが公開されます。たとえば、次のようにします。

-sql=mypackage(myfunc1(NUMBER, CHAR)+myfunc2(VARCHAR2))

変換対象のSQL文の宣言

-sqlstatementオプションを使用すると、SELECT、INSERT、UPDATEまたはDELETE文をJavaメソッドとして公開できます。この機能に使用するSQLJクラスが生成されます。

-sqlstatementオプションの構文は次のとおりです。

-sqlstatement.class=ClassName:UserClassName#UserInterfaceName
-sqlstatement.methodName=sqlStatement
-sqlstatement.return={both|resultset|beans}

-sqlstatement.classを使用して、メソッドを公開するJavaクラスを指定します。JPublisherで生成されるクラスに加え、生成されるクラスのユーザー・サブクラス、生成されるクラスまたはサブクラスのユーザー・インタフェース、あるいはその両方を必要に応じて指定できます。サブクラスとインタフェースに関する機能は、-sqlオプションと同じです。JPublisherの-packageオプションも使用すると、指定のクラスが指定のパッケージに生成されます。デフォルトのクラスはSQLStatementsです。

必要なJavaメソッド名とSQL文を指定するには、-sqlstatement.methodNameを使用します。SELECT文の場合は、-sqlstatement.returnを使用し、JPublisherで生成する必要のあるメソッドとして、汎用java.sql.ResultSetインスタンスを戻すメソッドまたはJavaBeansの配列を戻すメソッド、あるいはその両方を指定します。汎用とは、結果セットの列の型が不明または未指定であることを意味します。

ただし、問合せに関しては、列の型が実際にわかっています。これにより、Beansの配列を介して特定の結果を戻すという選択肢が提供されます。ResultSetを戻すメソッドの名前は、methodName()となります。JavaBeansを戻すメソッドの名前は、methodNameBeans()となります。

注意:
必要なクラス名とインタフェース名がパターンに従っている場合は、-genpatternオプションを使用できます。

INPUTファイル構文は、次のとおりです。

SQLSTATEMENTS_TYPE ClassName AS UserClassName
IMPLEMENTS UserInterfaceName
SQLSTATEMENTS_METHOD aSqlStatement AS methodName

一連のサンプル設定を次に示します。

-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
where ename=:{myname VARCHAR}"
-sqlstatement.return=both

これらの設定により生成されるコードは、「生成されるコード: SQL文」を参照してください。

また、-styleオプションを介して指定したスタイル・ファイルが-sqlstatementオプションに関係することに注意してください。SQL文でJava型Yに対応するOracleデータ型Xを使用する場合に、スタイル・ファイル内でY型がJava型Zにマップされていると、-sqlstatementオプションの結果として生成されるメソッドではYではなくZが使用されます。

SELECT文またはDML文の結果の場合は、スタイル・ファイルを使用して結果をjavax.xml.transform.Source、oracle.jdbc.rowset.OracleWebRowSetまたはorg.w3c.dom.Documentにマップできます。

関連項目:
「JPublisherのスタイルおよびスタイル・ファイル」および「REF CURSOR型と結果セットのマッピング」

変換対象のオブジェクト型の宣言

-typesオプションを使用すると、JPublisherで変換する1つ以上の個別オブジェクト型をリストできます。-typesオプションの構文は次のとおりです。

-types=type_translation_syntax

注意:
-typesオプションは互換性を保つために現在サポートされていますが、非推奨です。かわりに-sqlオプションを使用してください。

INPUTファイルを汎用的に使用する必要がない場合は、SQLオブジェクト型に対してのみ-typesオプションを使用できます。-typesオプションはPL/SQLパッケージをサポートしない点を除いては、-sqlオプションと同一です。

INPUTファイルまたはコマンドラインに変換対象の型やパッケージを入力しない場合、JPublisherでは接続先のスキーマ内にあるすべての型およびパッケージが変換されます。コマンドライン構文では、次の3つの型変換を指定できます。

- -types=name_a
JPublisherではこの構文は次のように解析されます。

TYPE name_a

- -types=name_a:name_b
JPublisherではこの構文は次のように解析されます。

TYPE name_a AS name_b

- -types=name_a:name_b:name_c
JPublisherではこの構文は次のように解析されます。

TYPE name_a GENERATE name_b AS name_c

TYPE、TYPE...ASおよびTYPE...GENERATE...ASコマンドの機能は、SQL、SQL...ASおよびSQL...GENERATE...AS構文と同じです。

関連項目:
「変換文について」

コマンドラインで-types=...と入力した後、JPublisherで実行する1つ以上のオブジェクト型変換を入力します。複数項目を入力する場合は、空白を使用せずに各項目をカンマで区切る必要があります。たとえば、次のように入力したとします。

-types=CORPORATION,EMPLOYEE:OracleEmployee,ADDRESS:JAddress:MyAddress

JPublisherではこのコマンドは次のように解析されます。

TYPE CORPORATION
TYPE EMPLOYEE AS OracleEmployee
TYPE ADDRESS GENERATE JAddress AS MyAddress

接続オプション

この項では、JPublisherで使用されるデータベース接続関連のオプションについて説明します。これらのオプションをアルファベット順に説明します。

SQLJ接続コンテキスト・クラス

-contextオプションでは、JPublisherで使用され、JPublisherで生成されるSQLJクラスについて宣言できる接続コンテキスト・クラスを指定します。-contextオプションの構文は次のとおりです。

-context={generated|DefaultContext|user_defined}

-context=DefaultContextはデフォルトの設定で、JPublisherで生成されたSQLJクラスでは、すべての接続コンテキストにSQLJのデフォルト接続コンテキスト・クラスsqlj.runtime.ref.DefaultContextが使用されます。ほとんどの使用方法では、これで十分です。

あるいは、標準sqlj.runtime.ConnectionContextインタフェースを実装し、CLASSPATHに存在するユーザー定義クラスを指定できます。指定したクラスがすべての接続コンテキストに使用されます。

注意:
ユーザー定義クラスを使用する場合は、そのクラスのインスタンスをgetConnectionContext()メソッドからの出力またはsetConnectionContext()メソッドへの入力に使用する必要があります。これらのメソッドの詳細は、「SQLJクラスでの接続コンテキストおよびインスタンス」を参照してください。

-context=generatedに設定すると、JPublisherで生成されるすべてのSQLJクラスで、接続コンテキスト・クラス_Ctxのインナー・クラスが宣言されます。そのため、各クラスでは独自のSQLJ接続コンテキスト・クラスが使用されます。この設定は、Oracle8i互換モードに適している場合がありますが、それ以外の場合にはお薦めしません。DefaultContextクラスまたはユーザー定義クラスを使用すると、追加の接続コンテキスト・クラスは生成されません。コマンドラインまたはプロパティ・ファイルで-contextオプションを指定できます。

下位互換性モードで-contextを使用する場合の注意

下位互換性モードを使用し、.sqljファイルとSQLJ Translatorを直接使用する場合は、.sqljファイルの変換とコンパイルを別々のステップで実行し、SQLJの-compile=false設定を使用して変換すると、-context=DefaultContext設定により柔軟性が高くなります。JDK 1.2固有の型(java.sql.BLOB、CLOB、Struct、RefまたはArrayなど)を使用しない場合、生成された.javaファイルはJDK 1.1またはJDK 1.2以上でコンパイルできます。ただし、これは-context=generated設定を使用する場合は該当しません。これは、JDK 1.1でのSQLJ接続コンテキスト・クラスはオブジェクト型のマップにjava.util.Dictionaryインスタンスを使用しますが、JDK 1.2以上のSQLJ接続コンテキスト・クラスはjava.util.Mapインスタンスを使用するためです。

.sqljファイルを直接操作する場合に-context=generated設定を使用する利点は、SQLJ Translatorによるオンライン・チェックの実行方法を全面的に制御できることです。特に、SQLユーザー定義型およびPL/SQLパッケージを、適切なサンプル・データベース・スキーマに対してチェックできます。ただし、JPublisherでは既存のスキーマから.sqljファイルが生成されるため、生成されたコードが適切かどうかは、そのスキーマからの構成を通じてすでに検証済です。

デフォルトのdatasourceオプション

-datasourceを使用すると、SQL、PL/SQL、AQおよびサーバー・サイドJavaクラスの公開に使用するデフォルトのデータ・ソースを指定できます。-datasourceを設定すると、JDBC接続がアプリケーションの実行時に明示的に設定されない場合、生成されたコードは指定のJava Naming and Directory Interface(JNDI)の場所を参照してデータ・ソースを取得し、さらにそのデータ・ソースからJDBC接続を取得します。

-datasourceオプションの構文は次のとおりです。

-datasource=jndi_location

データベース接続用のJDBCドライバ・クラス

-driverオプションは、JPublisherでデータベースとのJDBC接続に使用するドライバのクラスを指定します。このオプションの構文は次のとおりです。

-driver=driver_class_name

デフォルト設定は次のとおりです。

-driver=oracle.jdbc.OracleDriver

この設定はあらゆるOracle JDBCドライバに適合します。

ターゲット・データベースへの接続URL

-urlオプションを使用して、接続先のデータベースのURLを指定できます。-urlオプションの構文は次のとおりです。

-url=URL

デフォルト設定は次のとおりです。

-url=jdbc:oracle:oci:@

JDBC Thinドライバを指定するには、次の書式の設定を使用します。

-url=jdbc:oracle:thin:@host:port/servicename

この構文で、hostはデータベースを実行するホストの名前、portはポート番号、servicenameはデータベース・サービス名です。

注意:
システム識別子(SID)はOracle Database 10gからは非推奨になりましたが、下位互換性のために引き続きサポートされます。SIDを使用する場合の書式は、host:port:sidです。
Oracle JDBC Oracle Call Interface(OCI)ドライバの場合は、新規コードの接続文字列にociを使用します。ただし、下位互換性のためにOracle8iドライバの場合はoci8も引き続き使用できます。

データベース接続用のユーザー名とパスワード

JPublisherには、データベースに接続できるように、Oracleユーザー名とパスワードを指定する-userオプションが必要です。-userオプションを入力しない場合、JPublisherではエラー・メッセージが発行されて実行が停止します。

-userオプションの構文は次のとおりです。

-user=username/password
-u username/password

この2つの書式は等価です。2番目の書式は、便利なコマンドライン短縮形です。

たとえば、次のコマンドは、ユーザー名hrを使用してデータベースに接続するようにJPublisherに指示します。

% jpub -user=hr -input=demoin -dir=demo -mapping=oracle -package=corp
Enter hr password: password

データ型マッピングのオプション

次のオプションは、JPublisherでオブジェクト型、コレクション型、オブジェクト参照型およびPL/SQLパッケージをJavaクラスに変換するときに使用するデータ型マッピングを制御します。

- -usertypesオプションは、oracleマッピング用の-compatibleオプションとともに、ユーザー定義型に対するJPublisherの動作を制御します。特に、JPublisherで生成されたクラスにOracle ORADataインタフェースと標準SQLDataインタフェースのどちらを実装するか、およびJPublisherでコレクション型とオブジェクト参照型用のコードを生成するかどうかを制御します。

- -numbertypesオプションは、数値型のデータ型マッピングを制御します。

- -lobtypesオプションは、BLOB、CLOBおよびBFILE型のデータ型マッピングを制御します。

- -builtintypesオプションは、非数値型で非LOB型の、事前定義済SQL型およびPL/SQL型のデータ型マッピングを制御します。

これらの4つのオプションは、型マッピング・オプションと呼ばれます。

オブジェクト型の場合、JPublisherで型マッピング・オプションにより指定したマッピングが、オブジェクトの属性およびそのオブジェクトに含まれるメソッドの引数と結果に適用されます。マッピングにより、生成済のアクセッサ・メソッドがサポートする型が制御されます。たとえば、getXXX()メソッドが戻す型やsetXXX()メソッドが受け入れる型をサポートします。

PL/SQLパッケージの場合、JPublisherではマッピングはパッケージ内のメソッドの引数および結果に適用されます。コレクション型の場合、JPublisherではマッピングはコレクション要素の型に適用されます。

また、通常はWebサービスをサポートするために、Java間の型マッピングを指定できる、-styleオプションについても後述します。そのためには、JPublisherのステップが1つ多くなります。SQL型は、JPublisherで生成されるベース・クラス内でWebサービスによりサポートされていないJava型にマップされます。次に、このJava型は、JPublisherで生成されるユーザー・サブクラス内でWebサービスによりサポートされているJava型にマップされます。

関連項目:
「JPublisherのスタイルとスタイル・ファイル」

組込み型のマッピング

-builtintypesオプションは、-lobtypesオプションにより制御されるLOB型と-numbertypesオプションにより制御される様々な数値型を除く、すべての組込みデータ型のデータ型マッピングを制御します。-builtintypesオプションの構文は次のとおりです。

-builtintypes={jdbc|oracle}

表6-2に、-builtintypesオプションの影響を受けるデータ型を示します。また、-builtintypes=oracleおよび-builtintypes=jdbc(デフォルト)のJava型マッピングも示します。

表6-2 -builtintypesオプションの影響を受ける型のマッピング

SQLデータ型

Oracleマッピングの型

JDBCマッピングの型

CHAR、CHARACTER、LONG、STRING、VARCHAR、VARCHAR2

oracle.sql.CHAR

java.lang.String

RAW、LONG RAW

oracle.sql.RAW

byte[]

DATE

oracle.sql.DATE

java.sql.Timestamp

TIMESTAMP

TIMESTAMP WITH TZ

TIMESTAMP WITH LOCAL TZ

oracle.sql.TIMESTAMP

oracle.sql.TIMESTAMPTZ

oracle.sql.TIMESTAMPLTZ

java.sql.Timestamp

LOB型のマッピング

-lobtypesオプションは、LOB型のデータ型マッピングを制御します。-lobtypesオプションの構文は次のとおりです。

-lobtypes={jdbc|oracle}

表6-3に、これらの型が-lobtypes=oracle(デフォルト)および-lobtypes=jdbcにどのようにマップされるかを示します。

表6-3 -lobtypesオプションの影響を受ける型のマッピング

SQLデータ型

Oracleマッピングの型

JDBCマッピングの型

CLOB

oracle.sql.CLOB

java.sql.Clob

BLOB

oracle.sql.BLOB

java.sql.Blob

BFILE

oracle.sql.BFILE

oracle.sql.BFILE

注意:

- BFILEはOracle固有のSQL型であるため、標準のjava.sql.BfileのJava型はありません。

- NCLOBはOracle固有のSQL型です。CLOBの使用をNCHAR形式で示すもので、Javaではoracle.sql.NCLOBのインスタンスとして表されます。

- java.sql.Clobインタフェースおよびjava.sql.Blobインタフェースは、JDK1.2バージョンで導入されています。

数値型のマッピング

-numbertypesオプションは、数値SQL型およびPL/SQL型のデータ型マッピングを制御します。-numbertypesオプションの構文は次のとおりです。

-numbertypes={jdbc|objectjdbc|bigdecimal|oracle}

次の選択肢を使用できます。

- JDBCマッピングでは、ほとんどの数値型はintおよびfloatなどのJavaプリミティブ型にマップされ、DECIMALおよびNUMBERはjava.math.BigDecimalにマップされます。

- Object JDBCマッピング(デフォルト)では、ほとんどの数値データ型はjava.lang.Integerやjava.lang.FloatなどのJavaラッパー・クラスにマップされます。DECIMALおよびNUMBERはjava.math.BigDecimalにマップされます。

- BigDecimalマッピングでは、すべての数値型がjava.math.BigDecimalにマップされます。

- Oracleマッピングでは、すべての数値データ型がoracle.sql.NUMBERにマップされます。

表6-4に、-numbertypesオプションの影響を受けるデータ型を示します。また、-numbertypes=jdbcおよび-numbertypes=objectjdbc(デフォルト)のJava型マッピングも示します。

表6-4 -numbertypesオプションの影響を受ける型のマッピング

SQLデータ型

JDBCマッピングの型

Object JDBCマッピングの型

BINARY_INTEGER、INT、INTEGER、NATURAL、NATURALN、PLS_INTEGER、POSITIVE、POSITIVEN、SIGNTYPE

int

java.lang.Integer

SMALLINT

int

java.lang.Integer

REAL

float

java.lang.Float

DOUBLE PRECISION、FLOAT

double

java.lang.Double

DEC、DECIMAL、NUMBER、NUMERIC

java.math.BigDecimal

java.math.BigDecimal

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

-usertypesオプションは、ユーザー定義型用に生成されたクラスに、Oracle ORADataインタフェースと標準SQLDataインタフェースのどちらを実装するかを制御します。-usertypesオプションの構文は次のとおりです。

-usertypes={oracle|jdbc}

-usertypes=oracle(デフォルト)の場合、JPublisherではオブジェクト型、コレクション型およびオブジェクト参照型用にORADataクラスが生成されます。

-usertypes=jdbcの場合、JPublisherではオブジェクト型用にSQLDataクラスが生成されます。この場合、JPublisherではコレクション型またはオブジェクト参照型用のクラスは生成しません。すべてのコレクション型にはjava.sql.Arrayを、すべてのオブジェクト参照型にはjava.sql.Refを使用する必要があります。

注意:

- SQLDataインタフェースはJDBC 2.0の機能であるため、-usertypes=jdbc設定にはJDK 1.2以上が必要です。

- -compatibleオプションの特定の設定では、-usertypes=oracleに設定すると、ORADataインタフェースのかわりに非推奨のCustomDatumインタフェースを実装するクラスが生成されます。

すべての型のマッピング

-mappingオプションでは、すべてのデータ型のマッピングを指定するため、型間の柔軟性はほとんど得られません。-mappingオプションの構文は次のとおりです。

-mapping={jdbc|objectjdbc|bigdecimal|oracle}

注意:
このオプションは、より限定的な型マッピング・オプション-usertypes、-numbertypes、-builtintypesおよび-lobtypesのために非推奨になっています。ただし、下位互換性のために引き続きサポートされています。

-mapping=oracle設定は、すべての型マッピング・オプションをoracleに設定するのと同等です。他の-mapping設定は、-numbertypesを-mappingの値と同一に設定し、他の型マッピング・オプションをデフォルトに設定するのと同等です。この要約を表6-5に示します。

表6-5 -mapping設定と他のマッピング・オプション設定の関係

-mapping設定

-builtintypes=

-numbertypes=

-lobtypes=

-usertypes=

-mapping=oracle

oracle

oracle

oracle

oracle

-mapping=jdbc

jdbc

jdbc

oracle

oracle

-mapping=objectjdbc(デフォルト)

jdbc

objectjdbc

oracle

oracle

-mapping=bigdecimal

jdbc

bigdecimal

oracle

oracle

注意:
オプションはコマンドラインに入力した順に処理されます。したがって、-mappingオプションが特定の型マッピング・オプション(-builtintypes、-lobtypes、-numbertypesまたは-usertypes)の前にある場合、その型マッピング・オプションは、関連する型の-mappingオプションをオーバーライドします。-mappingオプションが特定の型マッピング・オプションの後に続く場合は、その型マッピング・オプションは無視されます。

Java間の型マッピング用のスタイル・ファイル

JPublisherのスタイル・ファイルを使用すると、Java間の型マッピングを指定できます。その使用方法の1つは、生成されるクラスをWebサービスで確実に使用できるようにすることです。-styleオプションを使用してスタイル・ファイル名を指定します。-styleオプションは複数回使用できます。設定は順番に累積されます。-styleオプションの構文は次のとおりです。

-style=stylename

通常、Oracleにはスタイル・ファイルが用意されていますが、編集したり独自に作成する場合があります。たとえば、Oracle Database 12cでWebサービスにOracleスタイル・ファイルを使用するには、次の設定を使用します。

-style=webservices10

関連項目:
「JPublisherのスタイルとスタイル・ファイル」

型マップのオプション

JPublisherのコード生成は、主にPL/SQL型を持つシグネチャからJDBCへのアクセスを可能にするため、JPublisherのユーザー型マップまたはデフォルトの型マップのエントリの影響を受けます。型マップ・エントリの書式は、次のいずれかです。

-type_map_option=opaque_sql_type:java_type
-type_map_option=numeric_indexed_by_table:java_numeric_type[max_length]
-type_map_option=char_indexed_by_table:java_char_type[max_length](elem_size)
-type_map_option=plsql_type:java_type:sql_type:sql_to_plsql_func:plsql_to_sql_func

型マップ構文では、sql_to_plsql_funcとplsql_to_sql_funcがSQLとPL/SQL間の変換ファンクション用です。と[...]と(...)が構文の一部であることに注意してください。また、一部のオペレーティング・システムでは、特殊文字を含むコマンドライン・オプションを引用符で囲む必要があります。

関連オプションは、-addtypemap、-adddefaulttypemap、-defaulttypemapおよび-typemapで、以降の各項でアルファベット順に説明します。-addtypemapと-typemapの違いは、-addtypemapではユーザー型マップにエントリを追加するのに対して、-typemapでは既存のユーザー型マップを指定したエントリで置き換えるということです。同様に、-adddefaulttypemapではデフォルトの型マップにエントリを追加するのに対して、-defaulttypemapでは既存のデフォルトの型マップを指定したエントリで置き換えます。

関連項目:
「OPAQUE型の型マッピング・サポート」、「スカラーの索引付き表の型マッピング・サポート」および「PL/SQL変換ファンクションを介した型マッピングのサポート」

-defaulttypemapおよび-adddefaulttypemapオプションを使用するプロパティ・ファイルからの型マップ設定の例を次に示します。

jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
jpub.adddefaulttypemap=BOOLEAN:boolean:INTEGER:
SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT
jpub.adddefaulttypemap=INTERVAL DAY TO SECOND:String:CHAR:
SYS.SQLJUTL.CHAR2IDS:SYS.SQLJUTL.IDS2CHAR
jpub.adddefaulttypemap=INTERVAL YEAR TO MONTH:String:CHAR:
SYS.SQLJUTL.CHAR2IYM:SYS.SQLJUTL.IYM2CHAR

デフォルトの型マップとユーザー型マップとの競合を回避する必要があることに注意してください。

デフォルトの型マップへのエントリの追加

-adddefaulttypemapオプションを使用すると、JPublisherのデフォルトの型マップに1つのエントリまたはカンマ区切りのエントリ・リストを追加できます。また、JPublisherではこのオプションが内部的に使用されます。このオプションの構文は次のとおりです。

-adddefaulttypemap=list_of_typemap_entries

ユーザー型マップへの追加エントリ

-addtypemapオプションを使用すると、JPublisherのユーザー型マップに1つのエントリまたはカンマ区切りのエントリ・リストを追加できます。このオプションの構文は次のとおりです。

-addtypemap=list_of_typemap_entries

JPublisherのデフォルトの型マップ

JPublisherでは、-defaulttypemapオプションが内部的に使用され、デフォルトの型マップに事前定義済の型マップ・エントリが設定されます。このオプションの構文は次のとおりです。

-defaulttypemap=list_of_typemap_entries

-adddefaulttypemapオプションと-defaulttypemapオプションには、-adddefaulttypemapではデフォルトの型マップにエントリを追加するのに対して、-defaulttypemapでは既存のデフォルトの型マップを指定したエントリで置き換えるという違いがあります。デフォルトの型マップを消去するには、次の設定を使用します。

-defaulttypemap=

たとえば、この設定を使用すると、デフォルトの型マップとユーザー型マップ間の競合を回避できます。

関連項目:
型マップ間の競合に関する注意事項などの追加情報は、「JPublisherのユーザー型マップとデフォルトの型マップ」を参照してください。

JPublisherの型マップの置換

-typemapオプションを使用すると、1つのエントリまたはカンマ区切りのエントリ・リストを指定してユーザー型マップを設定できます。このオプションの構文は次のとおりです。

-typemap=list_of_typemap_entries

-typemapオプションと-addtypemapオプションの違いは、-typemapでは既存のユーザー型マップを指定したエントリで置き換えるのに対して、-addtypemapではユーザー型マップにエントリを追加するということです。ユーザー型マップを消去するには、次の設定を使用します。

-typemap=

たとえば、この設定を使用すると、デフォルトの型マップとユーザー型マップ間の競合を回避できます。

Javaコード生成オプション

この項では、Javaコード生成に関するJPublisherの特性および動作を指定するオプションについて説明します。たとえば、次の用途を持つオプションがあります。

- 生成されるコードのパラメータのモードまたは型に従ったフィルタ処理

- 生成されるコードがJavaBeans仕様に準拠することの保証

- ネーミング・パターンの指定

- ユーザー・サブクラス用のスタブ生成方法の指定

- 生成されるコードがシリアライズ可能かどうかの指定

オプション-access、-case、-codegen、-filtermodes、-filtertypes、-generatebean、-genpattern、-gensubclass、-methods、-omit_schema_names、-outarguments、-package、-serializableおよび-tostringについてアルファベット順に説明します。

メソッドのアクセス

-accessオプションは、JPublisherにより生成されたコンストラクタ、属性のsetterメソッドとgetterメソッド、オブジェクト・ラッパー・クラスのメンバー・メソッドおよびPL/SQLパッケージのメソッドについて組み込まれるアクセス修飾子を決定します。このオプションの構文は次のとおりです。

-access={public|protected|package}

JPublisherで可能なオプション設定は、次のとおりです。

- public
publicアクセス修飾子を持つメソッドが生成されます。これはデフォルトのオプション設定です。

- protected
protectedアクセス修飾子を持つメソッドが生成されます。

- package
アクセス修飾子は省略されます。そのため、生成されたメソッドはパッケージに対してローカルになります。

生成されたJPublisherラッパー・クラスの使用を制御する必要がある場合は、-access=protectedまたは-access=package設定を使用します。たとえば、JPublisherで生成されたクラスのサブクラスとして、カスタマイズしたバージョンのラッパー・クラスを提供し、生成されたスーパークラスへのアクセスは提供しないようにするときなどです。

コマンドラインまたはプロパティ・ファイルで-accessオプションを指定できます。

注意:
オブジェクト参照、VARRAYおよびネストした表型用のラッパー・クラスは、-accessオプションの値の影響を受けません。

Java識別名の大/小文字の区別

クラスまたは属性名をINPUTファイルまたはコマンドラインで指定しない場合、-caseオプションはJPublisherで生成されるJava識別子の大/小文字区別に影響します。これには、クラス名、メソッド名、getXXX()およびsetXXX()メソッド名に埋め込まれる属性名、生成されるメソッド名の引数が含まれます。このオプションの構文は次のとおりです。

-case={mixed|same|lower|upper}

表6-6に、-caseオプションで可能な値を示します。

表6-6 -caseオプションの値

-caseオプション値

説明

mixed(デフォルト)

クラス名の各単語の1文字目、またはメソッド名の2番目以降の単語の1文字目は、大文字になります。他のすべての文字は小文字です。アンダースコア(_)、ドル記号($)およびJavaで無効なすべての文字は、ワード単位の境界を構成して暗黙的に警告なしで削除されます。単語の境界はメソッド名のgetまたはsetの後にも出現します。

same

JPublisherでは、データベース上で表される大/小文字の区別は変更されません。アンダースコアおよびドル記号は保持されます。Javaで無効な他の文字は削除され、警告メッセージが発行されます。

upper

JPublisherで小文字は大文字に変換され、アンダースコアおよびドル記号は保持されます。Javaで無効な他の文字は削除され、警告メッセージが発行されます。

lower

JPublisherで大文字は小文字に変換され、アンダースコアおよびドル記号は保持されます。Javaで無効な他の文字は削除され、警告メッセージが発行されます。

JPublisherオプションまたはINPUTファイルを介して指定したクラス名または属性名の場合、JPublisherではその名前の文字の大/小文字区別が保持され、-caseオプションがオーバーライドされます。

コード生成のタイプ

-codegenオプションは、生成されたJavaコードがSQLJランタイムまたはJDBCランタイムのどちらを使用するかを決定します。このオプションの構文は次のとおりです。

-codegen=jdbc|sqlj

デフォルトの値はsqljです。

設定-codegen=jdbcは、JPublisherがJDBCランタイムを使用してJavaコードを生成することを示します。JDBCランタイムに純粋に依存するJavaコードの生成は、JPublisher 11gリリースで導入されました。設定-codegen=sqljは、JPublisherがSQLJランタイムを使用してJavaコードを生成することを示します。これは、JPublisher 12cリリースのデフォルトの動作です。以前のリリースのJPublisherでは、SQLJランタイムのみを使用してJavaコードが生成されます。

パラメータ・モードに従ったメソッドのフィルタリング

特にWebサービス用のコード生成の場合、メソッドのシグネチャまたは属性では、コードの使用目的について一部のパラメータ・モードがサポートされない場合があります。-filtermodesオプションを使用すると、生成されるコードをパラメータ・モードに従ってフィルタ処理できます。このオプションの構文は次のとおりです。

-filtermodes=list_of_modes_to_filter_out_or_filter_in

-filtermodesオプションには次の設定を指定できます。

- in

- out

- inout

- return

オプション設定を1で開始し、デフォルトですべての可能性を含める、つまりフィルタリングが行われないようにようにします。次に、特定のモードまたは型の後にそれぞれマイナス記号(-)を付けてリストする、つまりそのモードまたは型を除外します。かわりに、0で開始して、デフォルトでどの可能性も含めないようにする、つまり全体をフィルタリングします。次に、特定のモードまたは型の後にそれぞれプラス記号(+)を付けてリストする、つまりそのモードまたは型を許可します。

次の例の結果はいずれも同じになり、inまたはreturnモードのパラメータを持つメソッドのみが許可されます。各エントリはカンマで区切ります。

-filtermodes=0,in+,return+

-filtermodes=1,out-,inout-

パラメータ型に従ったメソッドのフィルタリング

特にWebサービス用のコード生成の場合、メソッドのシグネチャまたは属性では、コードの使用目的について一部のパラメータ型がサポートされない場合があります。-filtertypesオプションを使用すると、生成されるコードをパラメータの型に従ってフィルタ処理できます。このオプションの構文は次のとおりです。

-filtertypes=list_of_types_to_filter_out_or_filter_in

-filtertypesオプションには次の設定を指定できます。

- Java型の修飾名
java.sql.SQLData、oracle.sql.ORADataなど、パッケージとクラスを指定します。

- .ORADATA
この設定は、任意のORAData実装またはSQLData実装を示します。

- .STRUCT、.ARRAY、.OPAQUE、.REF
各設定は、対応する_SQL_TYPECODEを指定してORADataまたはSQLDataを実装する型を示します。

- .CURSOR
この設定は、任意のSQLJイテレータ・タイプとjava.sql.ResultSetを示します。

- .INDEXBY
この設定は任意の索引付き表の型を示します。

- .ORACLESQL
この設定はすべてのoracle.sql.XXX型を示します。

オプション設定を1で開始して、デフォルトですべての可能性を含める、つまりフィルタリングが行われないようにします。次に、特定のモードまたは型の後にそれぞれマイナス記号(-)を付けてリストする、つまりそのモードまたは型を除外します。かわりに、0で開始して、デフォルトでどの可能性も含めないようにする、つまり全体をフィルタリングします。次に、特定のモードまたは型の後にそれぞれプラス記号(+)を付けてリストする、つまりそのモードまたは型を許可します。

次に示す最初の例では、フィルタ処理で.ORADATAおよび.ORACLESQLのみが除外されます。2番目の例では、.CURSORおよび.INDEXBYを除くすべてが除外されます。

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

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

.STRUCT、.ARRAY、.OPAQUEおよび.REF設定は、.ORADATA設定のサブカテゴリです。したがって、次のように指定でき、この場合、型コードがSTRUCTの型を除き、ORAData型とSQLData型がすべて除外されます。

-filtertypes=1,.ORADATA-,.STRUCT+

あるいは、ORAData型またはSQLData型全般を許可し、型コードがARRAYまたはREFの型を除外できます。

-filtertypes=0,.ORADATA+,.ARRAY-,.REF-

JavaBeans仕様に準拠したコード生成

-generatebeanオプションは、生成されるクラスがJavaBeans仕様に準拠することを保証するために使用できるフラグです。このオプションの構文は次のとおりです。

-generatebean={true|false}

デフォルト設定は-generatebean=falseです。-generatebean=trueに設定すると、JavaBeanプロパティのgetterまたはsetterメソッドとみなされないように、生成される一部のメソッドの名前が変更されます。そのために、メソッド名に接頭辞としてアンダースコア(_)が追加されます。たとえば、SQLの表型、VARRAY型または索引付き表の型から生成されるクラスの場合は、メソッド名が次のように変更されます。

変更前のメソッド名は次のとおりです。

public int getBaseType() throws SQLException;
public int getBaseTypeName() throws SQLException;
public int getDescriptor() throws SQLException;

変更後のメソッド名は次のとおりです。

public int _getBaseType() throws SQLException;
public String _getBaseTypeName() throws SQLException;
public ArrayDecscriptor _getDescriptor() throws SQLException;

戻り型の変更が必要となるのは、JavaBeans仕様でgetterメソッドがBeanのプロパティを戻す必要があるのに対し、getBaseType()、getBaseTypeName()およびgetDescriptor()はBeanのプロパティを戻さないことになっているためです。

クラスとインタフェースのネーミング・パターン

通常、ユーザー定義のSQL型またはパッケージ用に生成されるJavaクラス、ユーザー・サブクラスおよびインタフェースについては、特定のネーミング・パターンに従うことをお薦めします。-genpatternオプションは、-sqlまたは-sqlstatementオプションと併用でき、使用すると、この種のパターンを簡単かつ汎用的に定義できます。このオプションの構文は次のとおりです。

-genpattern=pattern_specifications

次の明示的なコマンドライン・オプションを考えてみます。

-sql=PERSON:PersonBase:PersonUser#Person
-sql=STUDENT:StudentBase:StudentUser#Student
-sql=GRAD_STUDENT:GradStudentBase:GradStudentUser#GradStudent

次の2つのオプションは、前述のオプション・セットと同等です。

-genpattern=%1Base:%1User#%1
-sql=PERSON,STUDENT,GRAD_STUDENT

%1は、定義上、JPublisherで各SQL型に対して作成されるデフォルトのベース名を指します。JPublisherでは、デフォルトでSQL型PERSONの場合はJava型Person、SQL型STUDENTの場合はJava型Student、SQL型GRAD_STUDENTの場合はJava型GradStudentが作成されます。このため、%1BaseはそれぞれPersonBase、StudentBaseおよびGradStudentBaseとなります。%1Userの場合も同様の結果になります。

-sqlオプションで出力名を指定する場合、%2は定義上、指定の名前を指します。たとえば、次のオプションのペアを指定した場合の効果は、前述のペアと同じです。

-genpattern=%2Base:%2User#%2
-sql=PERSON:Person,STUDENT:Student,GRAD_STUDENT:GradStudent

注意:
これは、Webサービスの場合に予期されるパターンです。出力名を指定してそれをインタフェース名として使用し、生成されるクラスの場合はBase、ユーザー・サブクラスの場合はUserを追加します。

-genpatternオプションと-sqlstatementオプションを併用する例を次に示します。

-sqlstatement.class=SqlStmts -genpattern=%2Base:%2User:%2

この設定は、次の設定と同等です。

-sqlstatement.class=SqlStmtsBase:SqlStmtsUser#SqlStmts

ユーザー・サブクラスの生成

-gensubclassオプションの値によって、JPublisherでユーザー指定のサブクラスの初期ソース・ファイルが生成されるかどうか、および生成される場合にはそのサブクラスのフォーマットが決定されます。このオプションの構文は次のとおりです。

-gensubclass={true|false|force|call-super}

-gensubclass=true(デフォルト)に設定すると、ユーザー・サブクラスのソース・ファイルが存在しないことが検出された場合にのみ、サブクラス用のコードが生成されます。-gensubclass=falseに設定すると、JPublisherではユーザー・サブクラス用のコードは生成されません。

-gensubclass=forceに設定すると、JPublisherでは常にユーザー・サブクラス用のコードが生成されます。対応する.javaおよび.classファイルに既存の内容が存在する場合は、それが上書きされます。この設定は慎重に使用してください。

設定-gensubclass=call-superには-gensubclass=trueに設定した場合と同じ効果がありますが、JPublisherで生成されるコードは若干異なります。デフォルトでは、ORADataインタフェースなどの実装に必要なコンストラクタとメソッドのみが生成されます。スーパークラスのメソッドや属性のsetterメソッドとgetterメソッドのコール方法は示されますが、このコードがコメントに挿入されることはありません。call-super設定では、getter、setterおよび他のメソッドがすべて生成されます。

そこで、クラスのイントロスペクションに基づくJava開発ツールを使用している場合に、この設定を指定できます。必要となるのはSQLオブジェクト属性とSQLオブジェクト・メソッドに関連するメソッドのみで、JPublisherの実装の詳細は隠されたままです。この場合は、生成されたユーザー・サブクラスでツールを指すことができます。

コマンドラインまたはプロパティ・ファイルで-gensubclassオプションを指定できます。

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

-methodsオプションにより、次のことが決まります。

- JPublisherでSQLオブジェクト型とPL/SQLパッケージのメソッド(ストアド・プロシージャ)用にラッパー・メソッドを生成するかどうか。

- オーバーロードされたメソッドの名前を許可するかどうか。

- SQLExceptionが検出された場合に、メソッドでJDBC接続を再確立するかどうか。

-methodsオプションの構文は次のとおりです。

-methods={all|none|named|always,overload|unique,noretry|retry}

-methods=all(最初の設定グループのデフォルト)の場合、JPublisherでは処理対象のSQLオブジェクト型およびPL/SQLパッケージのすべてのメソッドに対してラッパー・メソッドが生成されます。これにより、基礎となるSQLオブジェクトまたはパッケージで実際にメソッドが定義されている場合はSQLJクラス、それ以外の場合は非SQLJクラスが生成されます。Oracle Database 10gより前のバージョンでは、all設定の場合には常にSQLJクラスが生成されていました。

-methods=noneの場合、JPublisherでラッパー・メソッドは生成されません。この場合、ラッパー・メソッドがなければ役に立たないため、PL/SQLパッケージのクラスも生成されません。

-methods=namedの場合、JPublisherではINPUTファイルで明示的に指定されたメソッドのみにラッパー・メソッドが生成されます。

-methods=always設定でもラッパー・メソッドは生成されます。ただし、Oracle8iおよびOracle9iのJPublisherバージョンへの下位互換性を保つために、SQLオブジェクト型でメソッドが定義されているかどうかに関係なく、すべてのSQLオブジェクト型について常にSQLJクラスが生成されます。

注意:
下位互換性を保つために、JPublisherではallと等価の設定true、noneと等価の設定false、およびnamedと等価の設定someもサポートされます。

overloadおよびunique設定のうち、-methods=overloadはデフォルトであり、次のように、生成されるコード内のメソッド名をオーバーロードできるように指定します。

int foo(int);
int foo(String);

また、設定-methods=uniqueはすべてのメソッド名を一意にする必要があることを指定します。この設定は、Webサービスの場合に必須です。次のファンクションを考えます。

function foo (a VARCHAR2(40)) return VARCHAR2;
function foo ( x int, y int) return int;

デフォルトの-methods=overload設定を使用すると、これらのファンクションは次のように公開されます。

String foo(String a);
java.math.BigDecimal foo(java.math.BigDecimal x, java.math.BigDecimal y);

-methods=unique設定を使用すると、戻り型と引数型の1文字目に基づくメソッド名変更メカニズムを使用して、次の例のように公開されます。

String foo(String a);
java.math.BigDecimal fooBBB(java.math.BigDecimal x, java.math.BigDecimal y);

関連項目:
「オーバーロードされたメソッドの変換」

-methods=retry設定を使用すると、JPublisherではDataSource引数を持ち、公開される各メソッド用の追加コードを持つコンストラクタが生成されます。メソッド内のJDBC操作はtry...catchブロック内に囲まれます。メソッドの処理中にSQLExceptionが発生した場合は、追加コードによりJDBC接続の再確立とSQL操作の再処理が試みられます。再接続に失敗すると、元のSQLExceptionが再び発生します。

-methods=retry設定の場合、JPublisherでは-methods=noretryとは次の2点で異なるコードが生成されます。

- DataSourceオブジェクトをパラメータとして取る追加コンストラクタが生成されます。DataSourceオブジェクトは、操作の起動時に新規接続を取得するために使用されます。

- SQLExceptionが発生すると、新規JDBC接続が要求されます。

-methods=retry設定が有効になるのは、PL/SQLストアド・プロシージャ、SQL文、AQ、およびWebサービスによるJavaクラスのコールインに対してのみです。

注意:
oracle.jdbc.pool.OracleDataSourceを使用するにはJDK 1.3以上が必要です。

overloadまたはuniqueの設定やretryまたはnoretryの設定を指定すると同時に、all、none、namedまたはalwaysの設定を指定するには、設定をカンマで区切ります。これを次の例に示します。

-methods=always,unique,retry

コマンドラインまたはプロパティ・ファイルで-methodsオプションを指定できます。

名前参照からのスキーマ名の省略

ユーザー定義のSQL型(オブジェクトやコレクションなど)を公開するときに、JPublisherがJavaラッパー・クラスの型名を参照する場合は、通常、型名がデータベース・スキーマ名で修飾されます(たとえば、HRスキーマ内のEMPLOYEE型はHR.EMPLOYEEのように修飾されます)。

ただし、-omit_schema_namesオプションを指定すると、JPublisherでは、SQL型名はスキーマ名で修飾されません。このオプションの構文は次のとおりです。

-omit_schema_names

このオプションを指定した場合は、次のときにのみ名前がスキーマ名で修飾されます。

- ユーザー定義のSQL型を、JPublisherの接続先スキーマ以外のスキーマで宣言した場合。他のスキーマからの型には、常に識別用のスキーマ名が必要です。

- コマンドラインまたはINPUTファイルでスキーマ名を指定してユーザー定義のSQL型を宣言した場合。コマンドラインまたはINPUTファイルで型名とともにスキーマ名を使用すると、-omit_schema_namesオプションがオーバーライドされます。

スキーマ名を省略すると、JPublisherのコール時に使用したスキーマ以外のスキーマに接続するときに、使用しているSQL型がその2つのスキーマで同一に宣言されている場合にかぎり、JPublisherで生成されたクラスを使用できます。

JPublisherで生成されたORADataおよびSQLDataクラスには、生成されたクラスと一致するユーザー定義のSQL型を指定するstatic final Stringフィールドが含まれます。JPublisherで生成されたコードが処理されるとき、生成されたコードのSQL型の名前を使用して、データベース内のSQL型が検索されます。SQL型の名前にスキーマ名が含まれない場合は、JPublisherで生成されたコードが処理されるときに現行の接続と対応付けられたスキーマ内で型が検索されます。SQL型名にスキーマ名が含まれている場合は、そのスキーマ内で型が検索されます。

-omit_schema_namesオプションが使用可能な場合、JPublisherではSQLオブジェクト型のJavaラッパー・クラスに次のコードが生成され、コレクション型をラップするための類似のコードも生成されます。

public Datum toDatum(Connection c) throws SQLException
{
if (__schemaName != null)
{
return _struct.toDatum(c, __schemaName + "." + _SQL_NAME);
}
return _struct.toDatum(c, typeName);
}
private String __schemaName = null;
public void __setSchemaName(String schemaName) { __schemaName = schemaName; }
}

__setSchemaName()メソッドを使用すると、実行時にスキーマ名を明示的に設定でき、これにより、-omit_schema_namesオプションを有効にしてJPublisherを実行した場合にも、SQL型名をスキーマ名で修飾できます。SQL型に他のスキーマからアクセスする必要がある場合は、スキーマで修飾する必要があります。

注意:
このオプションはブール型オプションとして機能しますが、-omit_schema_names=trueや-omit_schema_names=falseは指定できません。有効にする場合は-omit_schema_namesを指定し、指定しない場合は無効になります。

出力引数のホルダー型

Javaの場合、OUTまたはIN OUTの指定はありませんが、ホルダーを介して値を戻すことはできます。JPublisherでは、ホルダーのかわりに次の3つのいずれかを指定できます。

- 配列(デフォルト)

- JAX-RPCホルダー型

- ファンクションの戻り

-outargumentsオプションを使用すると、どのメカニズムを使用するかをそれぞれarray、holderまたはreturnの設定を介して指定できます。この機能はWebサービスに特に有効です。このオプションの構文は次のとおりです。

-outarguments={array|holder|return}

関連項目:
「出力パラメータの取扱い」

生成されたJavaパッケージの名前

-packageオプションでは、JPublisherで生成されるJavaパッケージの名前を指定します。この名前は、生成される各クラスのパッケージ宣言に使用されます。このオプションの構文は次のとおりです。

-package=package_name

-dirおよび-dオプションを使用すると、生成されたファイルが格納されるディレクトリ構造には、-dirおよび-d設定のみではなくパッケージ名が反映されます。

注意:

- -packageオプション設定とINPUTファイルのパッケージ設定が競合する場合、優先順位はコマンドラインで-inputおよび-packageオプションを指定した順序によって決定します。-package設定は、-inputオプションより後に指定した場合は優先されます。それ以外の場合は、INPUTファイルの設定が優先されます。

- -dirおよび-dオプションを使用しないか、または明示的に空に設定すると、生成されたファイルはすべて、-package設定に関係なくパッケージ階層なしでカレント・ディレクトリに直接格納されます。

関連項目:
「生成されたソース・ファイルとクラス・ファイルの出力ディレクトリ」

例1 次のコマンドを考えてみます。

% jpub -dir=/a/b -d=/a/b -package=c.d -sql=PERSON:Person ...

JPublisherでは、ファイル/a/b/c/d/Person.javaおよび/a/b/c/d/Person.classが生成されます。

また、Personクラスには次のパッケージ宣言が含まれます。

package c.d;

例2 ここで、次のコマンドを考えてみます。

% jpub -dir=/a/b -d=/a/b -package=c.d -sql=PERSON:Person -input=myinputfile

myinputfileに次が含まれているとします。

SQL PERSON AS e.f.Person

この場合は、INPUTファイル内のパッケージ情報でコマンドラインの-packageオプションがオーバーライドされます。ファイル/a/b/e/f/Person.javaおよび/a/b/e/f/Person.classが生成され、Personクラスには次のパッケージ宣言が含まれます。

package e.f;

パッケージ名を指定しない場合、パッケージ宣言は生成されません。出力.javaファイルは、-dirオプションで指定したディレクトリに直接格納されるか、デフォルトでカレント・ディレクトリに格納されます。出力.classファイルは、-dオプションで指定したディレクトリに直接格納されるか、デフォルトでカレント・ディレクトリに格納されます。

JPublisherでは、変換対象の型で必要なために、明示的に要求していない別の型が変換される場合があります。たとえば、要求した型の属性などの場合です。この場合、要求された型を宣言する.javaおよび.classファイルも、コマンドライン、プロパティ・ファイルまたはINPUTファイルで指定したパッケージに置かれます。

これに対して、パッケージまたはストアド・プロシージャがSQL型や他のパッケージまたはストアド・プロシージャにより厳密に要求されることはないため、明示的に要求していないパッケージまたはストアド・プロシージャが変換されることはありません。

生成されたオブジェクト・ラッパー・クラスのシリアライズ可能性

-serializableオプションは、JPublisherによってSQLオブジェクト型用に生成されるJavaクラスでjava.io.Serializableインタフェースを実装するかどうかを指定します。デフォルト設定は-serializable=falseです。このオプションの構文は次のとおりです。

-serializable={true|false}

-serializable=trueに設定する場合は、次のことに注意してください。

- すべてのオブジェクト属性がシリアライズ可能ではありません。特に、oracle.sql.BLOB、oracle.sql.CLOBまたはoracle.sql.BFILEなどのOracle LOB型は、いずれもシリアライズできません。このような属性を持つオブジェクトをシリアライズすると、対応する属性値はデシリアライズ後にnullに初期化されます。

- java.sql.Blob型またはjava.sql.Clob型のオブジェクト属性を使用する場合、JPublisherで生成されるコードではOracle JDBC行セット実装をCLASSPATHで使用可能にする必要があります。これは、ORACLE_HOME/jdbc/libにあるocrs12.jarライブラリに用意されています。この場合、ClobおよびBlobオブジェクトの基礎となる値は実体化され、シリアライズされてから取り出されます。

- オブジェクト参照である属性を含むオブジェクトをデシリアライズするたびに、基礎となる接続が失われ、参照に対するsetValue()またはgetValue()コールを発行できません。このため、-serializable=trueを指定すると、JPublisherでJavaクラスに次のメソッドが生成されます。

void restoreConnection(Connection)

デシリアライズ後に、このメソッドを特定のオブジェクトまたはオブジェクト参照に対して1度コールし、参照への現行の接続、または一時的に埋め込まれたすべての参照への現行の接続をそれぞれリストアします。

オブジェクト・ラッパー・クラスへのtoString()メソッドの生成

-tostringフラグを使用すると、オブジェクト値の出力用にtoString()メソッドを追加生成するように、JPublisherに対して指定できます。出力は、オブジェクトの構成に使用するSQLコードに似ています。デフォルト設定はfalseです。このオプションの構文は次のとおりです。

-tostring={true|false}

mainメソッドの名前の変更

-nomain=trueを使用すると、シグネチャmain(String[])を持つJavaメソッドの生成を回避できます。このオプションは、SQLの公開とサーバー・サイドJavaクラスの公開に適用されます。このオプションの構文は次のとおりです。

-nomain[=true|false]

Javaストアド・プロシージャでの制約のため、-dbjavaオプションでは-nomain=trueが自動的に設定されます。シグネチャmain(String[])を持つメソッドが-nomain=true設定で生成される場合、JPublisherではこのメソッドの名前がたとえばmain0(Stringp[])などに変更されます。

デフォルト設定は次のとおりです。

-nomain=false

PL/SQLコード生成オプション

この項では、JPublisherのPL/SQLコード生成動作を指定する次のオプションについて説明します。

- -overwritedbtypes
SQL型の作成の前に名前の競合をチェックするかどうかを指定します。

- -plsqlfile
SQL型とPL/SQLパッケージの作成と削除に使用するスクリプトを指定します。

- -plsqlmap
PL/SQLラッパー・ファンクションを生成するかどうかを指定します。

- -plsqlpackage
JPublisherでPL/SQLコール仕様、変換ファンクション、ラッパー・ファンクションおよびテーブル・ファンクションを生成するPL/SQLパッケージの名前を指定します。

この種のオプションの多くは、PL/SQL型を使用するストアド・プロシージャへのJavaコールのサポートを目的として使用されます。各オプションでは、対応するSQL型の作成および使用と、対応するSQL型を入力または出力に使用するPL/SQL変換ファンクションおよびPL/SQLラッパー・ファンクションの作成と使用が指定されます。これにより、JDBCを介してアクセスできます。

SQL型の生成

JPublisherでは、PL/SQL型を公開するときおよびサーバー・サイドJavaクラス用のPL/SQLラッパーを生成するときに新しいSQL型を生成することがあります。-overwritedbtypesオプションにより、生成されるSQL型の命名方法が決まります。このオプションの構文は次のとおりです。

-overwritedbtypes={true|false}

Oracle Database 10gリリース2(10.2)より前のバージョンでは、JPublisherはデータベースをチェックして名前の競合がないことを確認し、未使用の名前を生成済SQL型の名前として選択していました。Oracle Database 10gリリース2(10.2)以降では、JPublisherはデータベース内の既存のSQL型名に関係なく、デフォルトで型名を生成します。-overwritedbtypes=true(デフォルト)に設定すると、既存のSQL型名が生成済のSQL型名と同じ場合、既存の型名が上書きされます。これにより、JPublisherでは複数の異なる実行でまったく同一のPL/SQLラッパーを生成することができます。

JPublisherで生成されたPL/SQLラッパーを実行するときに、データベース内の既存の型が上書きされないようにするには、明示的に-overwritedbtypes=falseを指定する必要があります。

Oracle Database 10gリリース2(10.2)より前のバージョンでは、生成済のPL/SQLラッパーの処理後、JPublisherコマンドを再実行すると、一連の異なるSQL型が生成されるという問題が頻繁に報告されています。この問題を回避するには、JPublisherコマンドの再実行前にPL/SQL削除スクリプトを実行します。

PL/SQLスクリプトのファイル名

-plsqlfileオプションでは、JPublisherで生成されるラッパー・スクリプトと削除スクリプトの名前を指定します。このオプションの構文は次のとおりです。

-plsqlfile=plsql_wrapper_script,plsql_dropper_script

ラッパー・スクリプトには、PL/SQL型にマップするSQL型の作成指示と、JPublisherでPL/SQLラッパー(コール仕様)、変換ファンクション、ラッパー・ファンクションおよびテーブル・ファンクションに使用されるPL/SQLパッケージの作成指示が含まれています。削除スクリプトには、これらのエンティティの削除指示が含まれています。

生成されたファイルをSQL*Plusなどを使用してデータベースにロードし、ラッパー・スクリプトを実行して、型とパッケージをデータベースにインストールする必要があります。

ファイルがすでに存在している場合は、上書きされます。ファイル名を指定しない場合、JPublisherではplsql_wrapper.sqlファイルとplsql_dropper.sqlファイルに書き込まれます。

次のように、生成されたスクリプトに関する注意が作成されます。

J2T-138, NOTE: Wrote PL/SQL package JPUB_PLSQL_WRAPPER to
file plsql_wrapper.sql. Wrote the dropping script to file plsql_dropper.sql.

PL/SQLラッパー・ファンクションの生成

-plsqlmapオプションでは、PL/SQL型を使用するストアド・プロシージャのラッパー・ファンクションをJPublisherで生成するかどうかを指定します。各ラッパー・ファンクションは対応するストアド・プロシージャをコールし、ストアド・プロシージャのPL/SQL入力または出力用に適切なPL/SQL変換ファンクションをコールします。対応するSQL型のみがJavaに公開されます。このオプションの構文は次のとおりです。

-plsqlmap={true|false|always}

次のいずれかを設定できます。

- true
これがデフォルトです。必要な場合にのみPL/SQLラッパー・ファンクションが生成されます。指定のストアド・プロシージャをコールしてPL/SQL型を直接変換するJavaコードが単純で、かつ、PL/SQL型がINパラメータまたはファンクションの戻り値にのみ使用される場合、生成されるコードはストアド・プロシージャを直接コールします。それは、該当する変換ファンクションを介してPL/SQLの出入力を処理します。

- false
PL/SQLラッパー・ファンクションは生成されません。ダイレクト・コールと変換ではサポートできないシグネチャ内のPL/SQL型が検出されると、その特定のストアド・プロシージャ用のJavaコードは生成されません。

- always
PL/SQL型を使用するストアド・プロシージャごとに、PL/SQLラッパー・ファンクションが生成されます。この設定は、オリジナルのPL/SQLパッケージを補完するプロキシPL/SQLパッケージを生成する場合に役立ち、これにより、オリジナル・パッケージ内でJavaからアクセスできないファンクションまたはプロシージャについて、Javaでアクセス可能なシグネチャが提供されます。

関連項目:
「PL/SQL変換ファンクションを介した型マッピングのサポート」および「PL/SQL変換ファンクションを直接使用する場合とラッパー・ファンクションを使用する場合」

生成されたPL/SQLコード用のパッケージ

-plsqlpackageオプションでは、JPublisherで生成されたPL/SQLコードを格納するPL/SQLパッケージの名前を指定します。このコードには、PL/SQLラッパー(コール仕様)、PL/SQL型とSQL型間の変換に使用する変換ファンクション、PL/SQL型を使用するストアド・プロシージャをラップするラッパー・ファンクションおよびテーブル・ファンクションが含まれます。このオプションの構文は次のとおりです。

-plsqlpackage=name_of_PLSQL_package

デフォルトでは、パッケージJPUB_PLSQL_WRAPPERが使用されます。

注意:
このパッケージは、JPublisherによって生成されたSQLスクリプトを実行してデータベースに作成する必要があります。

PL/SQLの索引付き表用のパッケージ

-plsqlindextable=arrayまたは-plsqlindextable=intを使用して、数値型または文字型のPL/SQL索引付き表がJava配列にマップされるように指定します。このオプションの構文は次のとおりです。

-plsqlindextable=array|custom|int

int仕様は、Java配列の容量を定義します。デフォルトの容量は32768です。-plsqlindextable=custom設定は、PL/SQL索引付き表がカスタムのJDBC型(ORADataを実装するクラスなど)にマップされるように指定します。

デフォルト設定は次のとおりです。

-plsqlindextable=custom

出入力オプション

この項では、JPublisherの出入力ファイルおよびその位置に関連するオプションについて説明します。オプションは説明する順にリストされています。

- -compile
このオプションは、コンパイルを抑制する場合に使用します。さらに、オプションとして、JPublisherが下位互換性モードの場合にSQLJ変換を抑制する場合にも使用します。

- -dir
このオプションは、生成されたソース・ファイルの格納場所を指定します。

- -d
このオプションは、コンパイルされたクラス・ファイルの格納場所を指定します。

- -encoding
このオプションは、JPublisherで読み取るINPUTファイルと、JPublisherで書き込む.sqljファイルおよび.javaファイルのJavaにおける文字のエンコーディングを指定します。

コンパイルまたは変換の抑制

-compileオプションを使用すると、生成された.javaファイルのコンパイルを抑制できます。また、下位互換性モードの場合は、生成された.sqljファイルの変換もオプションで抑制できます。このオプションの構文は次のとおりです。

-compile={true|false|notranslate}

デフォルトのtrue設定では、生成されたクラスはすべて.classファイルにコンパイルされます。下位互換性モードの場合は、-compile=notranslateの設定を使用すると、生成されるソース・ファイルのSQLJ変換とJavaコンパイルを抑制できます。この設定でも、JPublisherからは.sqljが出力されますが、これはJPublisherの-sqljオプションまたはSQLJコマンドライン・ユーティリティを直接使用して手動で変換およびコンパイルできます。-compile=false設定を使用し、JavaコンパイルはスキップしてSQLJ変換に進むこともできます。この場合も、JPublisherからは.javaが出力され、手動でコンパイルできます。

デフォルトの-compatible=oradata設定を使用する場合など、下位互換性モードでない場合は、-compile=falseに設定するとコンパイルをスキップできます。この使用例では、notranslate設定はサポートされません。これは、下位互換性モードでない場合は、参照可能な.sqljファイルが生成されないためです。

関連項目:
「下位互換性オプション」および「SQLJ機能にアクセスするためのオプション」

生成されたソース・ファイルとクラス・ファイルの出力ディレクトリ

-dirオプションを使用すると、JPublisherにより.javaソース・ファイルまたは下位互換性モードの場合の.sqljソース・ファイルが格納されるディレクトリ・ツリーのルートを指定できます。このオプションの構文は次のとおりです。

-dir=directory_path
-d=directory_path

ピリオド(.)を設定すると、カレント・ディレクトリがディレクトリ・ツリーのルートとして明示的に指定されます。同様に、-dオプションを使用すると、JPublisherでコンパイル済の.classファイルを格納するディレクトリ・ツリーのルートを指定でき、ピリオド(.)設定の機能は前述と同じです。

各オプションに空以外の設定を使用すると、-packageオプションからのパッケージ情報またはINPUTファイルのSQLオプション設定に含まれているパッケージ名が使用されます。この情報を使用して、生成されたファイルのディレクトリ階層全体が決定されます。

関連項目:
「生成されたJavaパッケージの名前」

たとえば、次のJPublisherコマンドを考えてみます。

% jpub -user=hr -d=myclasses -dir=mysource -package=a.b.c  -sql=PERSON:Person,STUDENT:Student
Enter hr password: password

出力はカレント・ディレクトリに相対で次のようになります。

mysource/a/b/c/Person.java
mysource/a/b/c/PersonRef.java
mysource/a/b/c/Student.java
mysource/a/b/c/StudentRef.java

myclasses/a/b/c/Person.class
myclasses/a/b/c/PersonRef.class
myclasses/a/b/c/Student.class
myclasses/a/b/c/StudentRef.class

デフォルトで、ソース・ファイルとクラス・ファイルは、-package設定やINPUTファイル内のパッケージ指定に関係なく、パッケージ階層なしでカレント・ディレクトリに直接格納されます。

空の設定を使用して、この動作を明示的に指定することもできます。

%jpub ... -d= -dir=

これらのオプションは、コマンドラインまたはプロパティ・ファイルで設定できます。

注意:
SQLJにも、同じ機能を持つ-dirおよび-dオプションがあります。ただし、JPublisherの-sqljオプションを使用してSQLJ設定を指定する場合は、JPublisherの-dirおよび-dオプションを使用してください。これらは、SQLJの-dirおよび-d設定より優先されます。

Javaにおける文字のエンコーディング

-encodingオプションは、JPublisherで読み取るINPUTファイルと、JPublisherで書き込むソース・ファイルのJavaにおける文字のエンコーディングを指定します。デフォルトのエンコーディングはfile.encodingシステム・プロパティの値か、このプロパティが設定されていない場合は8859_1(ISO Latin-1)になります。このオプションの構文は次のとおりです。

-encoding=name_of_character_encoding

通常、このオプションを設定する必要はありませんが、SQLJ TranslatorとJavaコンパイラに対してエンコーディングを指定する場合は、JPublisherの-sqljオプションを介してSQLJの-encoding設定を使用します。この使用例では、JPublisher用とSQLJおよびコンパイラ用に同じエンコーディングを指定する必要があります。

-encodingオプションを使用して、Java環境でサポートされる文字のエンコーディングを指定できます。Sun社のJDKを使用している場合、これらのオプションは次のURLにあるnative2asciiドキュメントにリストされています。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/native2ascii.html

注意:
エンコーディング設定は、JPublisherの-encodingオプションとJavaのfile.encoding設定のどちらを使用して設定する場合も、-propsオプションで指定したファイルなどのJavaプロパティ・ファイルには適用しないでください。プロパティ・ファイルでは、常に8859_1エンコーディングが使用されます。これはJava全般の機能であり、JPublisher固有の機能ではありません。ただし、プロパティ・ファイルではUnicodeエスケープ・シーケンスを使用できます。

Webサービスのコールアウトを容易にするオプション

この項では、サーバー・サイドJavaまたはPL/SQLからJavaクラスへのアクセスに関するオプションと、関連する概念について説明します。特に、これらのオプションは、データベース内からWebサービス・クライアント・コードへのアクセスに使用でき、これは、Webサービスのコールアウトと呼びます。この項には、次の項目が含まれます。

- JavaおよびPL/SQLラッパー生成用のWSDLドキュメント

- Webサービスのエンドポイント

- WSDLのプロキシURL

- クライアント・プロキシを実行するスーパーユーザー・パーミッション

Webサービスのコールアウトに関する各オプションの概要と、オプション間の相互関係を次に示します。

- -proxyclasses=class1,class2,...,classN
このオプションでは、JavaおよびPL/SQLラッパーを生成するJavaクラスを指定します。Webサービスの場合、このオプションは-proxywsdlオプションにより暗黙的に使用され、生成されたクライアント・プロキシ・クラスを処理するように自動的に設定されます。

JavaクラスのJavaラッパーとPL/SQLラッパーを作成する場合には、このオプションを汎用的に直接使用できます。

-proxyclassesオプションは、入力として-proxyopts設定を取ります。

- -proxyoptssetting1,setting2,...
このオプションでは、ラッパー・クラスおよびPL/SQLラッパー生成時のJPublisherの動作を指定します。通常、このオプションはWebサービス用ですが、他の用途にも使用できます。-proxywsdlオプションの標準的な使用方法では、-proxyoptsの設定はデフォルトのままで十分です。-proxyclassesオプションを直接使用する場合は、-proxyopts設定を指定できます。

- -proxywsdl=WSDL_URL
このオプションを使用するのは、URLとWSDLドキュメントを指定して、Webサービスのクライアント・プロキシ・クラスおよび該当するJavaラッパーとPL/SQLラッパーを生成する場合です。

-proxywsdlオプションは、-proxyclassesオプションを暗黙的に使用し、入力として-proxyopts設定を取ります。

- -endpoint=Web_services_endpoint
このオプションを-proxywsdlオプションと併用して、Webサービスのエンドポイントを指定します。

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

- -sysuser=superuser_name/superuser_password
このオプションを使用して、HTTPを介してWebサービスにアクセスできるように、クライアント・プロキシ・クラスに対するパーミッションの付与に使用するスーパーユーザー・アカウントの名前およびパスワードを指定します。

注意:

- ここで説明している機能を使用するには、Oracle Database 12cにdbwsclient.jarライブラリをインストールする必要があります。

- ここで説明しているラッパー生成には、既存のJPublisherオプション(-dir、-d、-plsqlmap、-plsqlfile、-plsqlpackageおよび-package)が複数使用されています。また、JPublisherで生成されたエンティティをデータベースにロードできるように、-userおよび-urlオプションを介してデータベース接続を指定することもできます。

JavaおよびPL/SQLラッパー生成用のWSDLドキュメント

-proxywsdlオプションの構文は次のとおりです。

-proxywsdl=WSDL_URL

このオプションの使用方法は次のとおりです。

% jpub -proxywsdl=META-INF/HelloService.wsdl ...

指定したURLにあるWebサービスのWSDLドキュメントを指定すると、JPublisherはWebサービスのクライアント・プロキシ・クラスの生成を指示し、データベースからWebサービスをコールアウトするための該当するJavaおよびPL/SQLラッパーを生成します。生成するクラスおよびプロセスは、WSDLドキュメントにより決定されます。JPublisherでは、-proxyclassesオプションが自動的に設定され、入力として-proxyopts設定が使用され、次のステップが実行されます。

1. Oracle Database Webサービス・アセンブラ・ツールが起動され、WSDLドキュメントに基づいてWebサービスのクライアント・プロキシ・クラスが生成されます。これらのクラスは、Oracle Database Webサービス・クライアント・ランタイムを使用し、WSDLドキュメントで指定されたWebサービスにアクセスします。

2. 必要に応じて、Webサービスのクライアント・プロキシ・クラス用のJavaラッパー・クラスが作成されます。インスタンス・メソッドを持つプロキシ・クラスごとに、インスタンス・メソッドを静的メソッドとして公開するためのラッパー・クラスが必要です。インスタンス・メソッドがなくても、プロキシ・クラスのメソッドのコール順序でJavaプリミティブ型以外が使用される場合は、ラッパー・クラスが必要です。

3. 生成されたクラス用のPL/SQLラッパーが作成され、PL/SQLからアクセス可能になります。PL/SQLでサポートされるのは静的メソッドのみのため、静的メソッドでインスタンス・メソッドをラップする必要があります。これが前のステップで実行されています。

4. -userおよび-url設定を指定してあり、JPublisherで接続が確立されていれば、-proxyopts=noload設定を介してロードを迂回するように指定しないかぎり、生成されたコードがデータベースにロードされます。

注意:
-proxywsdlを使用する場合の注意事項は次のとおりです。

- -packageオプションを使用して、生成されるJavaクラスのパッケージを指定する必要があります。

- -proxyoptsの場合、Oracle Application Server 10g リリース10.0.xで使用するにはデフォルトのjaxrpc設定で十分です。この設定では、Webサービスのクライアント・プロキシ・クラスのインスタンス・メソッドがシングルトン・メカニズムを使用して公開されます。Oracle Application Server 10g(9.0.4)またはそれ以前のリリースで使用する場合は、-proxyopts=soapに設定してください。

通常、-endpointオプションは-proxywsdlオプションとともに使用します。

Webサービスのエンドポイント

-endpointオプションを-proxywsdlオプションとともに使用して、Webサービスのエンドポイントを指定できます。エンドポイントとは、Webサービスがデプロイされ、クライアントがアクセスするURLです。このオプションの構文は次のとおりです。

-endpoint=Web_services_endpoint

このオプションは次のように使用します。

% jpub -proxywsdl=META-INF/HelloService.wsdl ...
-endpoint=http://localhost:8888/javacallout/javacallout

このコマンドを使用すると、JPublisherにより次のコードを含むJavaラッパー・クラスが生成されます。

((Stub)m_port0)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:8888/javacallout/javacallout");

-endpointオプションを使用しない場合は、かわりに次のようなコメント付きのコードが生成されます。

// Specify the endpoint and then uncomment the following statement:
// ((Stub)m_port0)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
//                "<endpoint not provided>");

JPublisherコマンドラインでエンドポイントを指定しない場合は、生成されたラッパー・クラスを手動で変更してこのコードのコメントを解除し、適切なエンドポイントを指定する必要があります。

WSDLのプロキシURL

Webサービスのコールアウトに使用するWSDLドキュメントがファイアウォールを介してアクセスされる場合は、-httpproxyオプションを-proxywsdlオプションとともに使用して、WSDLドキュメントのURLの解決に使用するプロキシURLを指定します。このオプションの構文は次のとおりです。

-httpproxy=proxy_URL

たとえば、次のようにします。

% jpub ... -httpproxy=http://www-proxy.oracle.com:80

クライアント・プロキシを実行するスーパーユーザー・パーミッション

-sysuserオプションを使用して、スーパーユーザー・アカウントの名前とパスワードを指定します。このアカウントは、クライアント・プロキシ・クラスからHTTPを使用してWebサービスにアクセスできるパーミッションが付与される、JPublisherが生成するPL/SQLスクリプトの実行時に使用されます。このオプションの構文は次のとおりです。

-sysuser=superuser_name/superuser_password

たとえば、次のようにします。

-sysuser=sys/change_on_install

-sysuser設定を使用しなければ、生成されたパーミッション付与スクリプトはロードされません。かわりに、スクリプトを別個に実行するように要求されます。

-url設定でThinドライバを指定する場合は、Thinドライバを介するSYSとしてのログオンが承認されるSYS用のパスワード・ファイルを設定する必要があります。パスワード・ファイルを設定するには、次の手順を実行する必要があります。

1. remote_login_passwordfileオプションをデータベース・パラメータ・ファイルに追加します。次のいずれかの設定を使用する必要があります。

remote_login_passwordfile=shared

remote_login_passwordfile=exclusive

2. パスワード・ファイルを作成していない場合は作成します。これを行うには、次のコマンドを実行します。ORACLE_HOME/dbs/は既存のディレクトリです。

orapwd file="ORACLE_HOME/dbs/orapwlsqlj1" entries=100 force=y
Enter password: password

3. ユーザーにリモート・ログオン権限を付与します。これを行うには、次のようにします。

% sqlplus /nolog
SQL> CONN / AS sysdba
Connected.
SQL> GRANT sysdba TO hr;
Grant succeeded.

関連項目:
リモートSYSログオンの設定方法の詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

SQLJ機能にアクセスするためのオプション

この項では、-sqljオプションについて説明します。このオプションを使用すると、JPublisherコマンドラインを介してSQLJオプションをSQLJ Translatorに渡すことができます。

SQLJ Translator用の設定

Oracle Database 12cでは、JPublisherを実行するとデフォルトでSQLJ変換が自動的に実行されます。変換は透過的であり、JPublisherコード生成では参照可能な.sqljファイルが生成されません。

ただし、JPublisherの-sqljオプションを使用して、JPublisherによるSQLJ Translatorの起動に使用するSQLJ設定を指定することもできます。このオプションの構文は次のとおりです。

-sqlj=sqlj_options

たとえば、次のようにします。

% jpub -user=hr -sqlj -optcols=true -optparams=true -optparamdefaults=datatype1(size1),datatype2(size)
Enter hr password: password

注意:

- -sqljの後には等号(=)がありません。

- 他のすべてのJPublisherオプションは、-sqljオプションの前に指定する必要があります。-sqljの後のオプション設定は、SQLJオプションとみなされてSQLJ Translatorに渡されます。前述の例では、-optcols、-optparamsおよび-optparamdefaultsがSQLJオプションです。

また、明示的に生成されている.sqljファイルの変換のためだけにJPublisherを実行することもできます。たとえば-compatible=sqljに設定してJPublisherを実行すると、自動SQLJ変換ステップはスキップされ、JPublisherから.sqlj出力ファイルが生成されます。この場合は、-sqlj以外にJPublisherオプションを使用しないでください。これは、sqljフロントエンド・スクリプトまたは実行可能ファイルが使用できない場合に、手動でSQLJ変換を実行する方法です。

-sqljに続けて指定するコマンドは、SQLJ Translatorユーティリティに対して直接指定するコマンドと同じです。次に例を示します。

% jpub -sqlj -d=outclasses -warn=none -encoding=SJIS Foo.sqlj

SQLJコマンドライン・トランスレータが使用可能な場合、これは次のコマンドと同じことです。

% sqlj -d=outclasses -warn=none -encoding=SJIS Foo.sqlj

注意:

- SQLJオプション設定は、-sqljオプションを介して指定するかわりに、JPublisherでサポートされるsqlj.propertiesファイル内に指定できます。

- -compiler-executableオプションでは、トランスレータでJavaコードのコンパイルに使用するJavaコンパイラを指定します。このオプションを設定すると、SQLJ Translatorに渡されます。

下位互換性オプション

この項では、-compatibleオプションについて説明します。このオプションを使用して次のいずれかを指定できます。

- JPublisherで生成されるクラスに実装されるインタフェース

- JPublisherによるSQLJ変換(参照可能な.sqlj出力ファイルの生成)をスキップするかどうか

- Oracle9iまたはOracle8i環境でJPublisher出力に使用する下位互換性モード

関連項目:
「下位互換性および移行」

ユーザー定義型用の下位互換性を持つOracleマッピング

-compatibleオプションには、次の2つの操作モードがあります。

- oradataまたはcustomdatumの設定を介して、JPublisherで生成されるカスタムJavaクラスで実装するインタフェースを明示的に指定できます。

- sqlj、8i、both8iまたは9iの設定を介して、下位互換性モードを指定できます。

使用できるモードはどちらか一方のみで、両方は使用できません。

このオプションの構文は次のとおりです。

-compatible={oradata|customdatum|both8i|8i|9i|10.1|sqlj}

-compatibleを使用したインタフェースの指定

-usertypes=oracleの場合は、-compatible=customdatumに設定すると、ユーザー定義型用に生成されたクラスに、非推奨のCustomDatumインタフェースをデフォルトのORADataインタフェースのかわりに実装できます。CustomDatumは、Oracle9i DatabaseでORADataに置き換えられていますが、下位互換性のためにサポートされています。

ORADataインタフェースを使用するためのデフォルト設定はoradataです。-usertypes=jdbcを設定した場合、-compatible設定のcustomdatumまたはoradataは無視されます。

Oracle9i以前のORADataインタフェースがサポートされていない環境でJPublisherを使用する場合は、-usertypes=oracleに設定すると自動的にCustomDatumインタフェースが使用されます。-compatible=oradataに設定すると警告メッセージが表示されますが、生成は行われます。

-compatibleを使用した下位互換性モードの指定

下位互換性モードを指定するには、sqlj、10.1、9i、8iまたはboth8i設定を使用します。

-compatible=sqljに設定すると、JPublisherはSQLJ変換をスキップし、かわりに直接処理できる.sqljファイルを生成します。sqlj設定は、生成されたコード自体には影響しません。生成された.sqljファイルを変換するには、SQLJ Translatorを直接使用する方法(使用可能な場合)と、JPublisherの-sqljオプションを使用する方法があります。

関連項目:
「SQLJ機能にアクセスするためのオプション」

-compatible=10.1設定は、Oracle Database 10gリリース1(10.1)互換モードを指定します。このモードでは、JPublisherのオプション-dbjavaは、Oracle Database 10gリリース1(10.1)の-javaと同じ動作をします。

-compatible=9i設定は、Oracle9i互換モードを指定します。このモードでは、Oracle9iバージョンで生成される場合と同じコードを含む.sqljファイルが生成されます。

-compatible=8i設定は、Oracle8i互換モードを指定します。このモードではCustomDatumインタフェースが使用され、Oracle8iバージョンのJPublisherで生成される場合と同じコードを含む.sqljファイルが生成されます。8iに設定するのは、JPublisherで複数の下位互換性オプションを個別にOracle8iに設定するのと同じです。たとえば、メソッド生成の動作は-methods=alwaysに設定した場合と同じで、接続コンテキスト宣言の生成は-context=generatedに設定した場合と同じです。

-compatible=both8i設定は、代替Oracle8i互換モードに使用します。この設定では、ORADataインタフェースとCustomDatumインタフェースの両方を実装するラッパー・クラスが生成されます。コードは、Oracle8iバージョンのJPublisherの場合と同じコードが生成されます。通常、Oracle Application Serverなどの中間層で実行するプログラムには、ORADataのサポートが必要であるため、この設定は-compatible=8i設定より優先されます。ただし、ORADataを使用するには、Oracle9iリリース1(9.0.1)以上のJDBCドライバが必要です。

注意:
参照可能な.sqljファイルを生成する互換モードの場合は、SQL型階層のJavaラッパー・クラスを生成するときに、1つ以上の型にストアド・プロシージャが含まれていると、デフォルトで、ストアド・プロシージャを含む型のみでなくSQL型すべてについて.sqljファイルが生成されることに注意してください。

Java環境オプション

この項では、Java環境の決定に使用できるJPublisherオプションについて説明します。

- -classpathオプションでは、JPublisherとSQLJで変換およびコンパイル時にクラスの解決に使用されるJavaのCLASSPATHを指定します。

- -compiler-executableオプションでは、JPublisherで生成されたコードのコンパイルに使用するJavaコンパイラを指定します。

- -vmオプションでは、JPublisherの起動に使用するJVMを指定します。

UNIX環境では、jpubスクリプトによりJPublisherを実行するJava実行可能ファイルの位置が指定されます。このスクリプトは、データベースまたはアプリケーション・サーバー・インスタンスのインストール時に生成されます。jpubスクリプトでJDK 1.4より前のJavaバージョンが使用される場合、JPublisherの一部のWebサービス機能(コールアウトやSYS.XMLTypeのマップなど)は使用できません。

変換およびコンパイル用のCLASSPATH

-classpathオプションを使用して、JPublisherで変換およびコンパイル時のJavaソースとクラスの解決に使用するJavaのCLASSPATHを指定します。このオプションの構文は次のとおりです。

-classpath=path1:path2:...:pathN

次のコマンドは、既存のCLASSPATHに新規のパスを追加する場合の使用例を示しています。

% jpub -user=hr -sql=PERSON:Person,STUDENT:Student -classpath=.:$ORACLE_HOME/jdbc/lib/ocrs12.jar:$CLASSPATH
Enter hr password: password

注意:
SQLJにも-classpathオプションがあります。SQLJの-classpathオプションをJPublisherの-sqljオプションに続けて使用すると、その設定が変換およびコンパイル用のCLASSPATHに使用され、JPublisherの-classpathオプション設定は無視されます。JPublisherの-classpathオプションのみを使用する方が簡単です。

Javaコンパイラ

-compiler-executableオプションを使用するのは、JPublisherで生成されたJavaコードのコンパイルに、システム上のJPublisherによりデフォルトで使用されるコンパイラとは異なるコンパイラを使用する場合です。代替コンパイラの実行可能ファイルへのパスを指定します。このオプションの構文は次のとおりです。

-compiler-executable=path_to_compiler_executable

Javaのバージョン

-vmオプションを使用するのは、システム上のJPublisherによりデフォルトで使用されるJVMとは異なるJVMを使用する場合です。代替Java実行可能ファイルへのパスを指定します。このオプションの構文は次のとおりです。

-vm=path_to_JVM_executable

たとえば、UNIXシステム上で、カレント・ディレクトリへの相対位置JDK14にJDK 1.4がインストールされているとします。Webサービス・クライアント・プロキシ・クラスを公開するときにJDK 1.4のJVMおよびコンパイラを使用するには、次のコマンドを使用してJPublisherを実行します。

% jpub -vm=JDK14/bin/java -compiler-executable=JDK14/bin/java -proxywsdl=hello.wsdl

SQLJ移行オプション

Oracle Database 10gリリース2(10.2)から、JPublisherでは次のコマンドライン・オプションを提供してSQLJからJDBCアプリケーションへの移行をサポートしています。

- -migrate
このオプションを使用すると、SQLJの移行をオンにできます。このオプションを設定する構文は次のとおりです。

-migrate[=true|false]

-migrate設定と-migrate=true設定は同じです。この2つの設定は、コマンドラインに指定されたSQLJプログラムをJDBCプログラムに移行する必要があることをJPublisherに指示します。-migrate=falseは移行モードをオフにし、SQLJプログラムは、SQLJランタイムに依存する可能性のあるJavaプログラムに変換されコンパイルされます。このオプションが指定されていない場合、JPublisherのデフォルト動作は-migrate=falseです。

- -migconn
このオプションを使用すると、移行されたコードにより使用されるデフォルトのJDBC接続を指定できます。デフォルトのJDBC接続は、SQLJランタイムのデフォルトのDefaultContextインスタンスを置き換えます。このオプションを設定する構文は次のとおりです。

-migconn=getter:getter,setter:setter
-migconn=name[[:datasource|modifier][,modifier]*]

最初の構文で、getterおよびsetter設定はデフォルト接続のgetterおよびsetterメソッドを指定します。たとえば、次のようにします。

-migconn=getter:Test.getDefConn,setter:Test.setDefConn

2番目の構文にあるname設定はデフォルトのJDBC接続を指定します。オプションのdatasource設定は、デフォルトのJDBC接続を初期化するためにJNDIデータ・ソースの場所を指定します。modifier設定は、デフォルトの接続変数の修飾子を追加します。複数のmodifier設定を使用すると、複数の修飾子を指定できます。2番目の構文の使用例は次のとおりです。

-migconn=_defaultConn:public,static
-migconn=Test._defaultConn
-migconn=Test._defaultConn:jdbc/MyDataSource
-migconn=_defaultConn:public,static,final

- -migrsi
このオプションを使用すると、すべてのResultSetイテレータ・クラスのインタフェースを指定できます。このオプションを設定する構文は次のとおりです。

-migrsi=java_interface_name

たとえば、次のようにします。

-migrsi=ResultSetInterface

- -migsync
このオプションを使用すると、静的変数をsynchronizedとしてマークできます。このオプションを設定する構文は次のとおりです。

-migsync[=true|false]

-migsyncと-migsync=true設定は、移行目的で生成された静的変数を同期としてマークします。変数を同期としてマークしない場合は、-migsync=falseに設定します。JPublisherのデフォルト動作は-migsync=trueです。

- -migdriver
このオプションを使用すると、移行されるコードにより登録されるJDBCドライバを指定できます。このオプションを設定する構文は次のとおりです。

-migdriver=class_name|no

たとえば、次のようにします。

-migdriver=oracle.jdbc.driver.OracleDriver

JPublisherのデフォルト動作は-migdriver=oracle.jdbc.driver.OracleDriverです。移行中にドライバ登録コードを生成しない場合は、このオプションを次のように設定します。

-migdriver=no

- -migcodegen
このオプションを使用すると、移行されるコードがOracle JDBCドライバに依存するか汎用JDBCドライバに依存するかを指定できます。このオプションを設定する構文は次のとおりです。

-migcodegen=oracle|jdbc

デフォルト動作は-migcodegen=oracleで、移行コードでOracle固有のJDBC APIが使用されることを示します。

- -migserver
このオプションを使用すると、サーバーで使用されるプログラムを移行するかどうかを指定できます。このオプションを設定する構文は次のとおりです。

-migserver

関連項目:
http://www.oracle.com/technology/tech/java/sqljjdbc/pdf/oraclesqljroadmap.pdf

JPublisher入力ファイル

次の項では、JPublisherの入力ファイルの構造および内容を説明します。

- プロパティ・ファイルの構造および構文

- INPUTファイルの構造および構文

- INPUTファイルの事前注意事項

プロパティ・ファイルの構造および構文

プロパティ・ファイルは、頻繁に使用するオプションを指定できるオプションのテキスト・ファイルです。JPublisherコマンドラインで-propsオプションを使用して、プロパティ・ファイルの名前を指定します。

注意:
プロパティ・ファイル内で指定できないオプションは、-propsのみです。

プロパティ・ファイルの各行には、オプションを1つのみと、その対応する値を入力します。各オプション設定には次の接頭辞をピリオドも含めて入力します。

jpub.

The jpub. prefix is case-sensitive.空白を使用できるのはjpub.の直前のみです。オプション行の他の位置には空白を使用できません。

または、接頭辞の一部にSQLコメントの構文である二重ダッシュ(--)を使用してオプションを指定できます。

-- jpub.

前述のどちらかの接頭辞で始まらない行は、単にJPublisherで無視されます。

また、行の継続を使用すると、プロパティ・ファイル内で複数行にまたがるJPublisherオプションを指定できます。継続行の末尾には、行テキストの直後に円記号(\)を付ける必要があります。円記号に続く行の先頭の空白や二重ダッシュ(--)は無視されます。次のサンプル・エントリを考えます。

/* The next three lines represent a JPublisher option
jpub.sql=SQL_TYPE:JPubJavaType:MyJavaType,\
OTHER_SQL_TYPE:OtherJPubType:MyOtherJavaType,\
LAST_SQL_TYPE:My:LastType
*/
-- The next two lines represent another JPublisher option
-- jpub.addtypemap=PLSQL_TYPE:JavaType:SQL TYPE\
--                :SQL_TO_PLSQL_FUNCTION:PLSQL_TO_SQL_FUNCTION

この機能を使用して、SQLスクリプトにJPublisherオプションを埋め込むことができ、PL/SQLからSQLへの型マッピングを設定する場合に役立ちます。

JPublisherでは、-propsオプションが指定された場所で、プロパティ・ファイルの内容がコマンドラインから挿入されたかのように、オプションが順番に読み取られます。1つのオプションを2度以上指定すると、最後に指定した値によって前の値がオーバーライドされます。ただし、次のオプションの場合は値が累積されます。

- jpub.sql(または非推奨のjpub.types)

- jpub.java

- jpub.style

- jpub.addtypemap

- jpub.adddefaulttypemap

たとえば、次のコマンドを考えてみます。

% jpub -user=hr -sql=employee -mapping=oracle -case=lower -package=corp -dir=demo
Enter hr password: password

次のコマンドも考えます。

% jpub -props=my_properties

my_propertiesが次のように定義されている場合、このコマンドは最初の例と同じです。

-- jpub.user=hr/hr
// jpub.user=cannot_use/java_line_comments
jpub.sql=employee
/*
jpub.mapping=oracle
*/
Jpub.notreally=a jpub option
jpub.case=lower
jpub.package=corp
jpub.dir=demo

各オプション名の先頭に、jpub.接頭辞を含める必要があります。オプション名の前に空白または二重ダッシュ(--)以外の文字列を入力すると、JPublisherで行全体が無視されます。

前述の例は、jpub.の前に空白を使用できることを示しています。また、jpub.接頭辞をすべて小文字で指定しないと無視されることを示しています。したがって、前述の例にある次の行は無視されます。

Jpub.notreally=a jpub option

INPUTファイルの構造および構文

JPublisherコマンドラインで-inputオプションを使用して、INPUTファイルの名前を指定します。このファイルは、JPublisherで変換するSQLのユーザー定義型およびPL/SQLパッケージを識別します。また、生成されたクラスおよびパッケージのネーミングも制御します。-sqlコマンドライン・オプションを使用してユーザー定義型およびパッケージを指定できますが、INPUTファイルを使用するとJPublisherでのこれらの変換をさらに詳細に制御できます。

INPUTファイルまたはコマンドラインで変換対象の型やパッケージを指定しない場合、JPublisherでは、接続先のスキーマにあるすべてのユーザー定義型およびPL/SQLパッケージが変換されます。

変換文について

INPUTファイル内の変換文は、JPublisherで変換するユーザー定義型およびPL/SQLパッケージの名前を識別します。変換文ではオプションで型またはパッケージのJava名、属性識別子のJava名および拡張されたクラスがあるかどうかを指定できます。

1つ以上の変換文をINPUTファイルに入れることができます。変換文の構造は次のとおりです。

( SQL name
| SQL [schema_name.]toplevel  [(name_list)]
| TYPE type_name)
[GENERATE java_name_1]
[AS java_name_2]
[TRANSLATE
database_member_name AS simple_java_name
{ , database_member_name AS simple_java_name}*
]

次の項では、変換文のコンポーネントを説明します。

SQL name | TYPE type_name SQL nameと入力し、JPublisherで変換するSQL型またはPL/SQLパッケージを識別します。JPublisherではnameの検査でユーザー定義型であるかPL/SQLパッケージであるかが判断され、適切に処理されます。nameのかわりに、予約語toplevelを使用すると、JPublisherではその接続先のスキーマ内のパッケージに属さないストアド・プロシージャやストアド・ファンクションが変換されます。

オブジェクト型のみを指定する場合は、SQLのかわりにTYPE type_nameを入力できます。ただし、TYPE構文は非推奨です。

また、nameにschema_name.nameを入力すると、SQL型またはパッケージが所属するスキーマを指定できます。schema_name.toplevelを入力すると、JPublisherではスキーマschema_name内にあるトップレベルのサブプログラムが変換されます。TOPLEVELとともに、公開する名前のカンマ区切りのリストname_listをカッコで囲んで指定することもできます。JPublisherでは、このリストと一致するトップレベルのファンクションおよびプロシージャのみが考慮されます。このリストを指定しない場合、トップレベルのすべてのサブプログラム用のコードが生成されます。

注意:
SQLでユーザー定義型が大/小文字区別を使用して定義されている場合は、名前を引用符で囲んで指定する必要があります。たとえば、次のようにします。

SQL "CaseSenstiveType" AS CaseSensitiveType

または、大/小文字区別のないスキーマ名を指定することもできます。

SQL HR."CaseSensitiveType" AS CaseSensitiveType

大/小文字区別のあるスキーマ名を指定することもできます。

SQL "Hr"."CaseSensitiveType" AS CaseSensitiveType

AS句はオプションです。

スキーマ名や型名にはピリオド(.)を使用しないでください。

GENERATE java_name_1 AS java_name_2 AS句は、変換対象のSQLユーザー定義型またはPL/SQLパッケージを表すJavaクラスの名前を指定します。

GENERATE句を付けずにAS句を使用すると、JPublisherではAS句に指定したクラスが生成され、SQL型またはPL/SQLパッケージにマップされます。

SQLのユーザー定義型にGENERATE句とAS句の両方を使用する場合、GENERATE句ではJPublisherで生成されるJavaクラスの名前を指定し、これはベース・クラスと呼ばれます。AS句では、生成されたベース・クラスを拡張するJavaクラスの名前を指定し、これはユーザー・サブクラスと呼ばれます。JPublisherではユーザー・サブクラスの初期バージョンが生成され、通常は、必要な機能のコードを追加します。JPublisherでは、SQL型を、ベース・クラスではなくユーザー・サブクラスにマップします。後で同じJPublisherコマンドを実行してSQL型を再公開すると、生成されたクラスは上書きされますが、ユーザー・サブクラスは上書きされません。

java_name_1とjava_name_2には任意の有効なJava名を指定でき、パッケージ識別子を組み込めます。Java名の大/小文字区別により、-caseオプションがオーバーライドされます。

TRANSLATE database_member_name AS simple_java_name この句は属性またはメソッドに対して別の名前をオプションで指定します。database_member_nameは、SQLオブジェクト型の属性名、あるいはオブジェクト型またはPL/SQLパッケージのメソッドの名前です。属性またはメソッドはsimple_java_nameに変換され、これは任意の有効なJava名です。Java名の大/小文字区別により、-caseオプションがオーバーライドされます。この名前にはパッケージ名を含めません。

TRANSLATE...ASを使用せずに属性またはメソッドを改名する場合、またはJPublisherでINPUTファイルにリストされていないオブジェクト型を変換する場合、JPublisherでは属性またはメソッドのデータベース名がJava名として使用されます。該当する場合、Java名は-caseオプションの設定に従って変更されます。属性名またはメソッドを改名するのは次の理由があります。

- 名前に文字、数字およびアンダースコア以外の文字が含まれている場合。

- 名前がJavaキーワードと競合する場合。

- 型名が同じ有効範囲の別の名前と競合する場合。これは、プログラムで異なるスキーマからの同じ名前を持つ2つの型を使用する場合などに起こります。

属性名はgetXXX()およびsetXXX()メソッド名に埋め込まれて表されるため、属性名の1文字目を大文字にすることもできます。たとえば、次のように入力したとします。

TRANSLATE FIRSTNAME AS FirstName

getFirstName()メソッドおよびsetFirstName()メソッドが生成されます。それに対し、次のように入力したとします。

TRANSLATE FIRSTNAME AS firstName

getfirstName()メソッドおよびsetfirstName()メソッドが生成されます。

注意:
Javaキーワードnullは、次のように属性やメソッドのターゲットJava名として使用される場合は特別な意味を持ちます。

TRANSLATE FIRSTNAME AS null

SQLメソッドをnullにマップすると、JPublisherではマップ先のJavaクラスには対応するJavaメソッドが作成されません。SQLオブジェクトの属性をnullにマップすると、JPublisherではマップ先のJavaクラスに属性用のgetterメソッドとsetterメソッドが作成されません。

INPUTファイルでのパッケージ・ネーミング規則 INPUTファイル内で完全修飾クラス名を使用してパッケージ名を指定できます。INPUTファイル内で修飾されていない単純なクラス名を使用すると、完全修飾クラス名に-packageオプションからのパッケージ名が組み込まれます。これを次の例に示します。

- 次のINPUTファイルがあるとします。

SQL A AS B

また、-package=a.bに設定しているとします。この場合、a.bはパッケージ、a.b.Bは完全修飾クラス名です。

- INPUTファイルに次のように入力し、-packageを設定しないとします。

SQL A AS b.C

パッケージはbで、b.Cは完全修飾クラス名です。

関連項目:
「生成されたJavaパッケージの名前」

注意:
-packageオプション設定とINPUTファイルのパッケージ設定が競合する場合、優先順位はコマンドラインで-inputおよび-packageオプションを指定した順序によって決定します。-package設定は、-inputオプションより後に指定した場合は優先され、それ以外の場合はINPUTファイルの設定が優先されます。

追加の型変換 JPublisherではINPUTファイルにリストされていない追加の型を変換することが必要な場合があります。これは、変換実行前にINPUTファイル内の型の依存関係が分析され、必要な他の型が変換されるためです。

「JPublisher変換の例」にある例を考えてみます。EMPLOYEEのオブジェクト型定義にADDRESSと呼ばれる属性が含まれており、ADDRESSが次の定義で指定されたオブジェクトであるとします。

CREATE OR REPLACE TYPE address AS OBJECT
(
street     VARCHAR2(50),
city       VARCHAR2(50),
state      VARCHAR2(30),
zip        NUMBER
);

JPublisherでEMPLOYEE型を定義する必要があるため、ADDRESSが最初に変換されます。さらに、ADDRESSおよびその属性はINPUTファイルで特に指定されていないため、すべて同じ大/小文字の区別で変換されます。Address.javaのクラス・ファイルが生成され、コマンドラインで指定されたパッケージに組み込まれます。

ユーザー定義型やPL/SQLパッケージは他のPL/SQLパッケージに依存しないため、要求していないPL/SQLパッケージは変換されません。

変換文の例

INPUTファイルの機能を具体的に示すために、「JPublisher変換の例」にある例の更新バージョンについて考えてみます。

次のコマンドを考えてみます。

% jpub -user=hr -input=demoin -numbertypes=oracle -usertypes=oracle -dir=demo -d=demo -package=corp -case=same
Enter hr password: password

INPUTファイルdemoinに次のコードが含まれているとします。

SQL employee AS Employee
TRANSLATE NAME AS Name HIRE_DATE AS HireDate

-case=sameオプションは、特に指定した場合を除き、生成されたJava識別名でデータベース内と同じ大/小文字の区別を保持するように指定します。CREATE TYPEまたはCREATE PACKAGE宣言内の識別名は、引用符で囲まれていないかぎりデータベース内には大文字で格納されます。この例では、EMPLOYEEはJavaクラスEmployeeとして変換するように指定されているため、-caseオプションはEMPLOYEE型には適用されません。

属性の場合、INPUTファイルで特に指定されていない属性識別子は大文字のままですが、NAMEおよびHIRE_DATEは指定に従ってNameおよびHireDateとして変換されます。

変換後のEMPLOYEE型は、-package、-dirおよび-d設定を反映してカレント・ディレクトリ(この例ではUNIXシステムの場合)に相対で次のファイルに書き込まれます。

demo/corp/Employee.java
demo/corp/Employee.class

INPUTファイルの事前注意事項

この項では、JPublisherで現在レポートされないINPUTファイルのエラー条件について説明します。また、予約語についても説明します。

複数の異なるオブジェクト型に対する同じJavaクラス名の要求

2つの異なるオブジェクト型に対して同じJavaクラス名を要求すると、2番目のクラスにより最初のクラスが警告なしで上書きされます。たとえば、INPUTファイルに次の内容が含まれているとします。

type PERSON1 as Person
type PERSON2 as Person

JPublisherでは、PERSON1用にPerson.javaファイルが作成され、PERSON2型用に次に作成された同名のファイルにより上書きされます。

複数の異なるオブジェクト属性に対する同じ属性名の要求

2つの異なるオブジェクト属性に対して同じ属性名を要求すると、JPublisherでは警告メッセージを発行せずに両方の属性に対してgetXXX()およびsetXXX()メソッドが生成されます。生成されたクラスがJavaで有効かどうかは、同じ名前の2つのgetXXX()メソッドおよび同じ名前の2つのsetXXX()メソッドに、明確にオーバーロードできる異なる引数型があるかどうかによります。

存在しない属性の指定

TRANSLATE句で存在しないオブジェクト属性を指定すると、JPublisherは警告メッセージを発行せずにそのオブジェクト属性を無視します。

INPUTファイルからの次の例を考えます。

type PERSON translate X as attr1

XがPERSONの属性ではない場合、JPublisherでは警告メッセージが発行されません。

JPublisherの予約語

次の予約語は、INPUTファイル内でSQL識別子またはJava識別子として使用しないでください。

AS
GENERATE
IMPLEMENTS
SQLSTATEMENTS_TYPE
SQLSTATEMENTS_METHOD
SQL
TRANSLATE
TOPLEVEL
TYPE
VERSION

A 生成されるコードの例

この付録では、生成されるコードの例を次の各項で説明しています。

- 生成されるコード: SQL文

- 生成されるコード: サーバー・サイドJavaのコールイン

生成されるコード: SQL文

この項では、「変換対象のSQL文の宣言」の説明に関連して、指定したSQL文用に生成されるコードの例について説明します。

この例では、-sqlstatementオプションに次のサンプル設定を使用しています。

-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
where ename=:{myname VARCHAR}"
-sqlstatement.return=both

この例では、次の点に注意してください。

- コードのコメントは、示されている変換済コードに対応する#sql文を示しています。

- -sqlstatement.return=both設定により生成されたgetEmpBeans()メソッドは、JavaBeansの配列を戻します。各要素は結果セットの行を表します。そのためにGetEmpRowクラスが定義されています。

- JPublisherではSQLJクラスが生成されます。結果セットはSQLJイテレータにマップされます。

(UPDATE、INSERTまたはDELETE文の場合は、配列バインド用のバッチを使用するコードと使用しないコードの両方が生成されます。)

JPublisherで生成される変換済SQLJコードを次に示します。

public class MySqlStatements_getEmpRow
{

/* connection management */

/* constructors */
public MySqlStatements_getEmpRow()
{ }

public String getEname() throws java.sql.SQLException
{ return ename; }

public void setEname(String ename) throws java.sql.SQLException
{ this.ename = ename; }

private String ename;
}

/*@lineinfo:filename=MySqlStatements*/
/*@lineinfo:user-code*/
/*@lineinfo:1^1*/
import java.sql.SQLException;
import sqlj.runtime.ref.DefaultContext;
import sqlj.runtime.ConnectionContext;
import java.sql.Connection;
import oracle.sql.*;

public class MySqlStatements
{

/* connection management */
protected DefaultContext __tx = null;
protected Connection __onn = null;
public void setConnectionContext(DefaultContext ctx) throws SQLException
{ release(); __tx = ctx; }
public DefaultContext getConnectionContext() throws SQLException
{ if (__tx==null)
{ __tx = (__onn==null) ? DefaultContext.getDefaultContext() :
new DefaultContext(__onn); }
return __tx;
};
public Connection getConnection() throws SQLException
{ return (__onn==null) ? ((__tx==null) ? null : __tx.getConnection()) : __onn; }
public void release() throws SQLException
{ if (__tx!=null && __onn!=null) __tx.close(ConnectionContext.KEEP_CONNECTION);
__onn = null; __tx = null;
}

/* constructors */
public MySqlStatements() throws SQLException
{ __tx = DefaultContext.getDefaultContext(); }
public MySqlStatements(DefaultContext c) throws SQLException
{ __tx = c; }
public MySqlStatements(Connection c) throws SQLException
{__onn = c; __tx = new DefaultContext(c); }
/*@lineinfo:generated-code*/
/*@lineinfo:36^1*/

//  ************************************************************
//  SQLJ iterator declaration:
//  ************************************************************

public static class getEmpIterator
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
{
public getEmpIterator(sqlj.runtime.profile.RTResultSet resultSet)
throws java.sql.SQLException
{
super(resultSet);
enameNdx = findColumn("ename");
m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
}
private oracle.jdbc.OracleResultSet m_rs;
public String ename()
throws java.sql.SQLException
{
return m_rs.getString(enameNdx);
}
private int enameNdx;
}

//  ************************************************************

/*@lineinfo:user-code*/
/*@lineinfo:36^56*/

public MySqlStatements_getEmpRow[] getEmpBeans (String myname)
throws SQLException
{
getEmpIterator iter;
/*@lineinfo:generated-code*/
/*@lineinfo:43^5*/
//  ************************************************************
//  #sql [getConnectionContext()]
//                     iter = { select ename from emp where ename=:myname };
//  ************************************************************
{
// declare temps
oracle.jdbc.OraclePreparedStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext();
if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec =
((__sJT_cc.getExecutionContext()==null) ?
sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
__sJT_cc.getExecutionContext().getOracleContext());
try {
String theSqlTS = "select ename from emp where ename= :1";
__sJT_st = __sJT_ec.prepareOracleStatement
(__sJT_cc,"0MySqlStatements",theSqlTS);
// set IN parameters
__sJT_st.setString(1,myname);
// execute query
iter = new MySqlStatements.getEmpIterator
(new sqlj.runtime.ref.OraRTResultSet
(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MySqlStatements",null));
} finally { __sJT_ec.oracleCloseQuery(); }
}

//  ************************************************************

/*@lineinfo:user-code*/
/*@lineinfo:43^84*/
java.util.Vector v = new java.util.Vector();
while (iter.next())
{
MySqlStatements_getEmpRow r = new MySqlStatements_getEmpRow();
r.setEname(iter.ename());
v.addElement(r);
}
MySqlStatements_getEmpRow[] __jPt_result =
new MySqlStatements_getEmpRow[v.size()];
for (int i = 0; i < v.size(); i++)
__jPt_result[i] = (MySqlStatements_getEmpRow) v.elementAt(i);
return __jPt_result;
}

public java.sql.ResultSet getEmp (String myname)
throws SQLException
{
sqlj.runtime.ResultSetIterator iter;
/*@lineinfo:generated-code*/
/*@lineinfo:62^5*/

//  ************************************************************
//  #sql [getConnectionContext()] iter =
//                     { select ename from emp where ename=:myname };
//  ************************************************************

{
// declare temps
oracle.jdbc.OraclePreparedStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext();
if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec =
((__sJT_cc.getExecutionContext()==null) ?
sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
__sJT_cc.getExecutionContext().getOracleContext());
try {
String theSqlTS = "select ename from emp where ename= :1";
__sJT_st = __sJT_ec.prepareOracleStatement
(__sJT_cc,"1MySqlStatements",theSqlTS);
// set IN parameters
__sJT_st.setString(1,myname);
// execute query
iter = new sqlj.runtime.ref.ResultSetIterImpl
(new sqlj.runtime.ref.OraRTResultSet
(__sJT_ec.oracleExecuteQuery(),__sJT_st,"1MySqlStatements",null));
} finally { __sJT_ec.oracleCloseQuery(); }
}

//  ************************************************************

/*@lineinfo:user-code*/
/*@lineinfo:62^84*/
java.sql.ResultSet __jPt_result = iter.getResultSet();
return __jPt_result;
}
}
/*@lineinfo:generated-code*/

生成されるコード: サーバー・サイドJavaのコールイン

JPublisherでは、データベース内のJavaメソッドに対するデータベース外のJavaクライアントからのコールがサポートされています。Oracle Database 12cリリース1では、JPublisherの-dbjavaオプションがサーバー側Javaのコールに使用されます。-javaオプションとは異なり、-dbjavaオプションはシリアライズ不可能なパラメータまたは戻り型をサポートします。

関連項目:
「サーバー・サイドJavaのコール(コールイン)」

この項では、サーバー・サイドJavaのコールの例を説明します。この項の内容は次のとおりです。

- ソース・ファイル

- サーバー・サイドJavaクラスの公開

- 生成されるファイル

- 公開されたファイルのテスト

注意:
Oracle Databaseの12cリリース1 (12.1)バージョンが必要です。

ソース・ファイル

この例では、作成するソース・ファイルが3つあります。これを次に示します。

- サーバー・サイドJavaクラス

- サーバー・サイドJavaクラスで使用されるJavaBean

- 公開済クラス内のメソッドをコールするエントリ・ポイントJavaクラス

これらのファイルのソース・コードを次に示します。

サーバー・サイドJavaクラス

サーバー・サイドJavaクラスCallin2.javaのソース・コードは、次のとおりです。

public class Callin2
{
public static int testInt(int i)
{ return i; }
public static int[] testInt(int[] i)
{ return i; }
public static int[][] testInt(int[][] i)
{ return i; }
public static Integer testInteger(Integer i)
{ return i; }
public static Integer[] testInteger(Integer[] i)
{ return i; }
public static Integer[][] testInteger(Integer[][] i)
{ return i; }

// Test ORAData
public static oracle.sql.NUMBER testNum(oracle.sql.NUMBER num)
{ return num; }
public oracle.sql.NUMBER testInstNum(oracle.sql.NUMBER num)
{ return num; }
public oracle.sql.NUMBER[] testInstNum(oracle.sql.NUMBER[] num)
{ return num; }
public oracle.sql.NUMBER[][] testInstNum(oracle.sql.NUMBER[][] num)
{ return num; }

// Test Beans
public static Callin2Bean testBean()
{ return new Callin2Bean("mybean", new int[]{1,2}); }
public static Callin2Bean testBean (Callin2Bean b)
{ return b; }
public static Callin2Bean[] testBean (Callin2Bean[] b)
{ return b; }
public static Callin2Bean[][] testBean (Callin2Bean[][] b)
{ return b; }
public Callin2Bean testInstBean (Callin2Bean b)
{ return b; }
public Callin2Bean[] testInstBean (Callin2Bean[] b)
{ return b; }
public Callin2Bean[][] testInstBean (Callin2Bean[][] b)
{ return b; }

// Test Serializable
public static java.io.Serializable testSer()
{ return new String("test Serializable"); }
public static java.io.Serializable testSer (java.io.Serializable b)
{ return b; }
public static java.io.Serializable[] testSer (java.io.Serializable[] b)
{ return b; }
public static java.io.Serializable[][] testSer (java.io.Serializable[][] b)
{ return b; }
public java.io.Serializable testInstSer (java.io.Serializable b)
{ return b; }
public java.io.Serializable[] testInstSer (java.io.Serializable[] b)
{ return b; }
public java.io.Serializable[][] testInstSer (java.io.Serializable[][] b)
{ return b; }
}

サーバー・サイドJavaクラスで使用されるJavaBean

サーバー・サイドJavaクラスCallin2.javaで使用されるJavaBeanのCallin2Bean.javaのソース・コードは、次のとおりです。

public class Callin2Bean
{
private String stringValue = "";
private int[] numberValue;

public Callin2Bean ()
{
}

public Callin2Bean(String string_val, int[] number_val)
{
stringValue = string_val;
numberValue = number_val;
}

public void setStringValue(String string_val)
{
stringValue = string_val;
}

public String getStringValue ()
{
return stringValue;
}

public void setNumberValue (int[] number_val)
{
numberValue = number_val;
}

public int[] getNumberValue ()
{
return numberValue;
}

public boolean equals(Object other)
{
if(other instanceof Callin2Bean)
{
Callin2Bean my_bean = (Callin2Bean)other;
if ( stringValue.equals(my_bean.getStringValue()) && compareIntArray(numberValue, my_bean.getNumberValue()) )
{
return true;
}
}
return false;
}

private boolean compareIntArray(int[] b1, int[] b2)
{
try
{
if ((b1 == null) && (b2 == null))
return true;

if ((b1.length == 0) && (b2.length == 0))
return true;

if (b1.length != b2.length)
return false;
int x;
for (x = 0; x < b1.length; x++)
{
if (b1[x] != b2[x])
return false;
}
return true;
}
catch (Exception e)
{
return false;
}
}
}

エントリ・ポイントJavaクラス

TestCallin2.javaが、この例のエントリ・ポイントJavaクラスです。このクラスが公開済クラス内のメソッドをコールします。TestCallin2.javaファイルのソース・コードは、次のとおりです。

public class TestCallin2
{
public static void main(String[] args) throws Exception
{
java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)
//java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:lsqlj1", "hr", "hr");
java.sql.DriverManager.getConnection("jdbc:oracle:oci8:@", "hr", "hr");

Callin2Client tkpu = new Callin2Client (conn);

System.out.println("testInstNum() returned " + tkpu.testinstnum(new java.math.BigDecimal(1999)));

TblNumber na = new TblNumber(new java.math.BigDecimal[]{new java.math.BigDecimal(2999)});
System.out.println("testInstNum([]) returned " +
tkpu.testinstnum(na).getArray()[0]);

ObjCallin2bean mb = new ObjCallin2bean("mybean", na);
System.out.println("testCallin2Bean() returned " + tkpu.testbean(mb).getStringValue());
System.out.println("testCallin2Bean([]) returned " +
tkpu.testbean(new TblObjCallin2bean(new ObjCallin2bean[]{mb})).getArray()[0].getStringValue());

java.io.Serializable s = new java.util.Hashtable();
((java.util.Hashtable) s).put("bush", "cheny");
((java.util.Hashtable) s).put("kerry", "dean");
java.io.Serializable[] s1 = new java.io.Serializable[]{s};
java.io.Serializable[][] s2 = new java.io.Serializable[][]{s1};
System.out.println("testSer() returned " + ((java.util.Hashtable) tkpu.testser(s)).get("kerry"));
System.out.println("testSer([]) returned " + ((java.util.Hashtable) tkpu.testser0(s1)[0]).get("kerry"));
System.out.println("testSer([][]) returned " + ((java.util.Hashtable) tkpu.testser1(s2)[0][0]).get("kerry"));
}
}

注意:
JDBC Thinドライバを使用してデータベースに接続している場合、前出のコード内のgetConnection()メソッドへの最初のコールをコメント解除し、getConnection()メソッドへの2回目のコールをコメント化する必要があります。このコールにはOracle Call Interface(OCI)ドライバ用の接続文が含まれています。

サーバー・サイドJavaクラスの公開

必要なソース・ファイルを作成した後、それらのファイルを公開する必要があります。サーバー・サイドJavaクラスを公開するには、最初にこれらのファイルをデータベースにロードする必要があります。Callin2.javaとCallin2Bean.javaの両方をロードしてください。ロード用のコマンドは、次のとおりです。

% loadjava -u hr -r -v -f Callin2.java Callin2Bean.java
Password: password

これらのファイルを公開するには、次のコマンドを発行します。

% jpub -u hr -sysuser=sys/sys_password -dbjava=Callin2:Callin2Client -dir=tmp
Enter hr password: password

JPublisherの出力は次のとおりです。

tmp/Callin2JPub.java
tmp/plsql_wrapper.sql
tmp/plsql_dropper.sql
HR.TBL_NUMBER
HR.TBL_TBL_NUMBER
HR.OBJ_CALLIN2BEAN
HR.TBL_OBJ_CALLIN2BEAN
HR.TBL_TBL_OBJ_CALLI
HR.JPUB_PLSQL_WRAPPER
Executing tmp/plsql_dropper.sql
Executing tmp/plsql_wrapper.sql
Loading Callin2JPub.java

生成されるファイル

サーバー・サイドJavaクラスを公開すると、JPublisherでいくつかのJavaクラスとPL/SQLスクリプトが生成されます。その一部を次に示します。

- Callin2JPub.java
これはCallin2.java用のサーバー・サイドJavaラッパー・クラスです。

- Callin2Client.java
これはクライアント・サイドJavaクラスです。

- plsql_wrapper.sql
これはサーバー・サイドJavaクラス用のPL/SQLラッパーです。

- plsql_dropper.sql
これは、PL/SQLラッパーを削除するためのPL/SQLスクリプトです。

JPublisherにより生成されるその他のファイルは、次のとおりです。

- TblNumber.java
int[]用に生成されるクライアント・サイド・ラッパー。

- TblTblNumber.java
int[]用に生成されるクライアント・サイド・ラッパー。

- ObjCallin2bean.java
サーバー・サイド・クラスCallin2Bean用に生成されるクライアント・サイド・ラッパー。

- ObjCallin2beanRef.java
サーバー・サイド・クラスCallin2Bean用に生成され、表内でREF列として使用されるクライアント・サイド・ラッパー。このファイルは生成されますが、コールインの使用例では使用されません。

- TblObjCallin2bean.java
Callin2Bean[]用に生成されるクライアント・サイド・ラッパー。

- TblTblObjCalli.java
Callin2Bean[][]用に生成されるクライアント・サイド・ラッパー。

公開されたファイルのテスト

ファイルの公開後、公開されたクラスを次のコマンドを発行してテストできます。

% javac -classpath tmp:${CLASSPATH} -d tmp TestCallin2.java
% java -classpath tmp:${CLASSPATH} TestCallin2

B トラブルシューティング

この章では、JPublisherのトラブルシューティングのヒントについて説明します。内容は次のとおりです。

- Webサービス・クライアントを公開中のエラー

Webサービス・クライアントを公開中のエラー

-proxywsdlオプションを使用してWebサービス・クライアントを公開する際、次のいずれかのエラーが発生することがあります。

java.lang.Exception: Error compiling generated client proxy
Can't load library "jdk12/jre/lib/i386/libjava.so", because
jdk12/jre/lib/i386/libjava.so: symbol __libc_wait, version
GLIBC_2.0 not defined in file libc.so.6 with link time reference
Could not create the Java Virtual Machine.

または

% jpub -proxywsdl=...

Method getStackTrace() not found in class java.lang.Exception.
_e.setStackTrace(e.getStackTrace());
^
1 error

この問題は、環境で使用されているJava Development Kit(JDK)1.2が原因で発生します。このエラーを解決するには、JDK 1.4をPATH環境変数に含める必要があります。

索引
A  B  C  D  E  F  G  H  I  J  L  M  N  O  P  R  S  T  U  V  W

A

accessオプション, 6.1.8.1

adddefaulttypemapオプション, 6.1.7.1

addtypemapオプション, 6.1.7.2

アドバンスト・キュー 「AQ」を参照

AQ(アドバンスト・キュー)

Java出力, 1.5.2.7

公開, 2.3

ARRAYクラス, サポートされる機能, 5.4 AS句, 変換文, 6.2.2.1 属性の型, 使用できる, 3.1.5

B

下位互換性

互換モード, 4.3.1

関連オプション, 6.1.13

BigDecimalマッピング

対応するJava型, 6.1.6.3

概要, 1.4.2.3

builtintypesオプション, 6.1.6.1

C

caseオプション, 6.1.8.2

大/小文字区別のあるSQL UDT名, 6.1.4.7, 6.2.2.1

クラス, 拡張, 5.6.1

classpathオプション, 6.1.14.1

コード生成, Java

Javaインタフェースの生成, 5.5

非SQLJクラスの生成, 5.4

SQLJクラスの生成, 5.3

toString()メソッドの生成, 6.1.8.14

関連オプション, 6.1.8

オブジェクト・ラッパーのシリアライズ可能性, 6.1.8.13

継承のサポート, 5.7

出力パラメータの取扱い, 5.1

オーバーロードされたメソッドの取扱い, 5.2

コード生成, PL/SQL

ラッパー・スクリプト名と削除スクリプト名, 6.1.9.2

関連オプション, 6.1.9

ラッパー・ファンクションの生成の指定, 6.1.9.3

コレクション型

出力, 1.5.2.2

Javaでの表現方法, 1.4.1.1

コマンドライン・オプション 「オプション」を参照 コマンドライン構文, 1.6.2 互換性

下位, JPublisher, 4.3.1

Oracle8i互換モード, 4.3.5.3

Oracle9i互換モード, 4.3.5.2

compatibleオプション, 6.1.13.1 compileオプション, 6.1.10.1 コンパイラ, バージョンの指定, 6.1.14.2 compiler-executableオプション, 6.1.14.2 接続コンテキスト(SQLJ)

定義, 1.2.5.2

release()メソッド, 5.3.1

接続コンテキストおよびインスタンスの使用, 5.3.4

contextオプション, 6.1.5.1 規則, 表記, 6.1.3 変換ファンクション, PL/SQL

概要, 事前定義済の変換ファンクション, 1.4.1.3

PL/SQL型に使用, 3.2.3

ラッパー・ファンクションとの併用, 3.2.5

D

dオプション, 6.1.10.2

データ・リンク(URI型)のマッピング, 4.3.2

データ型マッピング

使用できるオブジェクト属性の型, 3.1.5

BigDecimalマッピング, 1.4.2.3

-builtintypesオプション, 6.1.6.1

-compatibleオプション, 6.1.13.1

データ・リンク, URI型, 4.3.2

索引付き表のサポート(概要), 3.2.4

JDBCマッピング, 1.4.2.1

マッピングに関するJPublisherの論理進行, 3.1.4

-lobtypesオプション, 6.1.6.2

マッピング・カテゴリ, 1.4.2

-mappingオプション(非推奨), 6.1.6.5

代替クラス(サブクラス)へのマッピング, 構文, 5.6.1.1

-numbertypesオプション, 6.1.6.3

Object JDBCマッピング, 1.4.2.2

Oracleマッピング, 1.4.2.4

概要, 3.1.1

PL/SQL変換ファンクション, 3.2.3

RECORD型のサポート, 3.2.4

REF CURSORと結果セット, 3.1.6

関連オプション, 6.1.6

JDBC OCIによるスカラーの索引付き表のサポート, 3.2.2

PL/SQL型の特殊サポート, 3.2

マッピングの表, 3.1.2

-usertypesオプション, 6.1.6.4

デフォルト(接続)コンテキスト(SQLJ), 1.2.5.2 デフォルトの型マップ, 3.1.3 defaulttypemapオプション, 6.1.7.3 dirオプション, 6.1.10.2

E

endpointオプション, 6.1.11.2

環境, JavaのCLASSPATH、コンパイラ、JVMのオプション, 6.1.14

実行コンテキスト(SQLJ), 1.2.5.2

JPublisherで生成されたクラスの拡張

Oracle8i JPublisherより後の変更点, 4.3.4

概念, 5.6.1

サブクラスの書式, 5.6.1.2

-gensubclassオプション, 6.1.8.8

概要, 5.6

F

出力のフィルタリング

パラメータ・モードに従った, 4.2.2, 6.1.8.4

パラメータの型に従った, 4.2.2, 6.1.8.5

ストアド・プロシージャまたはファンクションのサブセットの公開, 4.2.1, 6.1.4.7

JavaBeans仕様への準拠, 4.2.3, 6.1.8.6

filtermodesオプション, 6.1.8.4 filtertypesオプション, 6.1.8.5

G

GENERATE句, 変換文, 6.2.2.1

generatebeanオプション, 6.1.8.6

生成 「コード生成」を参照

genpatternオプション, 6.1.8.7

gensubclassオプション, 6.1.8.8

getConnection()メソッド, 5.3.4

getConnectionContext()メソッド, 5.3.4

H

ハンドル, インスタンス・メソッドをラップするためのハンドル・メカニズム, 2.6

ホルダー

出力パラメータ渡し, 5.1

ホルダー型の-outargumentsオプション, 6.1.8.11

JAX-RPCホルダーの使用, 5.1.2

httpproxyオプション, 6.1.11.3

I

iオプション(-input), 6.1.4.1

索引付き表のサポート

詳細, 汎用の索引付き表, 3.2.4

詳細, スカラーの索引付き表(JDBC OCI),3.2.2

サマリー, 汎用の索引付き表, 3.1.2

サマリー, スカラーの索引付き表(JDBC OCI), 3.1.2

継承, ORADataを通じたサポート, 5.7 INPUTファイル

-inputオプション, 6.1.4.1

パッケージ命名規則, 6.2.2.1

事前注意事項, 6.2.3

構造および構文, 6.2.2

構文, 6.1.4.7

変換文, 6.2.2.1

入力ファイル(概要)

-inputオプション(INPUTファイル), 6.1.4.1

概要, 1.5.1

プロパティ・ファイルとINPUTファイル, 6.2

-propsオプション(プロパティ・ファイル), 6.1.4.6

入力, JPublisher(概要), 1.5.1 出入力オプション, 6.1.10 インタフェース, 生成と使用, 5.5 イテレータ(SQLJ), 1.2.5.2

J

Java環境, CLASSPATH、コンパイラ、JVMのオプション, 6.1.14

javaオプション6.1.4.2

JavaBeans使用,準拠のためのオプション, 4.2.3, 6.1.8.6, 6.1.8.6

Java間の型マッピング

スタイル・ファイル用の-styleオプション, 6.1.6.6

スタイルとスタイル・ファイル, 3.3

Oracleスタイル・ファイルでのマッピングのサマリー, 3.3.3

JAX-RPCホルダー, 5.1.2 JDBCマッピング

対応するJava型, 3.1.2, 6.1.6.3

概要, 1.4.2.1

JVM, バージョンの指定, 6.1.14.3

L

JPublisherの制限事項, 1.2.7

lobtypesオプション, 6.1.6.2

M

mappingオプション(非推奨), 6.1.6.5

マッピング 「データ型マッピング」を参照

メソッドへのアクセス・オプション, 6.1.8.1

methodsオプション, 6.1.8.9

メソッド, オーバーロード,変換, 5.2

N

ネイティブJavaインタフェース, 2.4

ネストした表, 出力, 1.5.2.2

非SQLJクラス, 1.2.5.1, 5.4

表記規則, 6.1.3

numbertypesオプション, 6.1.6.3

O

Object JDBCマッピング

対応するJava型, 6.1.6.3

概要, 1.4.2.2

オブジェクト型

生成されるクラス, 5.3.3

継承, 5.7.1

出力, 1.5.2

公開(概要),2.1

Javaでの表現方法, 1.4.1.1

omit_schema_namesオプション, 6.1.8.10 オプション構文(コマンドライン), 1.6.2 オプション

-accessオプション, 6.1.8.1

-adddefaulttypemapオプション, 6.1.7.1

-addtypemapオプション, 6.1.7.2

-builtintypesオプション, 6.1.6.1

-caseオプション, 6.1.8.2

-classpathオプション, 6.1.14.1

コード生成, 6.1.8

-compatibleオプション, 6.1.13.1

-compileオプション, 6.1.10.1

-compiler-executableオプション, 6.1.14.2

-contextオプション, 6.1.5.1

-dオプション, 6.1.10.2

-defaulttypemapオプション, 6.1.7.3

-dirオプション, 6.1.10.2

-endpointオプション, 6.1.11.2

-filtermodesオプション, 6.1.8.4

-filtertypesオプション, 6.1.8.5

下位互換性, 6.1.13

SQLJ機能, 6.1.12

型マッピング, 6.1.6

型マップ, 6.1.7

一般的なヒント, 6.1.2

-generatebeanオプション, 6.1.8.6

-genpatternオプション, 6.1.8.7

-gensubclassオプション, 6.1.8.8

-httpproxyオプション, 6.1.11.3

-iオプション(-input), 6.1.4.1

-inputオプション, 6.1.4.1

出入力オプション, 6.1.10

-javaオプション, 6.1.4.2

-lobtypesオプション, 6.1.6.2

-mappingオプション(非推奨), 6.1.6.5

-methodsオプション, 6.1.8.9

-numbertypesオプション, 6.1.6.3

-omit_schema_namesオプション, 6.1.8.10

-outargumentsオプション, 6.1.8.11

-pオプション(-props), 6.1.4.6

-packageオプション, 6.1.8.12

-plsqlfileオプション, 6.1.9.2

-plsqlmapオプション, 6.1.9.3

-plsqlpackageオプション, 6.1.9.4

-propsオプション(プロパティ・ファイル), 6.1.4.6

-proxywsdlオプション, 6.1.11.1

-sオプション(-sql), 6.1.4.7

-serializableオプション, 6.1.8.13

-sqlオプション, 6.1.4.7

-sqljオプション, 6.1.12.1

-sqlstatementオプション, 6.1.4.8

-styleオプション, 6.1.6.6

サマリーおよび概要, 6.1

-sysuserオプション, 6.1.11.4

Webサービスのコールアウトを容易にする, 6.1.11

-tostringオプション, 6.1.8.14

-typemapオプション, 6.1.7.4

-typesオプション(非推奨), 6.1.4.9

-uオプション(-user), 6.1.5.5

-userオプション, 6.1.5.5

-usertypesオプション, 6.1.6.4

-vmオプション, 6.1.14.3

Oracleマッピング

対応するJava型, 3.1.2

概要, 1.4.2.4

Oracle8i互換モード, 4.3.5.3 Oracle9i互換モード, 4.3.5.2 ORADataインタフェース

オブジェクト型および継承, 5.7.1

参照型および継承, 5.7.2

使用, 1.4.1.1

-outargumentsオプション, 6.1.8.11 出力

-compileオプション, 6.1.10.1

-dオプション, 6.1.10.2

-dirオプション, 6.1.10.2

JPublisher出力のフィルタリング, 4.2

概要, JPublisherで生成される内容, 1.5.2

出力オプション, 6.1.10 出力パラメータ, 渡し

ホルダー, 5.1

概要, 5.1

配列の使用, 5.1.1

ファンクションの戻り値の使用, 5.1.3

JAX-RPCホルダーの使用, 5.1.2

オーバーロードされたメソッド, 変換, 5.2

P

pオプション(-props), 6.1.4.6

パッケージ, Java

INPUTファイルの命名規則, 6.2.2.1

-packageオプション, 6.1.8.12

パッケージ, PL/SQL

生成されるクラス, 5.3.2

パッケージ名のオプション, 6.1.9.4

公開(概要),2.2

PL/SQLパッケージを実行するためのパーミッション, 6.1.11.4 PL/SQL変換ファンクション 「変換ファンクション」, 「PL/SQL」を参照 PL/SQLデータ型, 特殊サポート, 3.2 PL/SQLパッケージ 「パッケージ」, 「PL/SQL」を参照 PL/SQLサブプログラム, トップレベルの変換, 6.1.4.7 PL/SQLラッパー, 2.6 PL/SQLラッパー・ファンクション 「ラッパー・ファンクション」, 「PL/SQL」を参照 plsqlfileオプション, 6.1.9.2 plsqlmapオプション, 6.1.9.3 plsqlpackageオプション, 6.1.9.4 プロパティ・ファイル

概要, 1.5.1

構造および構文, 6.2.1

-propsオプション(プロパティ・ファイル), 6.1.4.6 プロキシ, データベースからのWebサービスのコールアウト, 4.1.2, 6.1.11 proxywsdlオプション, 6.1.11.1 公開

AQ, 2.3

PL/SQLパッケージ, 2.2

キュー, 2.3.1

サーバー・サイドJavaクラス, 2.4

SQLオブジェクト型, 2.1

ストリーム, 2.3.3

トピック, 2.3.2

R

RECORD型のサポート

詳細, 3.2.4

サマリー, 3.1.2

REF CURSORのマッピング, 3.1.6 参照型

継承, 5.7.2

Javaでの表現方法, 1.4.1.1

強い型指定, 1.4.1.2

release()メソッド(接続コンテキスト), 5.3.1 JPublisherの要件

一般要件, 1.2.2

結果セットのマッピング, 3.1.6

S

sオプション(-sql), 6.1.4.7

サンプル・コード

SQL文用に生成されるコード, A.1

変換の例, 1.6.3 スカラー型のPL/SQL索引付き表, 3.2.2 スキーマ名, -omit_schema_namesオプション, 6.1.8.10 serializableオプション, 6.1.8.13 サーバー・サイドJavaクラス, 公開, 2.4 setConnectionContext()メソッド, 5.3.4 setContextFrom()メソッド, 5.3.5 setFrom()メソッド, 5.3.5 setValueFrom()メソッド, 5.3.5 シングルトン, インスタンス・メソッドをラップするためのシングルトン・メカニズム, 2.6 SQL name句, 変換文, 6.2.2.1 sqlオプション, 6.1.4.7 SQL問合せまたはDML文

生成されるコードの例, A.1

SQLDataインタフェース

オブジェクト型および継承, 5.7.3

使用, 1.4.1.1

SQLJ

接続コンテキスト, 1.2.5.2

接続コンテキストおよびインスタンス, 使用, 5.3.4

デフォルト(接続)コンテキスト, 1.2.5.2

実行コンテキスト, 1.2.5.2

SQLJクラスの生成, 5.3

イテレータ, 1.2.5.2

JPublisherの下位互換性モードと.sqljファイル, 1.2.5.3

SQLJ機能にアクセスするためのJPublisher -sqljオプション, 6.1.12

移行オプション, 6.1.15

JPublisherによるSQLJ使用の概要, 1.2.5.1

SQLJクラス, 非SQLJクラス, 1.2.5.1

sqljオプション, 6.1.12.1 sqljutl.jar, 1.2.4 sqlstatementオプション, 6.1.4.8 強い型指定の方法, 1.1 強い型指定を持つオブジェクト参照, 1.4.1.2 styleオプション, 6.1.6.6 スタイルとスタイル・ファイル

ファイル形式, 3.3.2

概要, 3.3

指定と位置, 3.3.1

-styleオプション, 6.1.6.6

JPublisherで生成されたクラスのサブクラス化 「拡張」を参照 構文, コマンドライン, 1.6.2 sysuserオプション, 6.1.11.4

T

テーブル・ファンクション(Webサービス用)

Webサービスのデータを表形式で戻すように設定, 6.1.4.5

TABLE型 「索引付き表」を参照 toplevelキーワード(-sqlオプション), 6.1.4.7 tostringオプション, 6.1.8.14 TRANSLATE...AS句, 変換文, 6.2.2.1 変換

変換対象のオブジェクト/パッケージの宣言, 6.1.4.7

変換対象のサーバー・サイド・クラスの宣言, 6.1.4.2

変換対象のSQL文の宣言, 6.1.4.8

変換文

INPUTファイル, 6.2.2.1

文の例, 6.2.2.2

型マッピング 「データ型マッピング」を参照 型マップ

デフォルトの型マップへの追加, 6.1.7.1

ユーザー型マップへの追加, 6.1.7.2

デフォルトの型マップ, 3.1.3

デフォルトの型マップのオプション, 6.1.7.3

関連オプション, 6.1.7

ユーザー型マップの置換, 6.1.7.4

ユーザー型マップ, 3.1.3

typemapオプション, 6.1.7.4 typesオプション(非推奨), 6.1.4.9

U

uオプション(-user), 6.1.5.5

URI型のマッピング, 4.3.2

userオプション, 6.1.5.5

ユーザー型マップ, 3.1.3

usertypesオプション, 6.1.6.4

V

vmオプション, 6.1.14.3

W

Webサービス

データベースからのコールアウトのオプション,6.1.11

JPublisherによるサポートの概要, 4.1

データベースへのコールインのサポート, 4.1.1

データベースからのコールアウトのサポート, 4.1.2

Webサービスのコールアウト, 2.8 ラッパー・ファンクション,PL/SQL

概要, 3.2.3

生成を指定するオプション, 6.1.9.3

PL/SQL型に使用, 3.2.5

ラッパー・メソッド

-methodsオプション, 6.1.8.9

ストアド・プロシージャのコール, 1.1

ラッパー・パッケージ, PL/SQL 「パッケージ」, 「PL/SQL」を参照 ラッパー・プロシージャ, PL/SQLからJavaをコール, 6.1.4.5

Oracleの法律上の注意点

コピーライト

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

Pre-General Availability (一般提供前)版のドキュメントについて

このドキュメントがPre-General Availability (一般提供前)版の場合:

このドキュメントはPre-General Availability (一般提供前)版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のPre-General Availability (一般提供前)版のドキュメントについて

このドキュメントが非公開のPre-General Availability (一般提供前)版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のPre-General Availability Trial Agreement (Pre-GAトライアル契約)のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle Partner Network Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティ

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。