Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
IBM Informix バージョン 3.50 IBM Informix JDBC ドライバ プログラマーズ ガイド SC88-4886-00 (英文原典:SC23-9421-00) IBM Informix バージョン 3.50 IBM Informix JDBC ドライバ プログラマーズ ガイド SC88-4886-00 (英文原典:SC23-9421-00) お願い: 本書および本書で紹介する製品をご使用になる前に、 273 ページの『特記事項』に記載されている情報をお読みください。 本書には、IBM の専有情報が含まれています。その情報は、使用許諾条件に基づき提供され、著作権により保護され ています。本書に記載される情報には、いかなる製品の保証も含まれていません。また、本書で提供されるいかなる 記述も、製品保証として解釈すべきではありません。 IBM は、お客様が提供するいかなる情報も、お客様に対してなんら義務も負うことのない、自ら適切と信ずる方法 で、使用もしくは配布することができるものとします。 お客様の環境によっては、資料中の円記号がバックスラッシュと表示されたり、バックスラッシュが円記号と表示さ れたりする場合があります。 原典: GC23–9421–00 IBM Informix Version 3.50 IBM Informix JDBC Driver Programmer's Guide 発行: 日本アイ・ビー・エム株式会社 担当: ナショナル・ランゲージ・サポート 第1刷 2008.6 © Copyright International Business Machines Corporation 1996, 2008. All rights reserved. 目次 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix IBM Informix Java マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x JDBC の補足資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x 記載されていない資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 対象ユーザ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii ソフトウェア要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii JDBC 3.00 仕様準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii ロケールに関する前提事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii IBM Informix JDBC ドライバ バージョン 3.50 の新機能 . . . . . . . . . . . . . . . . . . . . xiv 表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 文字の表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 機能、製品、およびプラットフォームのマークアップ . . . . . . . . . . . . . . . . . . . . xv コード例の表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv 関連マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 業界標準への準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 構文ダイアグラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi コマンド行構文ダイアグラムの読み方 . . . . . . . . . . . . . . . . . . . . . . . . . xvii キーワードおよび区切り文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix 識別子と名前 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix マニュアルに関するフィードバックの送付方法 . . . . . . . . . . . . . . . . . . . . . . . xix 第 1 章 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 本章について . . . . . . . . . . . . . . . . . . . . . . . . . JDBC とは . . . . . . . . . . . . . . . . . . . . . . . . . . JDBC ドライバとは . . . . . . . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバの概要 . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバに実装されているクラス . . . . . . . . . . IBM Informix JDBC ドライバのファイル . . . . . . . . . . . . . . . クライアント サイドとサーバ サイドの JDBC ドライバ . . . . . . . . . JDBC ドライバの入手 . . . . . . . . . . . . . . . . . . . . . . JDBC ドライバのインストール . . . . . . . . . . . . . . . . . . . グラフィカル モードまたはコンソール モードでの JDBC ドライバのインストール Informix JDBC ドライバをサイレント モードでインストールする . . . . . . インストール イベントのロギング . . . . . . . . . . . . . . . . . . ロギング例 . . . . . . . . . . . . . . . . . . . . . . . . アプリケーションでのドライバの使用 . . . . . . . . . . . . . . . . アプレットでのドライバの使用 . . . . . . . . . . . . . . . . . . . JDBC ドライバのアンインストール . . . . . . . . . . . . . . . . . グラフィカル モードまたはコンソール モードでのアンインストール . . . . . サイレント モードでのアンインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . 1 . 2 . 3 . 3 . 5 . 7 . 8 . 8 . 8 . 9 . 9 . 10 . 10 . 11 . 12 . 13 . 13 第 2 章 データベースへの接続 . . . . . . . . . . . . . . . . . . . . . . . . . . 15 本章について . . . . . . . . . . . . . . . IBM Informix JDBC ドライバのロード . . . . . . DataSource オブジェクトの使用. . . . . . . . . DriverManager.getConnection() メソッドの使用 . . . . データベース URL のフォーマット . . . . . . データベース接続とデータベース サーバ接続の比較. © Copyright IBM Corp. 1996, 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 16 17 20 21 24 iii プロパティの指定 . . . . . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバ での Informix 環境変数の使用 . . . . . . . . Informix sqlhosts ファイルの動的読取り . . . . . . . . . . . . . . . 接続プロパティ構文 . . . . . . . . . . . . . . . . . . . . 管理要件 . . . . . . . . . . . . . . . . . . . . . . . . LDAP サーバを sqlhosts のデータで更新するためのユーティリティ . . . . 高可用性データ レプリケーションの使用 . . . . . . . . . . . . . . 副サーバ接続プロパティ . . . . . . . . . . . . . . . . . . . HDR ペアでのグループ記入項目への接続 . . . . . . . . . . . . . 読取り専用状態の検査 . . . . . . . . . . . . . . . . . . . . 接続の再試行 . . . . . . . . . . . . . . . . . . . . . . . HTTP プロキシ サーバの使用 . . . . . . . . . . . . . . . . . . プロキシ サーバを使用するための環境構成. . . . . . . . . . . . . LDAP サーバとプロキシの併用 . . . . . . . . . . . . . . . . . sqlhosts ファイル ルックアップの指定 . . . . . . . . . . . . . . その他の多層ソリューションの使用 . . . . . . . . . . . . . . . . 暗号化オプション . . . . . . . . . . . . . . . . . . . . . . Sun JCE セキュリティ パッケージの使用 . . . . . . . . . . . . . IBM FIPS 準拠のセキュリティ パッケージの使用 . . . . . . . . . . パスワード暗号化の使用 . . . . . . . . . . . . . . . . . . . ネットワーク暗号化の使用 . . . . . . . . . . . . . . . . . . Informix JDBC ドライバ でのシングル サインオン アクセス コントロールの使用 PAM 認証方法 . . . . . . . . . . . . . . . . . . . . . . . JDBC での PAM の使用 . . . . . . . . . . . . . . . . . . . 接続のクローズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 26 33 33 35 35 36 37 37 38 38 39 40 42 44 44 44 45 45 46 46 49 49 51 52 第 3 章 データベース操作の実行 . . . . . . . . . . . . . . . . . . . . . . . . . 53 本章について . . . . . . . . . . . . . . . . . . . データベースの問合せ . . . . . . . . . . . . . . . . Informix データベースへの問合せ送信の例 . . . . . . . . 結果セットの使用 . . . . . . . . . . . . . . . . リソースの割当て解除 . . . . . . . . . . . . . . . 複数のスレッドでの実行 . . . . . . . . . . . . . . スクロール カーソルの使用 . . . . . . . . . . . . . HOLD カーソルの使用 . . . . . . . . . . . . . . データベースの更新 . . . . . . . . . . . . . . . . バッチ更新の実行 . . . . . . . . . . . . . . . . バルク挿入の実行 . . . . . . . . . . . . . . . . パラメータ、エスケープ構文、およびサポートされていないメソッド CallableStatement OUT パラメータの使用 . . . . . . . . CallableStatement での名前付きパラメータ . . . . . . . . DESCRIBE INPUT の JDBC サポート . . . . . . . . . エスケープ構文の使用 . . . . . . . . . . . . . . . サポートされないメソッドおよび動作が異なるメソッド . . . トランザクションの処理 . . . . . . . . . . . . . . . エラーの処理 . . . . . . . . . . . . . . . . . . . SQLException クラスを使用したエラーの処理 . . . . . . . 構文エラー オフセットの抽出 . . . . . . . . . . . . com.informix.jdbc.Message クラスを使用したエラー処理 . . . . データベース メタデータへのアクセス . . . . . . . . . . JDBC API に対するその他の Informix 拡張機能 . . . . . . . 自動解放機能の使用 . . . . . . . . . . . . . . . ドライバのバージョン情報の取得 . . . . . . . . . . . XML 文書の格納と抽出 . . . . . . . . . . . . . . . XML メソッドを使用するための環境設定 . . . . . . . . データの挿入 . . . . . . . . . . . . . . . . . . iv IBM Informix JDBC ドライバ プログラマーズ ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 54 54 55 56 56 56 58 58 58 59 59 60 66 70 71 72 75 76 76 77 77 77 79 79 80 80 81 82 データの抽出 . . データ挿入の例 . データ抽出の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 . 84 . 85 第 4 章 Informix データ型に関する作業 . . . . . . . . . . . . . . . . . . . . . . 89 本章について . . . . . . . . . . . . . . . . . . . . ディスティンクト (DISTINCT) 型 . . . . . . . . . . . . . データ挿入の例 . . . . . . . . . . . . . . . . . . データ抽出の例 . . . . . . . . . . . . . . . . . . サポートされないメソッド . . . . . . . . . . . . . . バイト (BYTE) 型とテキスト (TEXT) 型 . . . . . . . . . . ラージ オブジェクトのキャッシュ. . . . . . . . . . . . 例: データの挿入または更新 . . . . . . . . . . . . . . 例: データの選択 . . . . . . . . . . . . . . . . . シリアル (SERIAL) 型と SERIAL8 型 . . . . . . . . . . . 大桁整数 (BIGINT) 型と BIGSERIAL 型 . . . . . . . . . . 時間隔 (INTERVAL) 型 . . . . . . . . . . . . . . . . Interval クラス . . . . . . . . . . . . . . . . . . IntervalYM クラス . . . . . . . . . . . . . . . . . IntervalDF クラス . . . . . . . . . . . . . . . . . 時間隔の例 . . . . . . . . . . . . . . . . . . . コレクションと配列 . . . . . . . . . . . . . . . . . コレクションの例 . . . . . . . . . . . . . . . . . 配列の例 . . . . . . . . . . . . . . . . . . . . 名前付き行と名前なし行. . . . . . . . . . . . . . . . 時間隔とコレクションのサポート. . . . . . . . . . . . サポートされないメソッド . . . . . . . . . . . . . . SQLData インターフェイスの使用 . . . . . . . . . . . Struct インターフェイスの使用 . . . . . . . . . . . . ClassGenerator ユーティリティの使用 . . . . . . . . . . 型情報のキャッシュ . . . . . . . . . . . . . . . . . スマート ラージ オブジェクト データ型 . . . . . . . . . . データベース サーバ内のスマート ラージ オブジェクト . . . . クライアント アプリケーション内のスマート ラージ オブジェクト スマート ラージ オブジェクトに対する操作の実行. . . . . . 格納特性に関する作業 . . . . . . . . . . . . . . . 状態特性に関する作業 . . . . . . . . . . . . . . . ロックに関する作業 . . . . . . . . . . . . . . . . ラージ オブジェクトのキャッシュ . . . . . . . . . . . スマート ラージ オブジェクトの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 . 90 . 90 . 92 . 92 . 93 . 93 . 93 . 95 . 96 . 97 . 98 . 98 . 99 . 101 . 103 . 103 . 104 . 106 . 107 . 108 . 108 . 108 . 112 . 116 . 118 . 118 . 120 . 121 . 127 . 133 . 142 . 143 . 146 . 146 第 5 章 不透明 (OPAQUE) 型に関する作業 . . . . . . . . . . . . . . . . . . . . 149 本章について . . . . . . . . . . . IfmxUDTSQLInput インターフェイスの使用 . データの読込み. . . . . . . . . . データ ストリーム内での位置決め . . . データ属性の設定または取得 . . . . . IfmxUDTSQLOutput インターフェイスの使用 . 不透明 (OPAQUE) 型のマッピング . . . . 型情報のキャッシュ . . . . . . . . . サポートされないメソッド . . . . . . . 不透明 (OPAQUE) 型と UDR の作成 . . . 不透明 (OPAQUE) 型と UDR の作成の概要 不透明 (OPAQUE) 型と UDR の作成の準備 不透明 (OPAQUE) 型の作成手順 . . . . UDR の作成手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 151 151 151 152 152 152 153 153 154 154 155 156 158 目次 v Java クラスに対する要件 . . . . . . . . . . . . . . . SQL 名 . . . . . . . . . . . . . . . . . . . . . 不透明 (OPAQUE) 型の特性の指定 . . . . . . . . . . . . JAR ファイルとクラス ファイルの作成 . . . . . . . . . . データベース サーバへのクラス定義の送信 . . . . . . . . . 既存のコードからの不透明 (OPAQUE) 型の作成. . . . . . . . 不透明 (OPAQUE) 型と JAR ファイルの除去 . . . . . . . . UDR の作成 . . . . . . . . . . . . . . . . . . . . UDR と JAR ファイルの除去 . . . . . . . . . . . . . . 不透明 (OPAQUE) 型と UDR に関する情報の取得 . . . . . . . トランザクションでの実行 . . . . . . . . . . . . . . . 例 . . . . . . . . . . . . . . . . . . . . . . . . クラス定義 . . . . . . . . . . . . . . . . . . . . データの挿入 . . . . . . . . . . . . . . . . . . . データの抽出 . . . . . . . . . . . . . . . . . . . 不透明 (OPAQUE) 型内のスマート ラージ オブジェクトの使用 . . UDTManager を使用した、既存の Java クラスからの不透明 (OPAQUE) 既存の Java クラスを使用しない不透明 (OPAQUE) 型の作成 . . . UDRManager を使用した UDR の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 型の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 160 161 164 165 166 168 168 169 170 172 172 173 174 174 175 177 184 187 第 6 章 国際化対応と日付書式 . . . . . . . . . . . . . . . . . . . . . . . . . 189 本章について . . . . . . . . . . . . . . . . . . JDK と国際化のサポート . . . . . . . . . . . . . . IBM Informix GLS 変数のサポート . . . . . . . . . . . 日付 (DATE) 型エンド ユーザ フォーマットのサポート . . . . GL_DATE 変数. . . . . . . . . . . . . . . . . DBDATE 変数 . . . . . . . . . . . . . . . . . DBCENTURY 変数 . . . . . . . . . . . . . . . エンド ユーザ フォーマットの優先順位ルール . . . . . . . コード セット変換のサポート . . . . . . . . . . . . . Unicode からデータベース コード セットへ . . . . . . . Unicode からクライアント コード セットへ . . . . . . . 非 ASCII 文字を含むデータベースへの接続 . . . . . . . テキスト (TEXT) 型および CLOB 型に対するコード セット変換 BLOB 型およびバイト (BYTE) 型に対するコード セット変換 . ユーザ定義のロケール . . . . . . . . . . . . . . . NEWLOCALE および NEWCODESET 環境変数を使用した接続 NEWNLSMAP 環境変数を使用した接続 . . . . . . . . ローカライズされたエラー メッセージのサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 190 191 192 192 194 196 197 198 198 200 200 201 203 204 204 204 205 第 7 章 調整およびトラブルシューティング . . . . . . . . . . . . . . . . . . . . 207 本章について . . . . . . . . . . . JDBC API プログラムのデバッグ. . . . . パフォーマンスの管理 . . . . . . . . FET_BUF_SIZE および BIG_FET_BUF_SIZE ラージ オブジェクトのメモリ管理 . . . ネットワーク トラフィックの削減 . . . バルク挿入の使用 . . . . . . . . . 接続プールの使用 . . . . . . . . . . . . . . . . . . . . . 環境変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 207 207 208 208 210 211 211 付録 A. サンプル コード ファイル. . . . . . . . . . . . . . . . . . . . . . . . 217 使用可能な例の概要 . . . . demo ディレクトリ内の例 . tools ディレクトリ内の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 . 217 . 225 付録 B. DataSource 拡張機能 . . . . . . . . . . . . . . . . . . . . . . . . . 227 vi IBM Informix JDBC ドライバ プログラマーズ ガイド プロパティの読取りと書込み . . . . . . . 標準プロパティの取得と設定 . . . . . . . Informix 接続プロパティの取得と設定 . . . . 接続プール DataSource プロパティの取得と設定. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 228 229 232 付録 C. データ型のマッピング . . . . . . . . . . . . . . . . . . . . . . . . . 233 Informix データ型と JDBC データ型との間のデータ型マッピング . . . . 拡張データ型と、Java および JDBC のデータ型間のデータ型マッピング C 不透明 (OPAQUE) 型と Java との間のデータ型マッピング . . . . PreparedStatement.setXXX() 拡張機能に対するデータ型マッピング . . . . マッピング拡張機能の使用 . . . . . . . . . . . . . . . . IfxTypes クラスの使用 . . . . . . . . . . . . . . . . . 拡張の概要 . . . . . . . . . . . . . . . . . . . . . ResultSet.getXXX() メソッドに対するデータ型マッピング . . . . . . . UDT Manager と UDR Manager に対するデータ型マッピング . . . . . キャストに対するマッピング . . . . . . . . . . . . . . . フィールド型に対するマッピング. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 234 236 237 237 241 243 245 248 249 250 付録 D. アクセシビリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 IBM Informix Dynamic Server のアクセシビリティ機能 アクセシビリティ機能 . . . . . . . . . . キーボード ナビゲーション . . . . . . . . アクセシビリティ関連情報 . . . . . . . . . IBM のアクセシビリティに対する取組み . . . . 小数点付き 10 進数構文ダイアグラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 253 253 253 253 254 エラー メッセージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 特記事項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 商標 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 目次 vii viii IBM Informix JDBC ドライバ プログラマーズ ガイド はじめに はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix IBM Informix Java マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x JDBC の補足資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x 記載されていない資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 対象ユーザ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii ソフトウェア要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii JDBC 3.00 仕様準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii ロケールに関する前提事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii IBM Informix JDBC ドライバ バージョン 3.50 の新機能 . . . . . . . . . . . . . . . . . . . . xiv 表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 文字の表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 機能、製品、およびプラットフォームのマークアップ . . . . . . . . . . . . . . . . . . . . xv コード例の表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv 関連マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 業界標準への準拠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 構文ダイアグラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi コマンド行構文ダイアグラムの読み方 . . . . . . . . . . . . . . . . . . . . . . . . . xvii キーワードおよび区切り文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix 識別子と名前 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix マニュアルに関するフィードバックの送付方法 . . . . . . . . . . . . . . . . . . . . . . . xix はじめに この序に含まれる内容は以下のとおりです。 v IBM Informix JavaTM のマニュアルの概要 v 本書で使用する表記規則の説明 v 新機能のリスト IBM Informix Java マニュアル 次の表に、一般的な Java™ プログラミング タスク、および参照すべき資料を示し ます。 実行内容 参照資料 Java アプリケーションを実行するために環境をセットアップする JDK をインストールする J/Foundation 開発者ガイド Sun Microsystems Web サイトにも資料があります。 Java 対応サーバをインストールす る J/Foundation 開発者ガイド 環境を構成する J/Foundation 開発者ガイド JDBC クライアントをインストー ルする IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) © Copyright IBM Corp. 1996, 2008 ix 実行内容 参照資料 異なるコンピュータ上のクライア IBM Informix Dynamic Server 管理者ガイド ントがデータベース サーバと通信 できることを確認する (接続性) 基本的なデータベース操作を実行する クライアントから (JDBC API を 使用) IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) クライアントから (埋込み SQL を使用) IBM Informix 埋込み SQLJ ユーザーズ ガイド データベース サーバで (JDBC と SQL を使用) J/Foundation 開発者ガイド 不透明 (OPAQUE) 型およびディスティンクト (DISTINCT) 型を作成する 概念を理解する IBM Informix ユーザ定義ルーチンおよびデータ タイプ 開発者ガイド クライアント JDBC ドライバを使 IBM Informix JDBC ドライバ プログラマーズ ガイド 用して作成する (本書) サーバ JDBC ドライバとクライアント JDBC ド ライバ間の相違点については、「J/Foundation 開発者ガ イド」の JDBC ドライバに関する章を参照してくださ い。 データベース サーバで作成する (組込みサーバ JDBC ドライバを 使用) IBM Informix DataBlade 開発者キット ユーザーズ ガイ ド J/Foundation 開発者ガイド スマート ラージ オブジェクトを 操作する IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) XML 文書の格納と抽出を行う IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) 国際化対応のために IBM Informix GLS を使用する IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) サーバ JDBC ドライバとクライアント JDBC ドライバ の相違点については、「J/Foundation 開発者ガイド」 Java アプリケーションをデバッグ IBM Informix JDBC ドライバ プログラマーズ ガイド (本書) する 本書について このガイドでは、IBM Informix JDBC ドライバをインストール、ロード、および使 用し、Java アプリケーションまたはアプレット内から Informix データベースに接 続する方法を説明します。IBM Informix JDBC ドライバを使用して、サーバで実行 されるユーザ定義ルーチンを記述することもできます。 JDBC の補足資料 以下のセクションでは、本書の情報を補足するオンライン ファイルについて説明し ます。データベース サーバの使用を開始する前に、これらのファイルを参照してく ださい。 v リリース ノート: jdbcrel.htm リリース ノートでは、ご使用のコンピュータに IBM Informix JDBC ドライバ を構成して使用するために必要な、特別な操作に x IBM Informix JDBC ドライバ プログラマーズ ガイド ついて説明しています。さらに、このファイルには、資料の訂正についておよび 既知の問題とその予備手段についての情報が含まれています。 v Javadoc ページ インストール後、これらのファイルは以下のディレクトリにあります。 UNIX のみ v $JDBCLOCATION/doc/release。$JDBCLOCATION は IBM Informix JDBC ドラ イバをインストールしたディレクトリを指します。 UNIX のみ の終り Windows のみ v %JDBCLOCATION%¥doc¥release。%JDBCLOCATION% は IBM Informix JDBC ドライバをインストールしたディレクトリを指します。 Windows のみ の終り アプリケーションおよびパフォーマンス上の問題に関する重要な情報が含まれてい るため、これらのファイルを参照してください。 javadoc ページは、Informix 拡張クラス、インターフェイス、およびメソッドについ て、詳細に説明しています。 UNIX のみ Javadoc ページは $JDBCLOCATION/doc/javadoc にあります。$JDBCLOCATION は IBM Informix JDBC ドライバをインストールしたディレクトリを指します。 UNIX のみ の終り Windows のみ Javadoc ページは %JDBCLOCATION%¥doc¥javadoc にあります。 %JDBCLOCATION% は IBM Informix JDBC ドライバをインストールしたディレ クトリを指します。 Windows のみ の終り JDBC API の詳細については、Sun Microsystems のサイトにアクセスしてくださ い。 記載されていない資料 本書では、IBM Informix マニュアル セットの他の資料に記載された新機能に関す る情報は繰り返し記載しませんが、JDBC ドライバ固有の情報については記載し、 その他の機能を詳細に記述している資料を参照します。 はじめに xi さらに、本書では、IDS および XPS サーバに実装されており、JDBC により暗黙 的にサポートされている SQL 機能については説明しません。 本書では、JDBC API のすべてのインターフェイス、クラス、およびメソッドにつ いて説明しているわけではありません。また、JDBC API を使用して Informix® デ ータベースに接続する Java アプリケーションを記述する方法について、詳細には説 明していません。本書内の例は、IBM Informix JDBC ドライバを使用する方法を示 すのに十分な情報を提供していますが、JDBC API の広範な説明は提供していませ ん。 JDBC API の詳細については、Sun Microsystems の Web サイト (http://java.sun.com/) にアクセスしてください。 本書では JDBC に対する Informix 拡張セットを、タスク指向の形式で説明しま す。インターフェイスのすべてのメソッドやパラメータが含まれているわけではあ りません。すべてのメソッドとパラメータを含む、完全な参考資料については、オ ンライン javadoc を参照してください。これは IBM Informix JDBC ドライバをイ ンストールした場所の doc/javadoc ディレクトリにあります。 本書では、IBM Informix JDBC ドライバのサーバ サイド バージョンに固有のイン ターフェイスと制限については説明しません。この情報は「J/Foundation 開発者ガ イド」に記載されています。詳しくは、7 ページの『クライアント サイドとサーバ サイドの JDBC ドライバ』を参照してください。 対象ユーザ 本書は、JDBC API を使用して、IBM Informix JDBC ドライバを使用した Informix データベースへの接続を行う Java プログラマを対象にしています。 本書を使用す るには、Java でのプログラム方法を理解し、特に JDBC API のクラスとメソッド について理解している必要があります。 ソフトウェア要件 IBM Informix JDBC ドライバを使用して Informix データベースに接続するには、 以下の Informix データベース サーバのいずれかを使用する必要があります。 v IBM Informix Dynamic Server (IDS)、バージョン 7.x v IBM Informix Dynamic Server, Workgroup and Developer Editions、バージョン 7.x v IBM Informix Dynamic Server with Advanced Decision Support and Extended Parallel Options、バージョン 8.x v IBM Informix Extended Parallel Server、バージョン 8.3 以降 v Informix Dynamic Server、バージョン 9.2x 以降、バージョン 10.x またはバージ ョン 11.10、11.50 v IBM Informix OnLine Dynamic Server、バージョン 5.x v IBM Informix SE、バージョン 5.x および 7.2x また、Java Runtime Environment (JRE) バージョン 1.4 以降も使用する必要があり ます。 xii IBM Informix JDBC ドライバ プログラマーズ ガイド JDBC 3.00 仕様準拠 IBM Informix JDBC ドライバ バージョン 3.50 は Sun Microsystems JDBC 3.0 仕 様への準拠を目指しています。 Sun Microsystems JDBC 3.0 仕様により必要とされるほぼすべての機能について、 指定された動作が実行されます。Sun Microsystems JDBC 3.0 ドライバのオプショ ン機能については、その機能が IBM Informix Dynamic Server (IDS) バージョン 11.50 でサポートされていれば、Informix JDBC ドライバ バージョン 3.50 でサポ ートされています。 JDBC 3.0 仕様で提供される標準メソッドのうち次のようなメソッドについては、 IBM® InformixJDBC ドライバによってサポートされません。 v 複数結果セットの返却 v setSavepoint() メソッド v releaseSavepoint() メソッド v rollbackSavepoint() メソッド Sun Microsystems JDBC 3.0 仕様の詳細については、http://java.sun.com/ を参照して ください。 ロケールに関する前提事項 Informix 製品は、多くの言語、国/地域別情報、およびコード セットをサポートし ています。すべての文化的差異に基づいた情報は、GLS (広域言語サポート) ロケー ルと呼ばれる単一の環境にまとめられています。 本書に記載する例では、デフォルト ロケール en_us.8859-1 を使用することを前提 としています。このロケールでは、日付、時刻、および通貨について、米国英語形 式 (U.S. English) の規則をサポートします。さらにこのロケールでは、ASCII コー ド セットと、é、è、および ñ などの多くの 8 ビット文字を含む ISO 8859-1 コー ド セットをサポートします。 データまたは SQL 識別子でデフォルト以外の文字を使用する場合、または文字デ ータをデフォルト以外の規則で照合する場合は、適切な非デフォルト ロケールを指 定する必要があります。 デフォルト以外のロケールの指定方法、追加構文、および GLS ロケールに関する その他の考慮事項については、「IBM Informix GLS ユーザーズ ガイド」を参照し てください。 はじめに xiii IBM Informix JDBC ドライバ バージョン 3.50 の新機能 本リリースにおける新機能の完全なリストについては、「IBM Informix Dynamic Server 入門ガイド」を参照してください。以下に、本書に関連する変更点と拡張を 示します。 表 1. 「IBM Informix JDBC ドライバ プログラマーズ ガイド」の新着情報 概説 参照 接続 URL でのサービス名の使用に対するサ ポート sqlhosts ファイルまたは接続 URL で接続を 構成する際に、ポート番号の代わりに、 Informix データベース サーバのサービス名を 指定できるようになりました。 大桁整数 (BIGINT) 型と BIGSERIAL 型のサ ポート 21 ページの『データベース URL のフォーマ ット』 33 ページの『接続プロパティ構文』 97 ページの『大桁整数 (BIGINT) 型と BIGSERIAL 型』 これらのデータ型は INT8 型と SERIAL8 型 に似ていますが、パフォーマンス上の利点が あります。 シングル サインオン サポートの追加 DriverManager.getConnection() メソッドの使 用時に、JDBC でシングル サインオン (SSO) アクセス コントロールを使用できます。 49 ページの『Informix JDBC ドライバ での シングル サインオン アクセス コントロール の使用』 表記規則 本セクションでは、IBM Informix Dynamic Server の製品資料で使用されている、以 下の規則について説明します。 v 文字の表記規則 v 機能、製品、およびプラットフォームの規則 v 構文ダイアグラム v コマンド行の表記規則 v コード例の表記規則 文字の表記規則 本書では、新規用語の初出表記、画面表示の説明、コマンド構文の記述などにおい て以下の規則が適用されます。 xiv 規則 意味 KEYWORD SQL、SPL などのプログラミング言語のキーワードは、セリフ フォント の大文字で表記されます。 イタリック体 本文中では、新しい用語および強調語がイタリック体で表記されます。構 文とコードの例では、ユーザが指定する変数値は、イタリック体で表示さ れます。 IBM Informix JDBC ドライバ プログラマーズ ガイド 規則 意味 太文字 プログラム エンティティ (クラス、イベント、表など)、環境変数、ファ イル名、パス名、インターフェイス エレメント (アイコン、メニュー項 目、ボタンなど) は太字体で表記されます。 モノスペース 製品が表示する情報、およびユーザが入力する情報は、モノスペースで表 記されます。 KEYSTROKE ユーザが押すキーは、大文字のサンセリフ フォントで表記されます > この記号は、メニュー項目を表します。例えば、「ツール」>「オプショ ン」を選択する、という記述は、「ツール」メニューから「オプション」 項目を選択することを指します。 機能、製品、およびプラットフォームのマークアップ 機能、製品、およびプラットフォームのマークアップは、機能、製品、またはプラ ットフォームに固有な情報を表します。このマークアップの例を次に示します。 Dynamic Server IBM Informix Dynamic Server 固有の情報を示します。 Dynamic Server の終り Windows のみ Windows OS 固有の情報を示します。 Windows のみ の終り これらのマークアップは、セクション内の 1 つ以上のパラグラフに適用される場合 があります。セクション全体が特定の製品またはプラットフォームに適用する場合 は、次のように見出しテキストの一部として示します。 表ソート (Windows) コード例の表記規則 本書では、SQL コードの例が多く使用されています。特に明記されていない限り、 記載されるコードは、特定の IBM Informix アプリケーション開発ツール専用では ありません。 例の中に SQL 文のみがリストされる場合、これらの文は、セミコロン (;) で区切 られません。例えば、以下のようなコードの例が使用されます。 CONNECT TO stores_demo ... DELETE FROM customer WHERE customer_num = 121 ... COMMIT WORK DISCONNECT CURRENT はじめに xv この SQL コードを特定の製品で使用する場合、その製品の構文規則を適用する必 要があります。例えば DB-Access を使用する場合、文と文の間はセミコロン (;) で 区切る必要があります。SQL API を使用する場合、EXEC SQL を各文の最初に指 定し、文の最後にセミコロン (;)、または適切な区切り記号を指定する必要がありま す。 ヒント: コード例内の省略記号は、フル アプリケーションではそこにコードが追加 されることを示します。概念の説明には必要ないため、それらのコードは 省略されています。 特定のアプリケーション開発ツール、または SQL API で SQL 文を使用する方法 の詳細については、ご使用の製品に付属するマニュアルを参照してください。 関連マニュアル http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp にある IBM Informix Dynamic Server インフォメーション センターから、すべての製品マニュアルを表 示、検索、および印刷できます。 IBM Informix Dynamic Server および関連製品の、リリース ノート、マシン ノー ト、およびドキュメント ノートを含む関連マニュアルについては、 http://www-306.ibm.com/software/data/informix/pubs/library/ のオンライン製品ライブラ リ ページを参照してください。または、ご使用の製品に付属のクイック スタート CD から、製品マニュアルを利用またはインストールできます。 業界標準への準拠 米国規格協会 (ANSI) と国際標準化機構 (ISO) は、共同で構造化問合せ言語 (SQL) 用の一連の業界標準を確立しました。IBM Informix SQL ベースの製品は、 SQL-92 Entry Level (ANSI X3.135-1992 として公開、ISO 9075:1992 と同等) に完全準拠し ています。また、IBM Informix データベース サーバの多くの機能は、 SQL-92 Intermediate Level および Full Level、X/Open SQL Common Applications Environment (CAE) 標準に準拠しています。 構文ダイアグラム 本書で使用する構文ダイアグラムは、以下のコンポーネントで構成されます。この ダイアグラムは、システム レベルのコマンドを除くすべてのコマンドと、文の構文 を表します。 表 2. 構文ダイアグラム コンポーネント コンポーネントの PDF での表示 xvi コンポーネントの HTML での表示 意味 >>---------------------- 文の開始を示します。 -----------------------> 文が次行に続くことを示しま す。 >----------------------- 文が前行からの続きであるこ とを示します。 IBM Informix JDBC ドライバ プログラマーズ ガイド 表 2. 構文ダイアグラム コンポーネント (続き) コンポーネントの PDF での表示 コンポーネントの HTML での表示 意味 ----------------------->< 文の終端を示します。 --------SELECT---------- 必須項目です。 --+-----------------+--’------LOCAL------’ オプションの項目です。 ---+-----ALL-------+--+--DISTINCT-----+ ’---UNIQUE------’ 選択項目のある必須項目で す。項目を 1 つのみ指定する 必要があります。 ---+------------------+--+--FOR UPDATE-----+ ’--FOR READ ONLY--’ オプションの項目がメイン行 の下に選択肢で表示され、そ のいずれかを指定できます。 .---NEXT---------. ----+----------------+--+---PRIOR--------+ ’---PREVIOUS-----’ メイン行の下にある値はオプ ションで、そのいずれかを指 定できます。項目を指定しな い場合、行の上にある値がデ フォルトとして使用されま す。 .-------,-----------. V | ---+-----------------+--+---index_name---+ ’---table_name---’ オプションの項目です。複数 の項目を指定できます。各項 目はコンマで区切る必要があ ります。 >>-| Table Reference |->< 構文セグメントの参照です。 Table Reference 構文セグメントです。 |--+-----view--------+--| +------table------+ ’----synonym------’ コマンド行構文ダイアグラムの読み方 以下のコマンド行構文ダイアグラムでは、構文ダイアグラムの表にリストした要素 をいくつか使用しています。 No-Conversion ジョブの作成 onpladm create job job -n -d -p device -D database project はじめに xvii -t table (1) Setting the Run Mode -S server -T target 注: Z-1 ページを参照 1 このダイアグラムの 3 行目には、「Setting the Run Mode」という名前のセグメン トがあります。ダイアグラムの脚注に、このセグメントは Z-1 ページに記載されて いることが示されています。このセグメントは、実際のマニュアルの相互参照で は、付録 Z の最初のページ内にありますが、ここでは、次のセグメント ダイアグ ラムに示します。ダイアグラムで、セグメントの開始コンポーネントと終了コンポ ーネントが使用されていることに注意してください。 Setting the Run Mode: l c -f d p a u n N コマンドを正しく作成する方法を確認するには、メイン ダイアグラムの左上から開 始します。次に、ダイアグラムを右へ進み、必要な要素を入力します。このダイア グラムの要素は、ユーティリティ構文を表しているため、大文字と小文字が区別さ れます。SQL などのその他のタイプの構文では、大文字と小文字は区別されませ ん。 「No-Conversion ジョブの作成」ダイアグラムは、以下の手順を示しています。 1. onpladm create job を入力し、次にジョブ名を入力します。 2. オプションで -p と入力し、プロジェクト名を入力します。 3. 以下の必須要素を入力します。 v -n v -d およびデバイス名 v -D およびデータベース名 v -t および表名 4. オプションで、以下の中から 1 つ以上の要素を選択し、任意の回数まで繰り返 すことができます。 v -S およびサーバ名 v -T およびターゲット サーバ名 xviii IBM Informix JDBC ドライバ プログラマーズ ガイド v 実行モード。実行モードを設定するには、Setting the Run Mode セグメント ダイアグラムに従います。まず -f を入力し、次にオプションで d、p、また は a を入力し、最後にオプションで l または u を入力します。 5. 終端記号までダイアグラムを読み進めます。 キーワードおよび区切り文字 キーワードはシステム レベルのコマンドを除き、すべてのコマンドおよび文に予約 された単語です。構文ダイアグラム内のキーワードは、大文字で表記されます。コ マンド内のキーワードには、大文字と小文字の両方を使用できます。ただし、構文 ダイアグラム内のキーワードと完全に一致するスペルにしてください。 また、構文やコマンド内の区切り文字も、構文ダイアグラム内と一致するように使 用しなければなりません。 識別子と名前 変数は、構文ダイアグラムや例の中で、識別子や名前の代わりに使用されます。変 数はコンテキストによって、任意の名前、識別子、リテラルに置き換えられます。 また変数は、追加構文ダイアグラムで拡張される複合構文要素を表すためにも使用 されます。構文ダイアグラム、例、またはテキスト内で使用される変数は、小文字 のイタリック体 で表記されます。 次の構文ダイアグラムでは、変数を使用して、単純な SELECT 文の一般的な形を示 しています。 SELECT column_name FROM table_name この形の SELECT 文を作成する場合は、変数 column_name および table_name を 特定の列名と表名に置き換えます。 マニュアルに関するフィードバックの送付方法 IBM Informix ユーザ マニュアルに関するコメントは、以下のいずれかの方法でお 送りください。 v 次のアドレスへ電子メールを送信してください。[email protected] v インフォメーション センター (http://publib.boulder.ibm.com/infocenter/idshelp/v115/ index.jsp) にアクセスし、コメントを送信するトピックを開きます。ページの下部 にある「フィードバック (Feedback)」をクリックし、フォームに入力してフィー ドバックを送信してください。 いずれの方法によるフィードバックも、Dynamic Server のユーザ マニュアルの保守 担当者に送付されます。これらのフィードバック方法は、マニュアルの誤りや抜け をご報告いただくために用意されています。技術的な問題に関する即時のヘルプに ついては、IBM Technical Support へご連絡ください。説明については、IBM Informix テクニカル サポート Web サイト (http://www.ibm.com/planetwide/) を参照 してください。 はじめに xix xx IBM Informix JDBC ドライバ プログラマーズ ガイド 第 1 章 はじめに 本章について . . . . . . . . . . . . . . . . . . . . . . . . . JDBC とは . . . . . . . . . . . . . . . . . . . . . . . . . . JDBC ドライバとは . . . . . . . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバの概要 . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバに実装されているクラス . . . . . . . . . . Java インターフェイスを実装する Informix クラス . . . . . . . . . . Java 仕様を拡張する Informix クラス . . . . . . . . . . . . . . . Java 仕様を超えたサポートを提供する Informix クラス . . . . . . . . . JDK バージョン 1.4 以降での UDTManager および UDRManager クラスの使用 . IBM Informix JDBC ドライバのファイル . . . . . . . . . . . . . . . クライアント サイドとサーバ サイドの JDBC ドライバ . . . . . . . . . JDBC ドライバの入手 . . . . . . . . . . . . . . . . . . . . . . JDBC ドライバのインストール . . . . . . . . . . . . . . . . . . . グラフィカル モードまたはコンソール モードでの JDBC ドライバのインストール Informix JDBC ドライバをサイレント モードでインストールする . . . . . . インストール イベントのロギング . . . . . . . . . . . . . . . . . . ロギング例 . . . . . . . . . . . . . . . . . . . . . . . . アプリケーションでのドライバの使用 . . . . . . . . . . . . . . . . アプレットでのドライバの使用 . . . . . . . . . . . . . . . . . . . JDBC ドライバのアンインストール . . . . . . . . . . . . . . . . . グラフィカル モードまたはコンソール モードでのアンインストール . . . . . サイレント モードでのアンインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . 1 . 2 . 3 . 3 . 3 . 4 . 5 . 5 . 5 . 7 . 8 . 8 . 8 . 9 . 9 . 10 . 10 . 11 . 12 . 13 . 13 本章について この章では、IBM Informix JDBC ドライバおよび JDBC API の概要を説明しま す。以下のセクションが含まれます。 v JDBC とは v JDBC ドライバとは v IBM Informix JDBC ドライバの概要 v JDBC ドライバのインストール v アプリケーションでのドライバの使用 v アプレットでのドライバの使用 v JDBC ドライバのアンインストール JDBC とは Java Database Connectivity (JDBC) は、Java プログラムがデータベース管理システ ムに接続できるようにする標準アプリケーション プログラム インターフェイス (API) の JavaSoft 仕様です。 JDBC API は、Java プログラム言語で記述された一 連のインターフェイスとクラスで構成されています。 これらの標準インターフェイスとクラスを使用して、プログラマは、データベース への接続、SQL (構造化照会言語) で記述した問合せの送信、および結果の処理を行 うアプリケーションを記述できます。 © Copyright IBM Corp. 1996, 2008 1 JDBC は標準仕様であるため、JDBC API を使用する Java プログラムは、任意のデ ータベース管理システム (DBMS) に接続できます。ただし、その特定の DBMS に 対するドライバが存在する必要があります。 JDBC API の詳細については、Sun Microsystems の Web サイト (http://java.sun.com/) にアクセスしてください。 JDBC ドライバとは JDBC API は、プログラマがデータベースに接続して問合せを送信するために使用 する Java インターフェイスとクラスを定義しています。 JDBC ドライバは、特定 の DBMS ベンダ用に、これらのインターフェイスとクラスを実装しています。 JDBC API を使用する Java プログラムは、特定の DBMS 用の指定されたドライバ をロードしてから、実際にデータベースに接続します。 その後、JDBC DriverManager クラスは、すべての JDBC API 呼出しをロードされたドライバに送 信します。 JDBC ドライバには、次の 4 つのタイプがあります。 v JDBC-ODBC ブリッジと ODBC ドライバ (タイプ 1 ドライバとも呼ばれる) JDBC API 呼出しを Microsoft® ODBC 呼出しに変換します。この呼出しはその 後 ODBC ドライバに渡されます。 このタイプのドライバを使用するすべてのクライアント コンピュータに、ODBC バイナリ コードがロードされている必要があります。 ODBC は、Open Database Connectivity の頭字語です。 v ネイティブ API の部分的 Java ドライバ (タイプ 2 ドライバとも呼ばれる) JDBC API 呼出しを DBMS 固有のクライアント API 呼出しに変換します。 ブリッジ ドライバの場合と同様に、このタイプのドライバでは、各クライアント コンピュータにいくつかのバイナリ コードがロードされている必要があります。 v JDBC-Net のピュア Java ドライバ (タイプ 3 ドライバとも呼ばれる) JDBC API 呼出しをミドル層のサーバに送信します。このサーバは、呼出しを DBMS 固有のネットワーク プロトコルに変換します。 その後、変換された呼出しが、特定の DBMS に送信されます。 v ネイティブ プロトコルのピュア Java ドライバ (タイプ 4 ドライバとも呼ばれ る) JDBC API 呼出しを、ミドル層を使用せずに直接 DBMS 固有のネットワーク プ ロトコルに変換します。 これにより、クライアント アプリケーションは直接データベース サーバに接続 できます。 2 IBM Informix JDBC ドライバ プログラマーズ ガイド IBM Informix JDBC ドライバの概要 IBM Informix JDBC ドライバは、ネイティブ プロトコルのピュア Java ドライバ (タイプ 4) です。つまり、JDBC API を使用して Informix データベースに接続する Java プログラムで IBM Informix JDBC ドライバを使用すると、ユーザのセッショ ンは、ミドル層を経由せずに、直接データベースまたはデータベース サーバに接続 します。 IBM Informix JDBC ドライバに実装されているクラス DataSource オブジェクト、接続プール、および分散トランザクションをサポートす るために、IBM Informix JDBC ドライバには Sun Microsystems の JDBC 3.0 API に記述されているインターフェイスとクラスを実装するクラスが用意されていま す。 Java インターフェイスを実装する Informix クラス 次の表に、Java インターフェイスとクラス、およびそれらを実装している Informix クラスをリストします。 JDBC インターフェイス またはクラス Informix クラス java.io.Serializable com.informix.jdbcx.IfxCoreDataSource java.sql.Connection com.informix.jdbc.IfmxConnection javax.sql.ConnectionEventListener com.informix.jdbcx.IfxConnectionEventListener javax.sql.ConnectionPoolDataSource com.informix.jdbcx.IfxConnectionPoolDataSource javax.sql.DataSource com.informix.jdbcx.IfxDataSource javax.sql.PooledConnection com.informix.jdbcx.IfxPooledConnection javax.sql.XADataSource com.informix.jdbcx.IfxXADataSource java.sql.ParameterMetaData com.informix.jdbc.IfxParameterMetaData IBM Informix JDBC ドライバ バージョン 3.0 以降では、JDBC 3.0 仕様の ResultSet インターフェイスで定義された updateXXX() メソッドが実装されていま す。updateClob など、これらのメソッドは J2SDK 1.4.x API 以降で詳細に定義さ れており、ResultSet オブジェクトが更新可能であることを必要とします。 updateXXX メソッドは、行を Java の変数とオブジェクトを使用して更新できるよ うにし、追加の JDBC データ型を組み込むように拡張されています。 これらのメソッドはロケータで実装された JDBC データ型を更新し、ロケータで指 定されたデータは更新しません。 第 1 章 はじめに 3 Java 仕様を拡張する Informix クラス SQL 文およびデータ型の Informix 実装をサポートするために、IBM Informix JDBC ドライバは JDBC 3.0 API を拡張するクラスを提供しています。 次の表に、 拡張するためにアプリケーション プログラムで使用できる Java クラスおよび Informix クラスをリストします。 JDBC インターフェイスまたは クラス Informix クラス メソッドまたは定数を 追加する対象 java.sql.Connection com.informix.jdbc.IfmxConnection 不透明 (OPAQUE) 型、ディステ ィンクト (DISTINCT) 型、および 複合データ型 java.sql.Statement com.informix.jdbc.IfmxStatement 単一の結果セット、自動解放モー ド、文のタイプ、およびシリアル (SERIAL) 型処理 java.lang.Object com.informix.lang.IfxTypes データ型の表現 java.lang.Object com.informix.jdbc.IfxStatementTypes SQL 文の表現 java.sql.CallableStatement com.informix.jdbc.IfmxCallableStatement Informix データ型でのパラメータ 処理 java.sql.PreparedStatement com.informix.jdbc.IfmxPreparedStatement Informix データ型でのパラメータ 処理 java.sql.ResultSet com.informix.jdbc.IfmxResultSet Informix 時間隔 (INTERVAL) 型 java.sql.ResultSetMetaData com.informix.jdbc.IfmxResultSetMetaData Informix データ型を持つ列 java.sql.SQLInput com.informix.jdbc.IfmxComplexSQLInput 不透明 (OPAQUE) 型、ディステ ィンクト (DISTINCT) 型、および 複合データ型 java.sql.SQLOutput com.informix.jdbc.IfmxComplexSQLOutput 不透明 (OPAQUE) 型、ディステ ィンクト (DISTINCT) 型、および 複合データ型 java.lang.Object com.informix.jdbc.Interval 次の 2 つのクラスに対する時間 隔修飾子といくつかの共通メソッ ド (次の 2 つに対する基本クラ ス) java.lang.Object com.informix.jdbc.IntervalYM 年月時間隔 java.lang.Object com.informix.jdbc.IntervalDF 日時時間隔 java.lang.Object com.informix.jdbc.IfxSmartBlob スマート ラージ オブジェクトの アクセス方式 java.sql.Blob com.informix.jdbc.IfxBblob バイナリ ラージ オブジェクト java.sql.Clob com.informix.jdbc.IfxCblob 文字ラージ オブジェクト java.lang.Object com.informix.jdbc.IfxLocator ラージ オブジェクト ロケータ ポインタ java.lang.Object com.informix.jdbc.IfxLoStat スマート ラージ オブジェクトに 関する統計情報 java.lang.Object com.informix.jdbc.IfxLobDescriptor スマート ラージ オブジェクトの 内部特性 4 IBM Informix JDBC ドライバ プログラマーズ ガイド JDBC インターフェイスまたは クラス Informix クラス メソッドまたは定数を 追加する対象 java.lang.Object com.informix.jdbc.IfxUDTInfo 不透明 (OPAQUE) 型とディステ ィンクト (DISTINCT) 型に関する 一般情報、複合データ型に関する 詳細情報 java.sql.SQLInput com.informix.jdbc.IfmxUDTSQLInput 不透明 (OPAQUE) 型、ディステ ィンクト (DISTINCT) 型、および 複合データ型 java.sql.SQLOutput com.informix.jdbc.IfmxUDTSQLOutput 不透明 (OPAQUE) 型、ディステ ィンクト (DISTINCT) 型、および 複合データ型 Java 仕様を超えたサポートを提供する Informix クラス 多くの Informix クラスは、Java 仕様にはない機能のサポートを提供します。 これ らのクラスを、次の表にリストします。 JDBC インターフェイス またはクラス Informix クラス サポート対象 java.lang.Object UDTManager データベース サーバへの不透明 (OPAQUE) 型のデプロイ java.lang.Object UDTMetaData データベース サーバへの不透明 (OPAQUE) 型のデプロイ java.lang.Object UDRManager データベース サーバへのユーザ定義ルーチ ンのデプロイ java.lang.Object UDRMetaData データベース サーバへのユーザ定義ルーチ ンのデプロイ JDK バージョン 1.4 以降での UDTManager および UDRManager クラスの使用 前のリリースでは、ifxtools.jar に含まれているヘルパー クラス、UDTManager お よび UDRManager には、パッケージ化されたクラスからはアクセスできませんで した。IBM Informix JDBC ドライバ 2.21.JC3 では、これらのクラスはすべて udtudrmgr パッケージに含まれています。下位方向の互換性のため、これらのクラ スのパッケージ化されていないバージョンも組み込まれています。 パッケージ化されたクラスにアクセスするには、プログラム内で以下の IMPORT 文 を使用します。 v import udtudrmgr.UDTManager; v import udtudrmgr.UDRManager; IBM Informix JDBC ドライバのファイル IBM Informix JDBC ドライバは、プログラム ファイル setup.jar から入手できま す。ドライバのインストール方法については、8 ページの『JDBC ドライバのイン ストール』を参照してください。 第 1 章 はじめに 5 インストール後、製品は以下のファイルから構成されます。Java アーカイブ (JAR) ファイルも含まれます。 v lib/ifxjdbc.jar JDBC API インターフェイス、クラス、およびメソッドの、最適化されたインプ リメンテーション。 このファイルは、javac コマンドの -O オプションを使用してコンパイルされま す。 v lib/ifxtools.jar ユーティリティ: ClassGenerator、Lightweight Directory Access Protocol (LDAP) ローダなど。 このファイルは、javac コマンドの -O オプションを使用してコンパイルされま す。 v lib/ifxlang.jar ドライバでサポートされるすべてのメッセージ テキストのローカライズされたバ ージョン。 このファイルは、javac コマンドの -O オプションを使用してコンパイルされま す。 v lib/ifxjdbcx.jar DataSource、接続プール、および XA 関連のクラス ファイルのインプリメンテー ションを含みます。 このファイルは、javac コマンドの -O オプションを使用してコンパイルされま す。 v lib/ifxsqlj.jar SQLJ プログラムのランタイム サポートのためのクラスを含みます。 このファイルは、javac コマンドの -O オプションを使用してコンパイルされま す。 v demo/basic/* demo/rmi/* demo/stores7/* demo/clob-blob/* demo/complex-types/* demo/pickaseat/* demo/xml/* demo/proxy/* demo/connection-pool/* demo/udt-distinct/ * demo/hdr/* demo/tools/udtudrmgr/* JDBC API を使用するサンプル プログラム。 6 IBM Informix JDBC ドライバ プログラマーズ ガイド これらのサンプル ファイルについては、 217 ページの『付録 A. サンプル コー ド ファイル』を参照してください。 v proxy/IfxJDBCProxy.class HTTP トンネル プロキシ クラス ファイル v proxy/SessionMgr.class HTTP トンネル プロキシをサポートするセッション マネージャ クラス ファイ ル v proxy/TimeoutMgr.class HTTP トンネル プロキシをサポートするタイムアウト マネージャ クラス ファ イル v doc/release/* オンライン リリース ノートおよびドキュメント ノート v doc/javadoc/* Informix の拡張クラスとインターフェイスの javadoc ページ ディレクトリ lib、demo、proxy、および doc は、IBM Informix JDBC ドライバを インストールしたディレクトリのサブディレクトリです。 クライアント サイドとサーバ サイドの JDBC ドライバ IBM Informix JDBC ドライバには、クライアント サイド ドライバとサーバ サイ ド ドライバという、2 つのバージョンが存在します。クライアント サイド ドライ バは、Informix データベース サーバにアクセスするクライアント Java アプリケー ションを対象とします。 クライアント サイド ドライバには ifxjdbc.jar と ifxjdbcx.jar が含まれています。さらに、 5 ページの『IBM Informix JDBC ドライ バのファイル』のセクションで説明されているように、いくつかのサポート .jar フ ァイルが含まれています。 サーバ サイド ドライバは、データベース サーバの一部としてインストールされ、 jdbc.jar を含んでいます。jdbc.jar は ifxjdbc.jar から派生しているため、2 つのド ライバは多くの機能を共用します。 本書は、主としてクライアント サイド ドライバについて記載していますが、共有 する機能に関する情報はサーバ サイドとクライアント サイドの両方のバージョン に適用されます。 注: サーバ サイド バージョンとクライアント サイド バージョンを混在させたり 交換することはできません。 「J/Foundation 開発者ガイド」では、IBM Informix JDBC ドライバが特にサーバ サ イド JDBC アプリケーション用に提供しているインターフェイスとサブプロトコ ル、およびサーバ サイド JDBC アプリケーションに適用される制約事項について 説明しています。 第 1 章 はじめに 7 JDBC ドライバの入手 IBM Informix JDBC ドライバ は、IBM Informix JDBC ドライバ 製品 CD に収録 されている他、IBM Informix製品バンドル CD の JDBC ディレクトリにもありま す。また、http://www.ibm.com/software/data/informix/tools/jdbc からもドライバをダウ ンロードできます。 CD や Web サイト ダウンロードには、次のファイルが含まれています。 v setup.jar v doc/jdbcrel.htm v doc/install.txt setup.jar ファイルは、IBM Informix JDBC ドライバ のインストール プログラムで す。 ドキュメンテーション ディレクトリ <dir>/doc には、HTML 形式でのリリース ノ ート ファイルがあります。本書にない新情報については、このリリース ノートを 参照してください。 JDBC ドライバのインストール 前提条件 IBM Informix JDBC ドライバ を Web サイトから .zip ファイルとしてダウンロー ドした場合は、ディレクトリに unzip してください。 CD からドライバをインストールする場合は、CD-ROM ドライブに CD をロードし てください。 グラフィカル モードまたはコンソール モードでの JDBC ドライ バのインストール 1. コマンド プロンプトで次のいずれかのコマンドを使用してインストール プログ ラムを起動します。 v グラフィカル モードで起動する場合 java -cp <dir>/setup.jar run v コンソール モードで起動する場合 java -cp <dir>/setup.jar run -console ここで <dir> は、setup.jar ファイルの格納場所です。 インストール時の情報をログに記録する場合は、-log パラメータも指定してく ださい。このパラメータに指定できる引数については、 9 ページの『インスト ール イベントのロギング』を参照してください。 2. 使用許諾契約書を読み、条件を受諾します。インストールによるプロンプトの指 示に応答してください。 3. プロンプトが出されたら、デフォルトのディレクトリを受け入れるか、別のディ レクトリを指定します。 8 IBM Informix JDBC ドライバ プログラマーズ ガイド Windows® プラットフォームの場合のデフォルト ディレクトリは次のとおりで す。 C:¥Program Files¥IBM¥Informix_JDBC_Driver インストールおよびアンインストールでのエラーを回避するには、インストール パスに感嘆符 (!) を使用しないでください。 4. プロンプトが出されたら、インストール パスの場所を確認します。 インストーラーにより JDBC ドライバがインストールされ、インストール ディ レクトリにアンインストーラーが追加されたことが示されます。 注: NFS マウントされているファイルシステムへ接続されているときにインスト ールが停止した場合は、まず NFS の問題の解決を試みる必要があります。 場合によっては、共用をアンマウントおよび再マウントすると、問題が解決 することがあります。それ以外の場合は、インストールを強制的に終了し、 孤立したプロセスをクリーンアップしてから、インストールを再開してくだ さい。 5. 次のメッセージが表示されたら「完了」を指定します。 InstallShield Wizard has successfully installed IBM Informix JDBC Driver. Informix JDBC ドライバをサイレント モードでインストールする コマンド プロンプトから次のコマンドを実行します。 java -cp <dir> /setup.jar run -silent -P product.installLocation=<destination-dir> ここで、 <dir> は、setup.jar ファイルの格納場所です。 <destination-dir> は、JDBC ドライバをインストールするディレクトリです。 コマンドの実行が終了したら、インストール完了です。 インストール時の情報をログに記録する場合は、-log パラメータも指定してくださ い。このパラメータに指定できる引数については、『インストール イベントのロギ ング』を参照してください。 インストール イベントのロギング ドライバをインストールするコマンドの実行時に -log オプションを指定すると、ロ ギングを有効化できます。-log オプションは、引数としてファイル タイプ、イベン ト タイプ、およびファイル場所をとります。例えば、グラフィカル モードで IBM Informix JDBC ドライバをインストールし、イベントのログを保存する場合は、次 のコマンドを実行します。 java -cp setup.jar run -log #![filename] @ [event type];[event type] ここで、 # は、表示を標準出力にエコーします。 第 1 章 はじめに 9 ![filename] は、ログ ファイルのファイル名です。[filename] 引数を省略して、ロ グ情報をデフォルトのファイル名に保存することもできます。 @<event type> は、ログに記録するイベント タイプです。 引数とそれに関連したイベント タイプを次に示します。 引数 イベント タイプ err エラー wrn 警告 msg1 主イベント msg2 副イベント dbg デバッグ イベント ALL すべてのイベント NONE ロギングを使用不可にしてログ ファイルをクリアする ロギング例 次のコマンドは IBM Informix JDBC ドライバをグラフィカル モードでインストー ルし、すべてのイベントを /tmp/jdbcinstall.log に記録します。 java -cp setup.jar run -log !/tmp/jdbcinstall.log @ ALL 次のコマンドは IBM Informix JDBC ドライバをサイレント モードでインストール し、エラー イベントを /tmp/jdbcinstall.log に記録します。 java -cp setup.jar run -silent -P product.installLocation=< > -log !"/tmp/jdbcinstall.log" @err アプリケーションでのドライバの使用 アプリケーションで IBM Informix JDBC ドライバを使用するためには、ドライバ ファイルを指すように CLASSPATH 環境変数を設定する必要があります。 CLASSPATH 環境変数は、Java 仮想マシン (JVM) およびその他のアプリケーショ ンに、Java プログラム内で使用されている Java クラス ライブラリがある場所を伝 えます。 UNIX のみ CLASSPATH 環境変数を設定するには、2 つの方法があります。 v 次のように ifxjdbc.jar の絶対パス名を CLASSPATH に追加します。 setenv CLASSPATH /jdbcdriv/lib/ifxjdbc.jar:$CLASSPATH ローカライズされたメッセージのサポートを追加する場合は、ifxlang.jar も指定 します。 setenv CLASSPATH /jdbcdriv/lib/ifxjdbc.jar:/jdbcdriv/lib/ifxlang.jar: $CLASSPATH v ifxjdbc.jar をアンパックし、そのディレクトリを CLASSPATH に追加します。 10 IBM Informix JDBC ドライバ プログラマーズ ガイド cd /jdbcdriv/lib jar xvf ifxjdbc.jar setenv CLASSPATH /jdbcdriv/lib:$CLASSPATH ローカライズされたメッセージのサポートを追加する場合は、ifxlang.jar も指定 します。 cd /jdbcdriv/lib jar xvf ifxjdbc.jar jar xvf ifxlang.jar setenv CLASSPATH /jdbcdriv/lib:$CLASSPATH UNIX のみ の終り Windows のみ CLASSPATH 環境変数を設定するには、2 つの方法があります。 v ifxjdbc.jar の絶対パス名を CLASSPATH に追加します。 set CLASSPATH=c:¥jdbcdriv¥lib¥ifxjdbc.jar;%CLASSPATH% ローカライズされたメッセージのサポートを追加する場合は、ifxlang.jar も指定 します。 set CLASSPATH=c:¥jdbcdriv¥lib¥ifxjdbc.jar;c:¥ jdbcdriv¥lib¥ifxlang.jar;%CLASSPATH% v ifxjdbc.jar をアンパックし、そのディレクトリを CLASSPATH に追加します。 cd c:¥jdbcdriv¥lib jar xvf ifxjdbc.jar set CLASSPATH=c:¥jdbcdriv¥lib;%CLASSPATH% ローカライズされたメッセージのサポートを追加する場合は、ifxlang.jar も指定 します。 cd c:¥jdbcdriv¥lib jar xvf ifxjdbc.jar jar xvf ifxlang.jar set CLASSPATH=c:¥jdbcdriv¥lib;%CLASSPATH% Windows のみ の終り 注: javax.sql クラス (例えば、Datasource) を使用している場合は、ifxjdbc.jar に加 えて ifxjdbcx.jar も指定します。 jar ユーティリティの詳細については、Java のマニュアル (http://java.sun.com) を参 照してください。 アプレットでのドライバの使用 アプレットで IBM Informix JDBC ドライバを使用して、Web ブラウザから Informix データベースに接続することができます。 次の手順で、アプレットで IBM Informix JDBC ドライバを指定する方法、およびドライバを Web サーバから 確実に正しくダウンロードする方法を示します。 アプレットで IBM Informix JDBC ドライバを使用するには: 第 1 章 はじめに 11 1. アプレットのクラス ファイルと同じディレクトリに ifxjdbc.jar をインストール します。 2. 次の例に示すように、HTML ファイル内の APPLET タグの ARCHIVE 属性 に、ifxjdbc.jar を指定します。 <APPLET ARCHIVE=ifxjdbc.jar CODE=my_applet.class CODEBASE=http://www.myhost.com WIDTH=460 HEIGHT=160> </APPLET> 重要: ブラウザの中には APPLET タグの ARCHIVE 属性をサポートしていないも のもあります。ご使用のブラウザがこれに該当する場合は、Web サーバのル ート ディレクトリに ifxjdbc.jar ファイルをアンパックしてインストールし ます。ご使用のブラウザが JDBC API もサポートしていない場合は、java.sql パッケージに含まれているクラス ファイルも Web サーバのルート ディレク トリにインストールする必要があります。ルート ディレクトリへのファイル のインストール方法については、ご使用の Web サーバのマニュアルを参照し てください。 未署名のアプレットはセキュリティ上の理由からいくつかのシステム リソースにア クセスできないため、IBM Informix JDBC ドライバの以下の機能は未署名のアプレ ットに対しては機能しません。 v sqlhosts ファイルおよび LDAP サーバ アクセス。sqlhosts ファイルを、直接ま たは LDAP サーバを介して参照している場合、データベース URL のはオプショ ンは、ホスト名とポート番号のプロパティや Informix データベース サーバのサ ービス名です。 ただし、未署名のアプレットの場合、アプレットが HTTP プロキシ サーバを使 用していない限り、常にホスト名とポート番号や Informix データベース サーバ のサービス名が必要です。HTTP プロキシ サーバの詳細については、39 ページ の『HTTP プロキシ サーバの使用』を参照してください。 v LOBCACHE=0。 データベース URL で LOBCACHE 環境変数を 0 に設定する ことで、スマート ラージ オブジェクトを常にファイルに格納することを指定で きます。この設定は未署名のアプレットに対してはサポートされていません。 ヒント: アプレットの権限を構成するオプションを提供している Microsoft Internet Explorer を使用して、未署名のアプレットに対してこれらの機能を有効に することができます。 異なるホスト上、またはファイアウォールの後ろにあるデータベースにアプレット からアクセスするには、ミドル層で Informix HTTP プロキシ サーブレットを使用 します。詳しくは、39 ページの『HTTP プロキシ サーバの使用』を参照してくだ さい。 JDBC ドライバのアンインストール IBM Informix JDBC ドライバをインストールすると、インストール プログラムは JDBC″ ドライバ″をインストールしたディレクトリにアンインストール パッケージ を作成します。IBM Informix JDBC ドライバをアンインストールすると、ドライバ とそのすべてのコンポーネントが、コンピュータから完全に削除されます。 12 IBM Informix JDBC ドライバ プログラマーズ ガイド 次のセクションでは、すべてのプラットフォームで IBM Informix JDBC ドライバ をアンインストールする方法について説明します。 ヒント: IBM Informix JDBC ドライバをインストールした <destination-dir> のパス 名に空白が含まれている場合は、アンインストール コマンド実行時にパス 名全体を引用符で囲みます。 グラフィカル モードまたはコンソール モードでのアンインストー ル 次のいずれかのコマンドを実行して、アンインストール プログラムを起動します。 ここで、<destination-dir> は、IBM Informix JDBC ドライバをインストールしたデ ィレクトリです。 グラフィカル モードで起動する場合 java -cp <destination-dir>/_uninst/uninstall.jar run コンソール モードで起動する場合 java -cp <destination-dir>/_uninst/uninstall.jar run -console プロンプトに従って JDBC ドライバをアンインストールします。 サイレント モードでのアンインストール 次のコマンドを実行して、アンインストール プログラムをサイレント モードで起 動します。ここで、<destination-dir> は、IBM Informix JDBC ドライバをインスト ールしたディレクトリです。 java -cp <destination-dir>/_uninst/uninstall.jar run -silent サイレント モードでは、アンインストール プログラムからのメッセージは表示さ れませんが、ドライバがアンインストールされます。 第 1 章 はじめに 13 14 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 2 章 データベースへの接続 本章について . . . . . . . . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバのロード . . . . . . . . . . . . . . . DataSource オブジェクトの使用. . . . . . . . . . . . . . . . . . DriverManager.getConnection() メソッドの使用 . . . . . . . . . . . . . データベース URL のフォーマット . . . . . . . . . . . . . . . 接続 URL 内の IP アドレス. . . . . . . . . . . . . . . . . データベース接続とデータベース サーバ接続の比較. . . . . . . . . . プロパティの指定 . . . . . . . . . . . . . . . . . . . . . IBM Informix JDBC ドライバ での Informix 環境変数の使用 . . . . . . . . Informix sqlhosts ファイルの動的読取り . . . . . . . . . . . . . . . 接続プロパティ構文 . . . . . . . . . . . . . . . . . . . . 管理要件 . . . . . . . . . . . . . . . . . . . . . . . . LDAP サーバを sqlhosts のデータで更新するためのユーティリティ . . . . SqlhUpload . . . . . . . . . . . . . . . . . . . . . . . SqlhDelete . . . . . . . . . . . . . . . . . . . . . . . 高可用性データ レプリケーションの使用 . . . . . . . . . . . . . . 副サーバ接続プロパティ . . . . . . . . . . . . . . . . . . . HDR ペアでのグループ記入項目への接続 . . . . . . . . . . . . . 読取り専用状態の検査 . . . . . . . . . . . . . . . . . . . . 接続の再試行 . . . . . . . . . . . . . . . . . . . . . . . HTTP プロキシ サーバの使用 . . . . . . . . . . . . . . . . . . プロキシ サーバを使用するための環境構成. . . . . . . . . . . . . タイムアウトの指定 . . . . . . . . . . . . . . . . . . . LDAP サーバとプロキシの併用 . . . . . . . . . . . . . . . . . LDAP ルックアップが実行される場所の指定 . . . . . . . . . . . sqlhosts ファイル ルックアップの指定 . . . . . . . . . . . . . . その他の多層ソリューションの使用 . . . . . . . . . . . . . . . . 暗号化オプション . . . . . . . . . . . . . . . . . . . . . . Sun JCE セキュリティ パッケージの使用 . . . . . . . . . . . . . IBM FIPS 準拠のセキュリティ パッケージの使用 . . . . . . . . . . パスワード暗号化の使用 . . . . . . . . . . . . . . . . . . . データベース サーバの構成 . . . . . . . . . . . . . . . . . ネットワーク暗号化の使用 . . . . . . . . . . . . . . . . . . ネットワーク暗号化の構文 . . . . . . . . . . . . . . . . . オプション タグの使用 . . . . . . . . . . . . . . . . . . オプション パラメータの使用 . . . . . . . . . . . . . . . . サーバでの暗号化 CSM の構成 . . . . . . . . . . . . . . . . Informix JDBC ドライバ でのシングル サインオン アクセス コントロールの使用 PAM 認証方法 . . . . . . . . . . . . . . . . . . . . . . . JDBC での PAM の使用 . . . . . . . . . . . . . . . . . . . 接続のクローズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 16 17 20 21 23 24 25 26 33 33 35 35 35 36 36 37 37 38 38 39 40 41 42 43 44 44 44 45 45 46 46 46 47 47 48 48 49 49 51 52 本章について この章では、IBM Informix JDBC ドライバを使用して Informix データベースに接 続するために必要な情報について説明します。 この章には以下のセクションが含ま れます。 v IBM Informix JDBC ドライバのロード v DataSource オブジェクトの使用 © Copyright IBM Corp. 1996, 2008 15 v DriverManager.getConnection() メソッドの使用 v IBM Informix JDBC ドライバ での Informix 環境変数の使用 v Informix sqlhosts ファイルの動的読取り v 高可用性データ レプリケーションの使用 v HTTP プロキシ サーバの使用 v その他の多層ソリューションの使用 v 暗号化オプション v Informix JDBC ドライバ でのシングル サインオン アクセス コントロールの使 用 v PAM 認証方法 v 接続のクローズ Java プログラムで問合せの送信と結果の受信を行う前に、まず Informix データベ ース サーバまたはデータベースへの接続を確立する必要があります。 次の 2 つの操作を行って接続を確立します。 1. IBM Informix JDBC ドライバをロードします。 2. 以下のいずれかの方法を使用して、データベース サーバまたは特定のデータベ ースのいずれかに接続します。 v DataSource オブジェクトを使用する。 v DriverManager.getConnection メソッドを使用する。 DataSource オブジェクトはポータブルであり、見えないデータ ソースの詳細をア プリケーションに対して透過的にすることができるため、DataSource オブジェクト の方が DriverManager.getConnection メソッドを使用するよりも推奨されます。タ ーゲット データ ソースのインプリメンテーションを変更できます。あるいは、ア プリケーション コードに影響を与えることなく、アプリケーションを別のサーバに リダイレクトできます。 DataSource オブジェクトは接続プールと分散トランザクションもサポートします。 さらに、Java Beans および J2EE を使用するためには DataSource オブジェクトが 必要です。 以下の追加接続オプションを使用できます。 v 環境変数の設定 v Informix sqlhosts ファイルの動的読取り v HTTP プロキシ サーバの使用 v パスワード暗号化の使用 v ネットワーク暗号化の使用 IBM Informix JDBC ドライバのロード IBM Informix JDBC ドライバをロードするには、Class.forName() メソッドに値 com.informix.jdbc.IfxDriver を渡して使用します。 16 IBM Informix JDBC ドライバ プログラマーズ ガイド try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) { System.out.println("ERROR: failed to load Informix JDBC driver."); e.printStackTrace(); return; } Class.forName() メソッドは、Driver クラスの Informix インプリメンテーションで ある IfxDriver をロードします。 次に、IfxDriver はドライバのインスタンスを作 成して DriverManager クラスに登録します。 IBM Informix JDBC ドライバをロードしたら、Informix データベースまたはデータ ベース サーバに接続できる状態になります。 Windows のみ Microsoft Internet Explorer で表示するようにアプレットを記述している場合は、プ ラットフォームの非互換性を避けるために明示的に IBM Informix JDBC ドライバ を登録する必要がある場合もあります。 ドライバを明示的に登録するには、次のように DriverManager.registerDriver() メソ ッドを使用します。 DriverManager.registerDriver(com.informix.jdbc.IfxDriver) Class.forName("com.informix.jdbc.IfxDriver").newInstance()); このメソッドが IBM Informix JDBC ドライバを 2 回登録する可能性があります が、それにより問題は発生しません。 Windows のみ の終り DataSource オブジェクトの使用 DataSource オブジェクトの使用方法および使用理由については、Sun Microsystems が提供する資料を参照してください。この資料は Web 上 (http://java.sun.com) で入 手できます。 IBM Informix JDBC ドライバは、URL を介してではなく DataSource オブジェク トで接続プロパティ (標準プロパティと Informix 環境変数の両方) を定義できるよ うに、標準の DataSource インターフェイスを拡張しています。 次の表で、Informix 接続プロパティと DataSource プロパティの対応関係を説明し ます。 第 2 章 データベースへの接続 17 Informix 接続 プロパティ DataSource プロパティ IFXHOST なし。IFXHOST の設 文字列型 定方法については、付 録 B を参照。 PORTNO portNumber 整数 (INT) 型 クライアント サ イド JDBC の場 合は (SQLH_TYPE が 定義されていなけ れば) 必須。サー バ サイド JDBC の場合は必須では ない。 Informix データベース サーバの ポート番号 ポート番号は /etc/services ファ イルにリストされています。 DATABASE databaseName 文字列型 データベース サ ーバで実行される Web アプリケー ション (ブラウザ など) からの接続 を除き、必須では ない。 接続する Informix データベース の名前 データベースの名前を指定しな い場合、Informix データベース サーバに接続されます。 INFORMIXSERVER serverName 文字列型 クライアント サ 接続する Informix データベース イド JDBC の場 サーバの名前 合は必須。サーバ サイド JDBC の 場合は無視。 USER user 文字列型 必須 ユーザ名は、Informix データベ ースまたはデータベース サーバ への接続時のセッション アクセ ス権を制御 (あるいは決定) しま す。 通常、ユーザ名とパスワードの 両方を指定する必要がありま す。ただし、JDBC アプリケー ションを実行しているユーザが DBMS により信頼されている場 合は、両方を省略できます。 PASSWORD password 文字列型 必須 ユーザのパスワード 通常、ユーザ名とパスワードの 両方を指定する必要がありま す。ただし、JDBC アプリケー ションを実行しているユーザが DBMS により信頼されている場 合は、両方を省略できます。 18 データ 型 IBM Informix JDBC ドライバ プログラマーズ ガイド 必須かどうか 説明 クライアント サ Informix データベース サーバを イド JDBC の場 実行しているコンピュータの IP アドレスまたはホスト名 合は (SQLH_TYPE が 定義されていなけ れば) 必須。サー バ サイド JDBC の場合は必須では ない。 Informix 接続 プロパティ DataSource プロパティ データ 型 必須かどうか 説明 なし description 文字列型 必須 DataSource オブジェクトの説明 なし dataSourceName 文字列型 必須ではない 接続プールまたは分散トランザ クションの基礎となる ConnectionPoolDataSource オブ ジェクトまたは XADataSource オブジェクトの名前 networkProtocol および roleName プロパティは、IBM Informix JDBC ドライバで はサポートされていません。 LDAP (Lightweight Directory Access Protocol) サーバまたは sqlhosts ファイルで、 SQLH_TYPE プロパティを介して IP アドレス、ホスト名、またはポート番号や Informix データベース サーバのサービス名が指定されている場合、それらを標準の DataSource プロパティを使用して指定する必要はありません。詳しくは、33 ペー ジの『Informix sqlhosts ファイルの動的読取り』を参照してください。 サポートされている環境変数 (プロパティ) のリストについては、26 ページの 『IBM Informix JDBC ドライバ での Informix 環境変数の使用』を参照してくださ い。環境変数の値と接続プール調整パラメータを定義できるようにする、Informix DataSource 拡張機能のリストについては、 227 ページの『付録 B. DataSource 拡張 機能』を参照してください。ドライバが環境変数の値を決定するためにユーザの環 境を調べることはありません。 ConnectionPoolDataSource オブジェクトについては、211 ページの『接続プールの 使用』を参照してください。 DataSource オブジェクトを高可用性データ レプリケーションとともに使用できま す。詳しくは、36 ページの『高可用性データ レプリケーションの使用』を参照し てください。 pickaseat サンプル プログラムに含まれる次のコードでは、DataSource オブジェク トを定義し、使用しています。 IfxConnectionPoolDataSource cpds = null; try { Context initCtx = new InitialContext(); cpds = new IfxConnectionPoolDataSource(); cpds.setDescription("Pick-A-Seat Connection pool"); cpds.setIfxIFXHOST("158.58.60.88"); cpds.setPortNumber(179); cpds.setUser("demo"); cpds.setPassword("demo"); cpds.setServerName("ipickdemo_tcp"); cpds.setDatabaseName("ipickaseat"); cpds.setIfxGL_DATE("%B %d, %Y"); initCtx.bind("jdbc/pooling/PickASeat", cpds); } catch (Exception e) { System.out.println("Problem with registering the CPDS"); System.out.println("Error: " + e.toString()); } 第 2 章 データベースへの接続 19 以下は、DataSource オブジェクトを使用した IFX_LOCK_MODE_WAIT 接続プロ パティの例です。 v 例 1 IfxDataSource ds = new IfxDataSource (); ds. setIfxIFX_LOCK_MODE_WAIT (65); // wait for 65 seconds ... int waitMode = ds.getIfxIFX_LOCK_MODE_WAIT (); v 例 2 An example Using DataSource: IfxDataSource ds = new IfxDataSource (); ds.setIfxIFX_ISOLATION_LEVEL ("0U"); // set isolation to dirty read with retain // update locks. .... String isoLevel = ds.getIfxIFX_ISOLATION_LEVEL (); DriverManager.getConnection() メソッドの使用 Informix データベースまたはデータベース サーバに接続するには、 DriverManager.getConnection() メソッドを使用できます。このメソッドは Connection オブジェクトを作成します。このオブジェクトは、SQL 文を作成し、そ れらを Informix データベースに送信し、結果を処理するために使用されます。 DriverManager クラスは、使用可能なドライバを追跡し、適切なドライバと、デー タベースまたはデータベース サーバ間の接続要求を処理します。getConnection() メソッドの url パラメータは、サブプロトコル (データベース接続メカニズム)、デ ータベースまたはデータベース サーバの識別子、およびプロパティのリストを指定 するデータベース URL です。 getConnection() メソッドへの 2 番目のパラメータである property は、プロパティ リストです。プロパティ リストの指定方法の例については、25 ページの『プロパ ティの指定』を参照してください。 次の例は、クライアント アプリケーションから testDB というデータベースに接続 するデータベース URL を示しています。 jdbc:informix-sqli://123.45.67.89:1533/testDB: INFORMIXSERVER=myserver;user=rdtest;password=test データベース URL 構文の詳細については、次のセクションで説明します。 CreateDB.java プログラムに含まれる次の部分例は、DriverManager.getConnection() を使用してデータベース testDB に接続する方法を示しています。完全な例では、 前述の例で説明した url 変数は、プログラムがコマンド行で実行されるときにパラ メータとして渡されます。 try { conn = DriverManager.getConnection(url); } catch (SQLException e) { System.out.println("ERROR: failed to connect!"); 20 IBM Informix JDBC ドライバ プログラマーズ ガイド System.out.println("ERROR: " + e.getMessage()); e.printStackTrace(); return; } 重要: IBM Informix JDBC ドライバによってサポートされている Informix 接続タイ プは tcp のみです。共有メモリおよびその他の接続タイプはサポートされて いません。接続タイプの詳細については、ご使用のデータベース サーバの 「IBM Informix 管理者ガイド」を参照してください。 重要: Connection インターフェイスのすべてのメソッドが IBM Informix JDBC ド ライバでサポートされているわけではありません。サポートされていないメ ソッドのリストについては、72 ページの『サポートされないメソッドおよび 動作が異なるメソッド』を参照してください。 クライアント アプリケーションが明示的に接続をクローズする必要はありません。 データベース サーバが自動的に接続をクローズします。ただし、アプリケーション がサーバ サイド JDBC を使用して、データベース サーバで実行されている場合 は、明示的に接続をクローズする必要があります。 データベース URL のフォーマット クライアントからの接続の場合、次のフォーマットを使用してデータベース URL を指定します。 jdbc:informix-sqli://[{ip-address|host-name}:{port-number|service-name}][/dbname]: INFORMIXSERVER=servername[{;user=user;password=password] |CSM=(SSO=database_server@realm,ENC=true)} [;name=value[;name=value]...] データベース サーバ上での接続の場合、次のフォーマットを使用します。 jdbc:informix-direct://[/dbname:;[user=user;password=password] ] [;name=value[;name=value]...] 前述の構文は以下のように記述されています。 v 中括弧 ({}) は、縦線 (|) とともに変数の複数の選択項目を示します。 v イタリック体 は、変数値を示します。 v 大括弧 ([]) は、オプションの値を示します。 v 大括弧で囲まれていない単語またはシンボルは必須です。 (例: INFORMIXSERVER=) データベース URL に空白は使用できません。 例えば、クライアント上では次のように指定します。 jdbc:informix-sqli://123.45.67.89:1533/testDB: INFORMIXSERVER=myserver;user=rdtest;password=test サーバ上では、次のように指定します。 jdbc:informix-direct://testDB;user=rdtest;password=test 重要: サーバ サイド JDBC を使用した接続の場合は、構文が異なります。詳しく は、「J/Foundation 開発者ガイド」、またはご使用のデータベース サーバ バ ージョンのリリース ノートを参照してください。 第 2 章 データベースへの接続 21 次の表で、データベース URL の変数部分と、それに相当する Informix 接続プロパ ティについて説明します。 Informix 接続プロパティ データベース URL 変数 IFXHOST ip-address host-name クライアント サイ Informix データベース サーバを実行している ド JDBC の場合は コンピュータの IP アドレスまたはホスト名 (SQLH_TYPE が定 義されているか、 IFXHOST が使用さ れている場合を除 き) 必須。サーバ サイド JDBC の場 合は必須ではない。 PORTNO port-number クライアント サイ Informix データベース サーバのポート番号 ド JDBC の場合は ポート番号は /etc/services ファイルにリストさ 必須。SQLH_TYPE れています。 が定義されている か、PORTNO が使 用されている場合を 除き、port-number または service-name のいずれかを指定す る必要があります。 サーバ サイド JDBC の場合は必須 ではありません。 なし service-name クライアント サイ Informix データベース サーバの service-name ド JDBC の場合は は /etc/services ファイルにリストされていま 必須。SQLH_TYPE す。 が定義されている か、PORTNO が使 用されている場合を 除き、port-number または service-name のいずれかを指定す る必要があります。 サーバ サイド JDBC の場合は必須 ではありません。 DATABASE dbname データベース サー バで実行される Web アプリケーシ ョン (ブラウザな ど) からの接続を除 き、必須ではない。 接続する Informix データベースの名前 データベースの名前を指定しない場合、 Informix データベース サーバに接続されま す。 INFORMIXSERVER server-name 必須 接続する Informix データベース サーバの名前 22 必須かどうか IBM Informix JDBC ドライバ プログラマーズ ガイド 説明 Informix 接続プロパティ データベース URL 変数 USER 必須かどうか 説明 user 必須。ユーザとパス ワード、または SSO の CSM 設定 を指定する必要があ ります。 Informix データベースまたはデータベース サ ーバに接続するユーザの名前 ユーザとパスワードは、両方とも指定するか、 またはどちらも指定しないでください。どちら も指定しない場合、ドライバは System.getProperty() を呼び出して、現在アプ リケーションを実行しているユーザの名前を取 得します。そのクライアントは信頼されている ものと判断されます。 PASSWORD password 必須。ユーザとパス ワード、または SSO の CSM 設定 を指定する必要があ ります。 ユーザのパスワード ユーザとパスワードは、両方とも指定するか、 またはどちらも指定しないでください。どちら も指定しない場合、ドライバは System.getProperty() を呼び出して、現在アプ リケーションを実行しているユーザの名前を取 得します。そのクライアントは信頼されている ものと判断されます。 なし database_server@realm 必須。ユーザとパス ワード、または SSO の CSM 設定 を指定する必要があ ります。 (SSO) アクセス コントロールのサービス プリ ンシパル。詳細については、49 ページの 『Informix JDBC ドライバ でのシングル サイ ンオン アクセス コントロールの使用』を参照 してください。 なし name=value 必須ではない name 変数に含まれる Informix 環境変数の値を 指定する名前と値のペア。IBM Informix JDBC ドライバまたは Informix データベース サーバ のいずれかにより認識されます。 name 変数では、大文字と小文字が区別されま せん。 詳しくは、25 ページの『プロパティの指定』 および 26 ページの『IBM Informix JDBC ド ライバ での Informix 環境変数の使用』を参照 してください。 LDAP サーバまたは sqlhosts ファイルで SQLH_TYPE プロパティを使用して、IP アドレス、ホスト名、またはポート番号が指定されている場合は、それらをデータ ベース URL で指定する必要はありません。詳しくは、33 ページの『Informix sqlhosts ファイルの動的読取り』を参照してください。 接続 URL 内の IP アドレス JDK 1.4 をサポートする IBM Informix JDBC ドライバ バージョン 3.0 以降は、 IPv6 を認識します。つまり、接続 URL を解析するコードは、より長い (128 ビッ ト モード) IPv6 アドレスを (IPv4 フォーマットと同様に) 処理できます。例えば、 次のように IP アドレスを IPv6 リテラルにすることができます。 3ffe:ffff:ffff:ffff:0:0:0:12 IDS サーバ 10.0 以降で IPv6 ポートに接続するには、システム プロパティを使用 します。例えば、次のようになります。 第 2 章 データベースへの接続 23 java -Djava.net.preferIPv6Addresses=true ... IBM Informix JDBC ドライバ バージョン 3.0 以降では、IPv6 リテラルを使用しな い URL の処理は変更されていません。また、既存の動作も変更されていません。 コロン (つまり、:) は、特に IPv6 リテラル アドレスでは、接続 URL におけるキ ーとなる区切り記号です。 ドライバが IPv6 リテラル アドレスを認識するためには、正しいフォーマットの URL を作成する必要があります。下記の例では、以下の点に注意してください。 v jdbc:informix-sqli:// は必須です。 v 8088 を囲むコロン (つまり、:8088:) は必須です。 v 3ffe:ffff:ffff:ffff:0::12 は、ドライバにより妥当性を検証されません。 v 8088 は有効な数値 (< 32k) である必要があります。 jdbc:informix-sqli://3ffe:ffff:ffff:ffff:0::12:8088:informixserver=X... データベース接続とデータベース サーバ接続の比較 DriveManager.getConnection() メソッドを使用して、Informix データベースまたは Informix データベース サーバのいずれかに接続できます。 Informix データベースに接続するには、データベース URL の dbname 変数に、デ ータベースの名前を指定します。データベースの名前を省略すると、データベース URL、または接続プロパティ リストの INFORMIXSERVER 環境変数によって指 定されたデータベース サーバに接続されます。 Informix データベース サーバに直接接続する場合は、データベースに接続する SQL 文を Java プログラム内で実行できます。 データベースおよびデータベース サーバへの接続ではどちらの場合もすべて、 INFORMIXSERVER 環境変数を使用して Informix データベース サーバの名前を 組み込む必要があります。 重要: IBM Informix OnLine、IBM Informix SE 5.x、または IBM Informix SE 7.x データベース サーバに接続する場合は、USEV5SERVER=1 を指定する必要があ ります。 20 ページの『DriverManager.getConnection() メソッドの使用』の例は、testDB とい う Informix データベースに、データベース URL を使用して直接接続する方法を示 しています。 DBConnection.java プログラムに含まれる次の例は、最初に myserver という Informix データベース サーバに接続し、次に Statement.executeUpdate() メソッド を使用してデータベース testDB に接続する方法を示しています。 プログラムがコマンド行で実行されると、次のデータベース URL がパラメータと してプログラムに渡されます。URL にはデータベースの名前が含まれていないこと に注意してください。 jdbc:informix-sqli://123.45.67.89:1533:INFORMIXSERVER=myserver; user=rdtest;password=test 24 IBM Informix JDBC ドライバ プログラマーズ ガイド コードは次のとおりです。 String cmd = null; int rc; Connection conn = null; try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) { System.out.println("ERROR: failed to load Informix JDBC driver."); } try { conn = DriverManager.getConnection(newUrl); } catch (SQLException e) { System.out.println("ERROR: failed to connect!"); e.printStackTrace(); return; } try { Statement stmt = conn.createStatement(); cmd = "database testDB;"; rc = stmt.executeUpdate(cmd); stmt.close(); } catch (SQLException e) { System.out.println("ERROR: execution failed - statement: " + cmd); System.out.println("ERROR: " + e.getMessage()); } プロパティの指定 DriverManager.getConnection() メソッドを使用して接続すると、IBM Informix JDBC ドライバは、接続データベース URL の名前と値のペア、または接続プロパ ティ リストのいずれかからのみ、Informix の環境変数を読み取ります。 ドライバ が環境変数についてユーザの環境を調べることはありません。 接続データベース URL の名前と値のペアで Informix の環境変数を指定する場合 は、21 ページの『データベース URL のフォーマット』を参照してください。 プロパティ リストを使用して Informix 環境変数を指定するには、 java.util.Properties クラスを使用してプロパティのリストを作成します。 プロパテ ィのリストには、INFORMIXSERVER などの Informix 環境変数のほか、user や password を含めることができます。 プロパティ リストを作成したら、それを DriverManager.getConnection() メソッド の 2 番目のパラメータとして渡します。さらに、最初のパラメータとしてデータベ ース URL を含める必要があります。ただし、この場合は URL にプロパティのリ ストを含める必要はありません。 第 2 章 データベースへの接続 25 optofc.java の例に含まれる次のコードは、java.util.Properties クラスを使用して接 続プロパティを設定する方法を示しています。最初に、Properties.put() メソッドを 使用して、接続プロパティ リストで環境変数 OPTOFC を 1 に設定します。次 に、データベースに接続します。 この例にある DriverManager.getConnection() メソッドは、データベース URL とプ ロパティ リストという、2 つのパラメータを取ります。この例は、20 ページの 『DriverManager.getConnection() メソッドの使用』の例と同様の接続を行います。 プログラムがコマンド行で実行されると、次のようなデータベース URL がパラメ ータとしてサンプル プログラムに渡されます。 jdbc:informix-sqli://myhost:1533:informixserver=myserver; user=rdtest;password=test コードは次のとおりです。 try { Class.forName("com.informix.jdbc.IfxDriver"); } catch (Exception e) { System.out.println("ERROR: failed to load Informix JDBC driver."); } try { Properties pr = new Properties(); pr.put("OPTOFC","1"); conn = DriverManager.getConnection(newUrl, pr); } catch (SQLException e) { System.out.println("ERROR: failed to connect!"); } IBM Informix JDBC ドライバ での Informix 環境変数の使用 次の表に、クライアント JDBC ドライバでサポートされる Informix 環境変数の大 部分がリストされています。 サーバ サイド JDBC の場合、環境変数を設定するの ではなく、データベース URL でプロパティを設定してください。環境変数はデー タベース サーバ上で実行されているすべてのプログラムに適用されるためです。プ ロパティの詳細については、25 ページの『プロパティの指定』を参照してくださ い。 国際化機能を提供する環境変数のリストについては、第 6 章を参照してください。 トラブルシューティングに役立つ環境変数のリストについては、第 7 章を参照して ください。 サポートされている Informix 環境変数 説明 BIG_FET_BUF_SIZE IBM Informix Extended Parallel Server バージョン 8.4 では、タプル バッファのデフォルト サイズを上書きし、2 GB まで増加させること ができます。 26 IBM Informix JDBC ドライバ プログラマーズ ガイド サポートされている Informix 環境変数 説明 CSM 通信サポート モジュールを使用することを指定します。IBM Informix JDBC ドライバ 3.0 以降は、暗号化 CSM をサポートしています。詳 しくは、 44 ページの『暗号化オプション』を参照してください。 DBANSIWARN 1 に設定されていると、ANSI 標準構文に対する Informix 拡張セット を検査します。 DBSPACETEMP 一時表を作成する DB 領域を指定します。 DBTEMP IBM Informix Enterprise Gateway 製品が一時ファイルと一時表を配置 するディレクトリの絶対パス名を指定します。 ドライバはこの変数を使用しません。その値をサーバに渡すだけで す。 DBUPSPACE UPDATE STATISTICS 文を使用して複数列の分散を作成するときに、 行のソートのためにこの文で使用できるディスク領域とメモリの量、 インデックスを使用してソートするかどうか、および列の分散を計算 するときの計画を sqexplain.out ファイルに保存するかどうかを指定 します。 DELIMIDENT Y に設定されている場合、二重引用符で区切られた文字列が区切り識 別子であることを指定します。 ENABLE_CACHE_TYPE 1 に設定されていると、不透明 (OPAQUE) 型、ディスティンクト (DISTINCT) 型、または行 (ROW) 型のデータ型情報をキャッシュに 入れます。 Struct または SQLData オブジェクトが列にデータを挿入し、 getSQLTypeName() がその型名を戻す場合、ドライバは、データベー ス サーバに問い合わせる代わりにキャッシュされた情報を使用しま す。 ENABLE_HDRSWITCH true に設定されていると、主サーバを使用できない場合、副サーバの プロパティを使用して HDR ペアの副サーバに接続します。 FET_BUF_SIZE ラージ オブジェクト以外のすべてのデータに対するフェッチ バッフ ァ サイズのデフォルト設定を上書きします。 デフォルトのサイズは 4096 バイトです。この変数はサーバ サイド JDBC ではサポートされていません。 IFX_AUTOFREE 1 に設定されていると、カーソルがすでにデータベース サーバでクロ ーズされている場合、Statement.close() メソッドが、データベース サ ーバのカーソル リソースを解放するためにネットワーク ラウンド ト リップを必要としないことを示します。 ResultSet.close() メソッドで明示的に、または OPTOFC 環境変数に より暗黙的にカーソルがクローズされた後、データベース サーバが自 動的にカーソル リソースを解放します。カーソル リソースの解放後 は、もうそのカーソルを参照できません。詳細については、79 ページ の『自動解放機能の使用』を参照してください。 IFX_BATCHUPDATE_PER_SPEC 1 (デフォルト) に設定されていると、executeBatch() メソッドによる バッチ操作で実行される SQL 文の影響を受ける行数を戻します。 第 2 章 データベースへの接続 27 サポートされている Informix 環境変数 説明 IFX_CODESETLOB 0 以上の数値に設定されている場合は、クライアント ロケールとデー タベース ロケールの間で、テキスト (TEXT) 型および CLOB 型のコ ード セット変換が自動化されます。この変数の値により、コード セ ット変換がメモリ内または一時ファイル内のどちらで行われるかが決 定されます。0 に設定されている場合、コード セット変換では一時フ ァイルが使用されます。0 より大きい値に設定されている場合、コー ド セット変換はクライアント コンピュータのメモリ内で行われま す。値は、変換のために割り当てられるメモリのバイト数を表しま す。詳しくは、201 ページの『IFX_CODESETLOB 環境変数を使用し た変換』を参照してください。 IFX_DIRECTIVES オプティマイザが、問合せ内からの問合せ最適化ディレクティブを許 容するかどうかを決定します。この変数はクライアント上で設定され ます。ドライバはこの変数を使用しません。その値をサーバに渡すだ けです。 IFX_EXTDIRECTIVES 問合せオプティマイザが、sysdirectives システム カタログ表からの外 部問合せ最適化ディレクティブの、既存アプリケーション内の問合せ への適用を、許容するかどうかを指定します。デフォルトは OFF で す。可能値は次のとおりです。 ON 外部オプティマイザ ディレクティブを受け入れます。 OFF 外部オプティマイザ ディレクティブを受け入れません。 1 外部オプティマイザ ディレクティブを受け入れます。 0 外部オプティマイザ ディレクティブを受け入れません。 IFX_GET_SMFLOAT_AS_FLOAT 0 (デフォルト) に設定されていると、Informix の小桁実数 (SMALLFLOAT) 型を JDBC の小桁実数 (REAL) 型にマップします。 この設定は JDBC 仕様に準拠しています。 1 に設定されていると、 Informix の小桁実数 (SMALLFLOAT) 型を JDBC の実数 (FLOAT) 型にマップします。この設定により、IBM Informix JDBC ドライバの 以前のバージョンとの下位方向の互換性が有効になります。 IFX_ISOLATION_LEVEL 同時に同一行へのアクセスを試みるプロセス間の同時実行性の度合い を定義します。Informix 固有の変数 IFX_ISOLATION_LEVEL の値を 取得します。デフォルト値は 2 (確定読込み) です。この値が明示的 に設定されている場合は、その設定された値を戻します。戻り値: 整 数。 Informix 固有の変数 IFX_ISOLATION_LEVEL の値を設定します。可 能値は次のとおりです。 v 1 - 単純読込み (TRANSACTION_READ_UNCOMMITTED と同じ) v 2 - 確定読込み (TRANSACTION_READ_COMMITTED と同じ) v 3 - カーソル安定性 (TRANSACTION_READ_COMMITTED と同じ) v 4 - 繰返し可能読込み (TRANSACTION_REPEATABLE_READ と同じ) モードの後に U を指定すると、更新ロックが保持されます。(表の後 にある注、重要 を参照してください。) 例えば、次のように値を指定 できます。2U (SET ISOLATION TO COMMITTED READ RETAIN UPDATE LOCKS と同じ)。 IFX_FLAT_UCSQ 28 グローバル設定をオーバーライドし、すべてのセッションについて副 問合せの単調化を使用するようオプティマイザに指示します。デフォ ルト値は、1 です。 IBM Informix JDBC ドライバ プログラマーズ ガイド サポートされている Informix 環境変数 説明 IFX_LOCK_MODE_WAIT アプリケーションは、このプロパティを使用して、ロックされた行や 表にアクセスするデフォルトのサーバ プロセスを上書きできます。 Informix 固有の変数 IFX_LOCK_MODE_WAIT の値を取得します。デ フォルト値は 0 (ロックを待機しない) です。この値が明示的に設定 されている場合は、その設定された値を戻します。戻り値: 整数。 Informix 固有の変数 IFX_LOCK_MODE_WAIT の値を設定します。可 能値は次のとおりです。 v -1 ロックが解放されるまで待機する。 v 0 待機せずに操作を終了し、エラーを戻す。 v nn nn 秒間、ロックが解放されるのを待機する。 IFX_PAD_VARCHAR 可変長文字 (VARCHAR) 型に関連付けられたデータが、Dynamic Server 9.4 以降のサーバとの間で転送される方法を制御します。 Connection クラス使用時に接続 URL で、または DataSource クラス 使用時にプロパティとして設定できます。有効な値は、0 (デフォル ト) と 1 です。 v 0 に設定されていると、データを含む可変長文字 (VARCHAR) 型 の部分のみが転送されます (後続の空白文字は除去されます)。 v 1 に設定されていると、可変長文字 (VARCHAR) 型データ構造全 体がサーバとの間で転送されます。 IFX_SET_FLOAT_AS_SMFLOAT 0 (デフォルト) に設定されていると、JDBC の実数 (FLOAT) 型を Informix の実数 (FLOAT) 型にマップします。この設定は JDBC 仕様 に準拠しています。1 に設定されていると、JDBC の実数 (FLOAT) 型を Informix の小桁実数 (SMALLFLOAT) 型にマップします。この 設定により、IBM Informix JDBC ドライバの以前のバージョンとの下 位方向の互換性が有効になります。 IFX_TRIMTRAILINGSPACES 後続の空白文字を削除します。デフォルト値は、1 です。 IFX_USEPUT 1 に設定すると、バルク挿入が有効になります。詳しくは、59 ページ の『バルク挿入の実行』を参照してください。 IFX_XASPEC y に設定されていると、同一の広域トランザクション ID を持つ XA トランザクションは密結合され、ロック領域を共用します。これは、 XA 接続にのみ適用され、データベース URL には指定できません。 DataSource の設定者 ( 227 ページの『付録 B. DataSource 拡張機能』 を参照) により、または同一の名前でシステム (JVM) プロパティを設 定することにより、指定できます。DataSource プロパティは、システ ム プロパティを上書きします。プロパティに対する y、Y、n、または N 以外の値は無視されます。IfxDataSource.getIfxIFX_XASPEC は、最 終 IFX_SPEC 値 (y か n のいずれか) を戻します。例えば、 DataSource IFX_XASPEC の値が n に等しく、システムの IFX_XASPEC の値が Y または y に等しい場合は、n が戻されます。 第 2 章 データベースへの接続 29 サポートされている Informix 環境変数 説明 IFX_XASTDCOMPLIANCE_XAEND XA_RB* が戻されたときの XA_END の動作を指定します。 0 XID は忘却されません。トランザクションはロールバックの みの状態です。これは XA_SPEC+ に準拠しており、IDS 10.0 以降でのデフォルトの動作です。 1 XID は忘却されます。トランザクションは存在しません。こ れは、IDS 9.40 でのデフォルトの動作です。 詳しくは、「IBM Informix SQL ガイド: リファレンス」を参 照してください。 DISABLE_B162428_XA_FIX (IDS 10.0) ENABLE_B162428_XA_FIX (IDS 9.40) IFXHOST ホスト名、またはホストの IP アドレスを設定します。 IFXHOST_SECONDARY HDR 接続のリダイレクトのための副ホスト名またはホスト IP アドレ スを設定します。 INFORMIXCONRETRY INFORMIXCONTIME の値で指定される時間制限の間に、各データ ベース サーバに対してクライアントが行える追加の接続試行回数の最 大数を指定します。 INFORMIXCONTIME データベース サーバへの接続試行のタイムアウト期間を設定します。 接続試行がこの時間内に成功しない場合、その試行はアボートされ、 接続エラーが報告されます。デフォルト値は 0 秒です。この変数は、 ソケット メソッドのブロック、およびソケット接続のためのタイムア ウトを追加します。 INFORMIXOPCACHE クライアント アプリケーションのステージング領域の BLOB 領域用 のメモリ キャッシュ サイズを指定します。 INFORMIXSERVER クライアント アプリケーションから明示的または暗黙的に接続される デフォルトのデータベース サーバを指定します。 INFORMIXSERVER_SECONDARY 主データベース サーバを使用できない場合に、クライアント アプリ ケーションから明示的または暗黙的に接続される、HDR ペア内の副 データベース サーバを指定します。 INFORMIXSTACKSIZE データベース サーバが特定のクライアント セッションのために使用 するスタック サイズを KB 単位で指定します。 JDBCTEMP スマート ラージ オブジェクトを処理するための一時ファイルを作成 する場所を指定します。絶対パス名を指定する必要があります。 30 IBM Informix JDBC ドライバ プログラマーズ ガイド サポートされている Informix 環境変数 説明 LOBCACHE データベース サーバから取り出されるラージ オブジェクト データ用 のバッファ サイズを決定します。指定可能な値は次のとおりです。 v 0 より大きい数値。 データを保持するために、メモリ内に最大バイ ト数が割り当てられます。データ サイズが LOBCACHE 値を超え る場合、データは一時ファイルに格納されます。このファイルの作 成中にセキュリティ違反が発生した場合、データはメモリ内に格納 されます。 v ゼロ (0)。 データは常にファイルに格納されます。セキュリティ違 反が発生した場合でも、ドライバはデータをメモリ内に格納しよう としません。 v 負の数値。データは常にメモリに格納されます。必要なメモリ量を 使用できない場合は、エラーが発生します。 LOBCACHE 値が指定されない場合のデフォルトは、4096 バイトで す。 NEWNLSMAP NLS ロケールと JDK ロケール、および JDK コード セットとの間の 新規マッピングを定義できるようにします。 詳しくは、 204 ページの『ユーザ定義のロケール』を参照してくださ い。 NODEFDAC YES に設定されていると、ANSI 標準準拠でないデータベースに新規 表またはルーチンが作成されたときに、PUBLIC ユーザに対してデフ ォルトの表アクセス権とルーチン アクセス権が認可されません。デフ ォルトは NO です。 OPT_GOAL オプティマイザの問合せパフォーマンス目標を指定します。アプリケ ーションを開始する前に、ユーザ環境でこの変数を設定してくださ い。ドライバはこの変数を使用しません。その値をサーバに渡すだけ です。 OPTCOMPIND 問合せオプティマイザが使用する結合方式を指定します。 OPTOFC 1 に設定されていると、すべての該当行がすでにクライアントのタプ ル バッファに抽出されている場合、ResultSet.close() メソッドはネッ トワーク ラウンド トリップを必要としません。データベース サーバ は、すべての行が抽出された後で、自動的にカーソルをクローズしま す。次の ResultSet.next() メソッドが呼び出される前に、IBM Informix JDBC ドライバがクライアントのタプル バッファに追加の行 を持っていない場合があります。したがって、IBM Informix JDBC ド ライバがデータベース サーバからすべての行を受信したのでなけれ ば、OPTOFC が 1 に設定されている場合でも、ResultSet.close() メ ソッドがネットワーク ラウンド トリップを必要とする場合がありま す。 PATH 実行可能プログラムを検索するディレクトリを指定します。 PDQPRIORITY データベース サーバによって使用される並列処理の度合いを決定しま す。 PLCONFIG ハイパフォーマンス ローダによって使用される構成ファイルの名前を 指定します。 第 2 章 データベースへの接続 31 サポートされている Informix 環境変数 説明 PLOAD_LO_PATH スマート ラージ オブジェクト ハンドルに対するパス名 (BLOB 型、 CLOB 型、およびブール (BOOLEAN) 型などのスマート ラージ オ ブジェクトの格納場所を識別) を指定します。 ドライバはこの変数を使用しません。その値をサーバに渡すだけで す。 PORTNO_SECONDARY HDR ペアの副データベース サーバのポート番号を指定します。ポー ト番号は /etc/services ファイルにリストされています。 PROXY HTTP プロキシ サーバを指定します。詳しくは、39 ページの『HTTP プロキシ サーバの使用』を参照してください。 PSORT_DBTEMP データベース サーバがソートの実行時に使用する一時ファイルを書き 込む 1 つ以上のディレクトリを指定します。 PSORT_NPROCS ソート用により多くのスレッドを割り当てることにより、データベー ス サーバが並列ソート パッケージのパフォーマンスを向上できるよ うにします。 SECURITY サーバへのパスワード送信に 56 ビット暗号化を使用します。詳しく は、 46 ページの『パスワード暗号化の使用』を参照してください。 SQLH_TYPE FILE に設定されている場合、データベース情報 (host-name、 port-number、user、password など) が、sqlhosts ファイルで指定され ていることを示します。 LDAP に設定されている場合、この情報が LDAP サーバで指定され ていることを示します。 詳しくは、33 ページの『Informix sqlhosts ファイルの動的読取り』を 参照してください。 SQLIDEBUG 2 進数 SQLI トレースの書込み先であるファイルのパス名を指定しま す。接続ごとに、タイムスタンプの接尾辞が付加された、新規トレー ス ファイルが生成されます。SQLI トレース機能は、IBM テクニカ ル サポート エンジニアから指示された場合にのみ使用してくださ い。 STMT_CACHE 1 に設定されていると、セッションで共有文キャッシュを使用できる ようになります。 この機能により、メモリ消費が削減され、異なるユーザ セッション間 での問合せ処理が高速になる場合があります。ドライバはこの変数を 使用しません。その値をサーバに渡すだけです。 USEV5SERVER 1 に設定されている場合、Java プログラムが IBM Informix OnLine 5.x、IBM Informix SE 5.x、または IBM Informix SE 7.x データベー ス サーバに接続していることを示します。 IBM Informix OnLine 5.x、IBM Informix SE 5.x、または IBM Informix SE 7.x データベース サーバに接続している場合、この環境 変数は必須です。 重要: Informix Dynamic Server バージョン 5.x では RETAIN UPDATE LOCKS は サポートされていません。 5.x サーバへの接続時には、U オプションは無視 されます。 以下は、環境変数 IFX_LOCK_MODE_WAIT および IFX_ISOLATION_LEVEL のコード例です。 v IFX_LOCK_MODE_WAIT 32 IBM Informix JDBC ドライバ プログラマーズ ガイド Connection conn = DriverManager.getConnection ( "jdbc:Informix-sqli://cleo:1550: INFORMIXSERVER=cleo_921;IFXHOST=cleo;PORTNO=1550;user=rdtest; password=my_passwd; IFX_LOCK_MODE_WAIT=1";); v IFX_ISOLATION_LEVEL Connection conn = DriverManager.getConnection( "jdbc:Informix-sqli://cleo:1550: INFORMIXSERVER=cleo_921;IFXHOST=cleo;PORTNO=1550;user=rdtest; password=my_passwd; IFX_ISOLATION_LEVEL=1U";); 重要: 排他プロパティは、データベースへの明示的な接続の場合にのみ URL で設 定できます。サーバのみの接続の場合、このプロパティは接続時に無視され ます。 特定の環境変数の詳細な説明については、「IBM Informix SQL ガイド: リファレン ス」を参照してください。このガイドのオンライン バージョンは、 http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp にあります。 Informix sqlhosts ファイルの動的読取り IBM Informix JDBC ドライバは、JNDI (Java Naming and Directory Interface) をサ ポートしています。 このサポートにより、JDBC プログラムは Informix sqlhosts ファイルにアクセスできます。 sqlhosts ファイルにより、クライアント アプリケ ーションはネットワーク上の任意の場所にある Informix データベース サーバを検 索して接続できます。 このファイルの詳細については、ご使用のデータベース サ ーバの「IBM Informix 管理者ガイド」を参照してください。 sqlhosts データには、ローカル ファイル、または LDAP サーバからアクセスでき ます。システム管理者は、Informix のユーティリティを使用して、sqlhosts データ を LDAP サーバにロードする必要があります。 CLASSPATH 変数が、JNDI JAR (Java アーカイブ) ファイル、および LDAP SPI (サービス プロバイダ インターフェイス) JAR ファイルを参照している必要があり ます。 オブジェクト クラス extensibleObject をサポートする LDAP バージョン 3.0 以降を使用する必要があります。 sqlhosts ファイルのグループ オプションを使用して、INFORMIXSERVER の値に対する データベース サーバ グループの名前を指定できます。グループ オプションは高可 用性データ レプリケーション (HDR) で役立ちます。HDR ペアの主データベース サーバと副データベース サーバを順番にリストします。sqlhosts ファイルでのグル ープの設定または使用方法の詳細については、「IBM Informix 管理者ガイド」を参 照してください。HDR の詳細については、36 ページの『高可用性データ レプリケ ーションの使用』を参照してください。 未署名のアプレットは、sqlhosts ファイルまたは LDAP サーバにアクセスできませ ん。詳しくは、11 ページの『アプレットでのドライバの使用』を参照してくださ い。 接続プロパティ構文 ホスト名またはポート番号を、データベース URL または DataSource オブジェク トで直接指定する代わりに、IBM Informix JDBC ドライバに LDAP サーバでそれ らをルックアップさせることができます。 LDAP サーバ用に、データベース URL または DataSource オブジェクトに以下のプロパティを指定する必要があります。 第 2 章 データベースへの接続 33 v SQLH_TYPE=LDAP v LDAP_URL=ldap://host-name:port-number host-name および port-number は LDAP サーバのもので、データベース サーバ のものではありません。 v LDAP_IFXBASE=Informix-base-DN v LDAP_USER=user v LDAP_PASSWD=password LDAP_USER および LDAP_PASSWD を指定しない場合、IBM Informix JDBC ド ライバは無名検索を使用して LDAP サーバを検索します。 LDAP 管理者は、 sqlhosts のエントリに対して無名検索が許可されていることを確認する必要があり ます。詳しくは、ご使用の LDAP サーバのマニュアルを参照してください。 Informix-base-DN の基本フォーマットは次のとおりです。 cn=common-name,o=organization,c=country common-name、organization、または country が複数の単語から構成される場合は、 それぞれの単語に対して 1 つのエントリを使用します。次に例を示します。 cn=informix,cn=software データベース URL の例を次に示します。 jdbc:informix-sqli:informixserver=value;SQLH_TYPE=LDAP; LDAP_URL=ldap://davinci:329;LDAP_IFXBASE=cn=informix, cn=software,o=kmart,c=US;LDAP_USER=abcd;LDAP_PASSWD=secret また、データベース URL または DataSource オブジェクトで sqlhosts ファイルを 指定することもできます。/etc/services ファイルに指定された Informix データベー ス サーバのホスト名とポート番号またはサービス名が、sqlhostsファイルから読み 取られます。このファイルに対して以下のプロパティを指定する必要があります。 v SQLH_TYPE=FILE v SQLH_FILE=sqlhosts-filename sqlhosts ファイルは、ローカル、リモートのどちらでも構わないため、ローカル フ ァイル システム フォーマットで参照することも、URL フォーマットで参照するこ ともできます。以下に、例を示します。 v SQLH_FILE=http://host-name:port-number/sqlhosts.ius SQLH_FILE=http://host-name:service-name/sqlhosts.ius Informix データベース サーバの host-name と port-number または service-name (etc/services ファイルに記載) 要素は、sqlhosts ファイルがあるサーバのもので す。 v SQLH_FILE=file://D:/local/myown/sqlhosts.ius v SQLH_FILE=/u/local/sqlhosts.ius データベース URL の例を次に示します。 jdbc:informix-sqli:informixserver=value;SQLH_TYPE=FILE; SQLH_FILE=/u/local/sqlhosts.ius 34 IBM Informix JDBC ドライバ プログラマーズ ガイド データベース URL または DataSource オブジェクトが LDAP サーバまたは sqlhosts ファイルを参照しており、IP アドレス、ホスト名、およびポート番号の直 接指定も行っている場合は、データベース URL または DataSource オブジェクト で指定された IP アドレス、ホスト名、およびポート番号が優先されます。 DataSource オブジェクトを使用してこれらの接続プロパティを設定する方法につい ては、 227 ページの『付録 B. DataSource 拡張機能』を参照してください。 アプレットを使用している場合、またはデータベースがファイアウォールの後ろに ある場合、通信するためには追加の層で実行されている HTTP プロキシ サーブレ ットが必要です。詳しくは、39 ページの『HTTP プロキシ サーバの使用』を参照 してください。 管理要件 JDBC プログラムがルックアップする可能性のある sqlhosts 情報を LDAP サーバ に保管するには、以下の要件が満たされている必要があります。 v LDAP サーバは、クライアントがアクセス可能なコンピュータ上にインストール する必要があります。LDAP 管理者は、LDAP サーバに IFXBASE エントリを作 成する必要があります。 LDAP ディレクトリ サーバの詳細については、以下を参照してください。 http://java.sun.com/products/jndi/ http://www.openldap.org v Informix の SqlhUpload および SqlhDelete ユーティリティを使用する場合は、 sqlhosts ファイルの servicename フィールドがデータベース サーバのポート番号 を指定している必要があります。これらのユーティリティにより、フラット ASCII ファイルからの sqlhosts エントリのロード、または削除を行うことができ ます。 詳しくは、次の『LDAP サーバを sqlhosts のデータで更新するためのユ ーティリティ』を参照してください。 v LDAP 管理者は、sqlhosts のエントリに対する無名検索が許可されていることを 確認する必要があります。詳しくは、LDAP サーバのマニュアルを参照してくだ さい。 LDAP サーバを sqlhosts のデータで更新するためのユーティリ ティ SqlhUpload および SqlhDelete ユーティリティは ifxtools.jar にパッケージされて いるため、CLASSPATH 変数が ifxtools.jar (デフォルトでは、IBM Informix JDBC ドライバのインストール ディレクトリ下の lib ディレクトリにある) を指している 必要があります。また、CLASSPATH 変数が JNDI JAR ファイルと LDAP SPI JAR ファイルを指していることも確認してください。 SqlhUpload このユーティリティは、sqlhosts エントリを、フラット ASCII ファイルから LDAP サーバに、定められたフォーマットでロードします。次のコマンドを入力します。 java SqlhUpload sqlhfile.txt host-name:port-number [sqlhostsRdn] パラメータの意味は以下のとおりです。 第 2 章 データベースへの接続 35 v アップロードされる sqlhosts ファイルは、sqlhfile.txt です。 v LDAP サーバのホスト名とポート番号は、host-name:port-number です。 v LDAP の Informix ベース下の sqlhosts ノードの RDN (相対識別名) は、 sqlhostsRdn です。デフォルト名は sqlhosts です。 このユーティリティは、LDAP サーバでの Informix ベース DN (識別名)、LDAP ユーザ、パスワードなど、その他の必要な情報を求めるプロンプトを出します。 sqlhosts ファイルの servicename フィールドを、整数 (ポート番号) を表す文字列 に変換する必要があります。これは、Java.Socket クラスがポート番号に対して英数 字の servicename 値を受け入れられないためです。 servicename フィールドの詳細 については、ご使用のデータベース サーバの「IBM Informix 管理者ガイド」を参照 してください。 SqlhDelete このユーティリティは、LDAP サーバから sqlhosts エントリを削除します。次のコ マンドを入力します。 java SqlhDelete host-name:port-number [sqlhostsRdn] このコマンドのパラメータの意味は、SqlhUpload ユーティリティに対してリストさ れているパラメータの意味と同じです。35 ページの『SqlhUpload』を参照してくだ さい。 このユーティリティは、LDAP サーバでの Informix ベース DN、LDAP ユーザ、パ スワードなど、その他の必要な情報を求めるプロンプトを出します。 高可用性データ レプリケーションの使用 高可用性データ レプリケーション (HDR) は、深刻な障害が発生したときにアプリ ケーションがすぐにアクセスできる、データベース サーバ全体のバックアップ コ ピーを管理することにより、IBM Informix Dynamic Server (IDS) に対して同期デー タ レプリケーションを提供します。レプリケーション ペアのいずれかのデータベ ース サーバに障害が発生した場合、クライアントは代替データベース サーバに接 続するようにリダイレクトされます。HDR の詳細については、ご使用のデータベー ス サーバの「IBM Informix 管理者ガイド」を参照してください。 HDR サーバのペアは、主サーバと副サーバから構成されています。主サーバがデフ ォルト サーバです。副サーバは読取り専用です。更新操作は許可されません。 HDR をサポートするアプリケーション コードを記述するには、以下のガイドライ ンに従ってください。これらのガイドラインについては後続のセクションで説明し ます。 v 副サーバ接続プロパティを設定して HDR を有効にします。 v サーバが読取り専用 (副サーバ) かどうかを確認し、適切な処置を取ります。 v 接続に失敗した場合は、代替サーバに接続を再試行し、問合せを再実行します。 HDR を接続プールとともに使用できます。詳しくは、214 ページの『高可用性デー タ レプリケーションの接続プールとの併用』を参照してください。 36 IBM Informix JDBC ドライバ プログラマーズ ガイド IBM Informix JDBC ドライバのインストール場所の demo ディレクトリ内の hdr ディレクトリに、デモンストレーション プログラムがあります。これらのファイル の詳細については、付録 A を参照してください。 副サーバ接続プロパティ 副サーバを指定し、接続 URL で以下の接続プロパティを使用して HDR を有効に します。 v INFORMIXSERVER_SECONDARY = secondary_server; v PORTNO_SECONDARY = secondary_portnumber; v IFXHOST_SECONDARY = secondary_hostmachine; v ENABLE_HDRSWITCH = true; 次の例は、hdr1 と hdr2 という HDR サーバのペアに対する接続 URL を示してい ます。 jdbc:informix-sqli://123.45.67.89:1533/testDB: INFORMIXSERVER=hdr1;IFXHOST=host1;PORTNO=1500; user=rdtest;password=test;INFORMIXSERVER_SECONDARY=hdr2; IFXHOST_SECONDARY=host2;PORTNO_SECONDARY=1600; ENABLE_HDRSWITCH=true; DataSource オブジェクトを使用している場合、setXXX() および getXXX() メソッド を使用して、副サーバの接続プロパティを設定および取得できます。これらのメソ ッドは、229 ページの『Informix 接続プロパティの取得と設定』のセクションに対 応する接続プロパティとともにリストされています。 接続 URL で、INFORMIXSERVER、PORTNO、および IFXHOST の各プロパティ を編集することにより、接続先を HDR ペアの副サーバに手動で変更できます。手 動で接続先を変更するためには、アプリケーション コードを編集してからアプリケ ーションを再起動する必要があります。 HDR ペアでのグループ記入項目への接続 JDBC アプリケーションが sqlhosts ファイルのグループ記入項目を使用してサーバ へ接続する場合、かつグループ記入項目が HDR ペアの一部である場合は、JDBC ドライバが 1 次サーバへ接続されます。グループを定義する以下のような sqlhosts ファイルについて検討してください。 g_1000 group - - i=100 ids1000_secondary ontlitcp amazon sec_1000 g=g_1000 ids1000_primary ontlitcp amazon prim_1000 g=g_1000 JDBC アプリケーションが、接続 URL (この sqlhosts ファイルとそのグループ名を 使用して接続する) を使用する場合は、JDBC ドライバは常に 1 次サーバへ接続さ れます。このような URL の例を次に示します。 "jdbc:informix-sqli:informixserver=g_1000; user=foo;password=XXXX;SQLH_TYPE=FILE; SQLH_FILE=/informix/sqlhosts" JDBC ドライバがグループ内で 1 次サーバを検出できない場合は、例外がスローさ れます。 第 2 章 データベースへの接続 37 注: 1 次サーバへの接続の実行は、Dynamic Server バージョン 9.40.XC6 以降での み使用可能です。 読取り専用状態の検査 副サーバは読取り専用であるため、副サーバへの接続である場合、更新操作は失敗 します。したがって、更新操作を開始する前に読取り専用接続を検査するようにア プリケーションを記述する必要があります。 次の表のメソッドを使用して、サーバのタイプ、および HDR が有効かどうかを検 査します。 取得される情報 メソッド シグニチャ 注 サーバが読取り専用 (副サー バ) かどうか public boolean is ReadOnly() throws SQLException アクティブ サーバが副サーバである場合 は true を戻します。 データベース アクセス エラーが発生す ると例外を戻します。 ENABLE_HDRSWITCH が false に設定 されていると、isReadOnly() は、最後に HDR 接続の取得に成功した後の初期設定 値を戻します。 HDR が有効かどうか public boolean is HDREnabled() HDR ペアの両方のサーバが使用可能な場 合は true を戻します。 いずれかのサーバを使用できない場合は false を戻します。 サーバのタイプ (主、副、ま たは標準) public string getHDRtype() 主サーバの場合は primary または standard、副サーバの場合は secondary を 戻します。 データベース管理者は、手動でサーバの タイプをリセットできます。 例えば、以下のいずれかのストラテジを使用できます。 v 更新操作を含む可能性がある各 SQL 文の前に isReadOnly() メソッドを使用しま す。isReadOnly() の値が true である場合は、ユーザへのエラー メッセージの送 信やサーバ管理者への通知などの適切な処置を実行します。 v ユーザは、接続の確立後に isReadOnly() メソッドを呼び出し、その後 READ_ONLY のようなフラグを設定して、フラグ値に基づいて操作を実行しま す。 管理者は、更新操作を可能にするために、手動で副サーバを主サーバに切り替える ことができます。ただし、このプロセスでサーバをシャットダウンする必要がある ため、接続とコミットされていないトランザクションが失われることになります。 接続の再試行 問合せ操作中に接続が失われた場合に IBM Informix JDBC ドライバが副データベ ース サーバへの新規接続を戻してアプリケーションが問合せを再実行するように、 アプリケーションを記述します。 38 IBM Informix JDBC ドライバ プログラマーズ ガイド 次のコードは、副サーバの情報を使用して接続を再試行し、主サーバの接続が失敗 したためにエラーを受け取った SQL 文を再実行する方法を示しています。 public class HDRConnect { static IfmxConnection conn; public static void main(String[] args) { getConnection(args[0]); doQuery( conn ); closeConnection(); } static void getConnection( String url ) { .. Class.forName("com.informix.jdbc.IfxDriver"); conn = (IfmxConnection )DriverManager.getConnection(url); } static void closeConnection() { try { conn.close(); } catch (SQLException e) { System.out.println("ERROR: failed to close the connection!"); return; } } static void doQuery( Connection con ) { int rc=0; String cmd=null; Statement stmt = null; try { // execute some sql statement } catch (SQLException e) { if (e.getErrorCode() == -79716 ) || (e.getErrorCode() == -79735) // system or internal error { // This is expected behavior when primary server is down getConnection(url); doQuery(conn); } else System.out.println("ERROR: execution failed - statement: " + cmd); return; } } HTTP プロキシ サーバの使用 ネットワーク セキュリティにより、クライアント アプリケーションが実行できる 内容にいくつかの制限が課せられます。 v アプレットは、そのアプレットがダウンロードされたホストに対してのみ通信で きます。 第 2 章 データベースへの接続 39 v クライアントとデータベース サーバとの間にファイアウォールが存在するとき は、JDBC クライアントとデータベースとの間の直接 IP 接続は許可されませ ん。 Informix HTTP プロキシは、これら両方の問題に対処します。 プロキシは、JDBC クライアントと Informix データベース サーバの間のミドル層で実行されるサーブ レットです。 プロキシは、JDBC クライアントから SQL 要求を抽出し、その要求 をデータベース サーバに転送します。クライアント (エンド ユーザ) はこのミドル 層を認識しません。 HTTP プロキシ機能は JDBC 2.0 仕様に含まれていません。 図 1 は、プロキシがファイアウォールの後ろにあるデータベースへの接続をどのよ うにして有効にするかを示しています。 図 1. ファイアウォールを介した接続 プロキシ サーバを使用するための環境構成 HTTP プロキシは、サーブレットをサポートする Web サーバ (サーブレット エン ジンが 2.1 以降のサーブレット API を使用している Web サーバが望ましい) を必 要とします。このプロキシは 2.0 以前のサーブレット API と互換性があります が、PROXYTIMEOUT 機能は 2.1 以降の API でのみ有効です。 プロキシ サーバ用に環境を構成するには: 1. Web サーバ構成で、プロキシ サーブレットに対するサーブレット別名またはコ ンテキストを定義します。 JDBC ドライバは、すべてのクライアント HTTP 要求を以下に送信します。 http://your-web-server:port/pathname/IfxJDBCProxy この IfxJDBCProxy はプロキシ サーブレット、pathname はプロキシ サーブレ ットへのパスです。ご使用の Web サーバのマニュアルで、サーブレットを構成 する正しい方法を調べてください。 40 IBM Informix JDBC ドライバ プログラマーズ ガイド 2. 3 つのクラス ファイル、IfxJDBCProxy.class、SessionMgr.class、および TimeoutMgr.class を、前のステップで指定したサーブレット ディレクトリにコ ピーします。 これらのクラス ファイルは、製品バンドルのインストール後、IBM Informix JDBC ドライバのインストール ディレクトリ下のディレクトリ proxy にありま す。 3. IBM Informix JDBC ドライバ ファイル ifxjdbc.jar を、Web サーバの CLASSPATH 設定に追加します。 Web サーバの中には、そのサーバが起動された環境の CLASSPATH を使用する ものと、Web サーバ固有のプロパティ ファイルから CLASSPATH を取得する ものがあります。Web サーバのマニュアルで、CLASSPATH 設定を更新する正 しい場所を調べてください。 4. Web サーバを開始し、次の URL を入力して、プロキシが正しくインストール されていることを確認します。 http://server-host-name:port-number/servlet/ IfxJDBCProxy プロキシは、次のようなバナーで応答します。 -- Informix Proxy Servlet v220 Servlet API 2.1 -- v220 は、Informix プロキシ バージョンを表します。 Servlet API 2.1 は、 Web サーバのサーブレット API のバージョンを表します。 サーブレット API が 2.0 以前である場合、バナーには Servlet API 0.0 と表 示されます。 5. プロキシの構成後、アプレットまたはアプリケーションの URL の後に次のよう な内容を追加します。 PROXY=server-host-name:port-number 次に例を示します。 jdbc:informix-sqli://123.45.67.89:1533:INFORMIXSERVER= myserver;user=rdtest;password=test; PROXY=webserver:1462; Web サーバにより、プロキシ サーブレットは、Web サーバの起動時にロードされ る場合と、アプレットまたはアプリケーションの接続オブジェクトの URL で初め て参照されたときにロードされる場合があります。 以下の Web サイトにプロキシ サーブレットに関する詳細情報があります。 v http://java.sun.com/products/servlet/ v http://java.sun.com/ v http://www.sun.com/java v http://java.apache.org タイムアウトの指定 PROXYTIMEOUT キーワードを使用してプロキシのタイムアウト値を指定できま す。PROXYTIMEOUT 値は、クライアント サイド JDBC ドライバがプロキシにキ 第 2 章 データベースへの接続 41 ープアライブ要求を送信する頻度を指定します。 PROXYTIMEOUT 値は秒単位で 表されます。指定可能な値は 60 以上です。 クライアントにより PROXYTIMEOUT が指定されると、プロキシはクライアント のセッション有効期限を 2 x PROXYTIMEOUT に等しい値に設定します。例えば、 PROXYTIMEOUT が 60 秒に設定された場合、プロキシはクライアントの有効期限 を 120 秒に設定します。有効期限に達すると、プロキシはクライアントのセッショ ン リソースを削除し、そのデータベース接続をクローズします。 プロキシは、クライアントからの通信が受信されるたびにタイムアウト間隔をリセ ットします。以下に、PROXYTIMEOUT に対して有効ないくつかの値を示します。 PROXYTIMEOUT=-1 クライアント タイムアウト機能を使用不可にしま す。 PROXYTIMEOUT=nnn クライアントは nnn 秒ごとにキープアライブ要求 をプロキシに送信します。nnn の値は 60 以上であ る必要があります。 PROXYTIMEOUT=60 PROXYTIMEOUT が指定されない場合のデフォルト 値。 プロキシ タイムアウト機能は、JDBC 接続をクローズして最初にプロキシにクロー ズ要求を送信することなく、クライアント セッションが終了したかどうかを判別す るのに役立ちます。プロキシは、クライアントが以下のいずれかに該当するまで、 オープンされたデータベース接続をクライアントのために維持します。 v 明示的にデータベース接続をクローズする v タイムアウト間隔を超える onstat データベース ユーティリティは、予期せずに終了して PROXYTIMEOUT が -1 に設定されたすべてのクライアント セッションに対してオープンされているセ ッションを表示します。 次の例は、PROXYTIMEOUT を指定します。 jdbc:informix-sqli://123.45.67.89:1533:informixserver=myserver; user=rdtest;password=test; PROXY=webserver:1462?PROXYTIMEOUT=180; プロキシを使用するサンプルのアプレットおよびアプリケーションについては、ド ライバをインストールしたディレクトリ下の demo/proxy ディレクトリを参照して ください。 LDAP サーバとプロキシの併用 プロキシは、JDBC アプレットおよびアプリケーションが、データベース接続情報 を代替方法として LDAP サーバから取得することを可能にします。この機能を使用 する場合は、LDAP サーバをインストールする必要があります。 IBM Informix JDBC ドライバとともに LDAP サーバを使用する方法に関する一般情報について は、33 ページの『接続プロパティ構文』以降のセクションを参照してください。 43 ページの図 2 は、プロキシが LDAP サーバとどのように連動するかを示してい ます。また、この図は sqlhosts ファイルからのルックアップも示しています。詳し 42 IBM Informix JDBC ドライバ プログラマーズ ガイド くは、44 ページの『sqlhosts ファイル ルックアップの指定』を参照してください。 図 2. プロキシによるルックアップ プロキシ LDAP 機能は、JNDI クラス ライブラリと LDAP サービス プロバイダ ファイル (jndi.jar、ldap.jar、および providerutil.jar) を必要とします。これらの JAR ファイルは、http://java.sun.com/products/jndi/index.html#download からダウンロ ードできます。 ファイルをダウンロードしてインストールした後で、それらの絶対パス名を Web サーバの CLASSPATH 設定に追加します。これらのファイルは、インストール デ ィレクトリ下の lib ディレクトリにあります。 LDAP ルックアップが実行される場所の指定 その他の LDAP キーワードとともに使用された場合、SQLH_LOC キーワードは LDAP ルックアップが実行される場所を示します。 SQLH_LOC の値は、CLIENT または PROXY のいずれかです。値が CLIENT である場 合は、ドライバがクライアント サイドで LDAP ルックアップを実行します。値が PROXY である場合は、プロキシがサーバ サイドでルックアップを実行します。値が 指定されていない場合、ドライバはデフォルト値として CLIENT を使用します。 サーバ サイド LDAP ルックアップを指定する LDAP キーワードを含む、アプレッ トまたはアプリケーションの URL のフォーマットを次に示します。 jdbc:informix-sqli:informixserver=informix-server-name; PROXY=proxy-hostname-or-ip-address:proxy-port-no? PROXYTIMEOUT=60;SQLH_TYPE=LDAP;LDAP_URL=ldap: //ldap-hostname-or-ip-address:ldap-port-no;LDAP_IFXBASE=dc=mydomain,dc=com;SQLH_LOC=PROXY; 次の例は、データベース サーバのホスト名とポートを、LDAP サーバから取得しま す。 第 2 章 データベースへの接続 43 jdbc:informix-sqli:informixserver=samsara;SQLH_TYPE=LDAP; LDAP_URL=ldap://davinci:329;LDAP_IFXBASE=cn=informix, o=kmart,c=US;LDAP_USER=abcd;LDAP_PASSWD=secret;SQLH_LOC=PROXY; PROXY=webserver:1462 LDAP サーバをプロキシと併用する完全な例については、 JDBC ドライバのインス トール場所の demo ディレクトリにある proxy アプレットおよびアプリケーショ ンを参照してください。 sqlhosts ファイル ルックアップの指定 プロキシを使用している場合、SQLH_LOC キーワードは sqlhosts ファイル ルック アップにも適用されます。URL に SQLH_LOC=PROXY が含まれる場合、ドライバ はサーバ上の sqlhosts ファイルを読み取ります。SQLH_LOC=PROXY が指定され ていない場合、ドライバはクライアント上のファイルを読み取ります。 次の例は、サーバ上の sqlhosts ファイルから情報を取得します。 jdbc:informix-sqli:informixserver=samsara;SQLH_TYPE=FILE; SQLH_FILE=/work/9.x/etc/sqlhosts;SQLH_LOC=PROXY; PROXY=webserver:1462 その他の多層ソリューションの使用 多層環境で IBM Informix JDBC ドライバを使用するその他の方法には、次のよう なものがあります。 v リモート メソッド起動 (RMI)。IBM Informix JDBC ドライバは、Java アプレッ トまたはアプリケーションと Informix データベース マシンとの間のミドル層で あるアプリケーション サーバに常駐します。RMI の例が IBM Informix JDBC ドライバに含まれています。詳細については、 217 ページの『付録 A. サンプル コード ファイル』を参照してください。 v CORBA などの、その他の通信プロトコル。IBM Informix JDBC ドライバは、 Java アプレットまたはアプリケーションと Informix データベース コンピュータ との間のミドル層であるアプリケーション サーバに常駐します。 暗号化オプション パスワード (SECURITY=PASSWORD) またはネットワーク暗号化のいずれかを使用 して、接続のセキュリティを確立できます。パスワード オプションまたはネットワ ーク暗号化のいずれかを使用するためには、Java ランタイム環境に Java Cryptography Extension (JCE) に準拠したサービス プロバイダがインストールされ ている必要があります。 JCE 準拠の暗号化サービス プロバイダは、Sun JRE 1.4 以降と IBM JRE 1.4.2 以降にバンドルされています。 1 つのクライアントで、複数のセキュリティ パッケージを混合して使用しないこと をお勧めします。次のセクションでは、各パッケージを構成する方法を説明しま す。 注: ネットワークを介した暗号化とパスワード暗号化は一緒には使用できません。 したがって、JDBC 暗号化 CSM を使用しているときは、SECURITY 環境変数 44 IBM Informix JDBC ドライバ プログラマーズ ガイド を使用してパスワード暗号化を有効にしないでください。JDBC 暗号化 CSM が、ネットワークを介してパスワードを送信する前にパスワードを暗号化しま す。 Sun JCE セキュリティ パッケージの使用 Sun JCE は J2 SDK バージョン 1.4 に統合されていますが、アメリカ合衆国とカ ナダでしか使用できません。ご使用のサイトがこの (またはその他の) Sun JCE 使 用許諾制限に適合しない場合は、IBM Informix JDBC ドライバを JCE に認定され たその他のセキュリティ パッケージ プロバイダとともに使用してみてください。 ただし、SPWDCSM CSM オプションまたは暗号化 CSM を使用するよう構成され た Informix データベース サーバで動作することを、すべてのパッケージについて テストおよび認定されているわけではないことに注意してください。または、次の セクションで説明する IBM FIPS に準拠したセキュリティ パッケージを使用する こともできます。 JDK 1.4 を使用して Sun JCE パッケージをインストールする場合は、Sun JCE デ ィストリビューションをダウンロードし、Sun JCE プロバイダ パッケージを含む .jar ファイルを解凍し、JDK がインストールされている場所の jre/lib/ext ディレク トリにコピーします。 JDK インストールの lib/security/java.security ファイルを編集して、次の 2 つの行 を組み込みます。 security.provider.1=sun.security.provider.Sun security.provider.2=com.sun.crypto.provider.SunJCE 暗号化サービス プロバイダの構成の詳細については、Sun JRE 資料を参照してくだ さい。 IBM FIPS 準拠のセキュリティ パッケージの使用 IBM 1.4.2 SR1a JRE 以降には、IBMJCEFIPS という、連邦情報処理標準 (FIPS) 140-2 準拠の JCE 用パッケージが含まれています。IBMJCEFIPS パッケージは、 FIPS によって承認された暗号操作を、JCE フレームワーク API を通じてサポート する JCE プロバイダとして実装されています。IBMJCEFIPS パッケージは、シンプ ル パスワードの CSM または暗号化 CSM と一緒に使用できます。 IBM 1.4.2 Java SDK は、http://www.ibm.com/developerworks/java/jdk/index.html から ダウンロードできます。 FIPS パッケージを使用するには、JRE がインストールされた jre/lib/ext ディレク トリにある JVM の java.security ファイルのセキュリティ プロバイダ リストに IBMJCEFIPS プロバイダを追加します。 java.security ファイルでは、FIPS に準拠しない他のどのセキュリティ プロバイダ より高い優先順位を、IBMJCEFIPS プロバイダに指定する必要があります。順序は 1 をベースとします。つまり、1 が最も優先され、2、3 と続きます。 次に例を示します。 security.provider.1=com.ibm.crypto.fips.provider.IBMJCEFIPS security.provider.2=com.ibm.crypto.fips.provider.IBMJCE 第 2 章 データベースへの接続 45 IBMJCEFIPS の優先順序が IBMJCE プロバイダより高いことを確認してください。 IBM Informix JDBC ドライバで FIPS 準拠の暗号パッケージを使用するために、ア プリケーションに変更を加える必要はありません。 暗号化サービス プロバイダの構成の詳細については、上記の URL にある IBM Developer Kit とランタイム環境に関する IBM JRE 資料を参照してください。 パスワード暗号化の使用 SECURITY 環境変数は、Informix JDBC クライアントと Informix データベース サ ーバがデータを交換するときに実行されるセキュリティ操作を指定します。 IBM Informix JDBC ドライバでサポートされている SECURITY 環境変数の設定値は、 PASSWORD のみです。 PASSWORD が指定されている場合、ユーザ指定のパスワードは、クライアントからデ ータベース サーバに渡されるときに 56 ビット暗号化を使用して暗号化されます。 デフォルトの設定値はありません。 次に例を示します。 String URL = "jdbc:informix-sqli://158.58.10.171:1664:user=myname; password=mypassord;INFORMIXSERVER=myserver;SECURITY=PASSWORD"; PASSWORD は、大文字と小文字を区別しません。大文字または小文字で入力できま す。 データベース サーバの構成 SECURITY=PASSWORD 設定は、Informix データベース サーバの 7.31、8.3 以 降、および 9.x 以降のバージョンでサポートされています。 その他のバージョンの サーバで使用すると、接続はリジェクトされます。 IBM Informix JDBC クライアントで SECURITY=PASSWORD 設定が指定されてい る場合は、Informix データベース サーバ上で SPWDCSM csm オプションが有効 になっている必要があります。 有効になっていないと、接続中にエラーが戻されま す。 データベース サーバでのパスワード暗号化をサポートする SPWDCSM csm サーバ オプションを使用するためには、サーバの sqlhosts サーバ名オプションを構成する 必要があります。サーバ上でこのオプションが設定された後は、 SECURITY=PASSWORD 設定を使用しているクライアントのみがそのサーバ名に接 続できます。 ご使用の Informix データベース サーバのバージョンで SPWDCSM csm オプショ ンがサポートされているかどうかを調べるには、または CSM オプションを構成す る方法に関する一般的な詳細情報を調べるには、ご使用のデータベース サーバに対 応した「IBM Informix: 管理者ガイド」を参照してください。 ネットワーク暗号化の使用 IBM Informix Dynamic Server バージョン 9.4 以降では、暗号化通信サポート モジ ュールを使用して、ネットワークを介して転送されるデータの暗号化を有効にしま 46 IBM Informix JDBC ドライバ プログラマーズ ガイド す。 IBM Informix JDBC ドライバ バージョン 2.21.JC5 以降では、JDBC ドライ バに通信サポート モジュール (CSM) を追加することにより、この機能をすべての JDBC クライアントで使用できるようにします。 IBM Informix JDBC 暗号化モジュールは、IBM Informix JDBC .jar ファイルにパ ッケージされている com.informix.jdbc.Crypto クラスです。 IBM Informix JDBC 暗号化 CSM は、Java 暗号化プロバイダのサービスを使用するピュア Java インプ リメンテーションです。 Java 暗号化プロバイダの詳細については、Sun Microsystems の Web サイトを参照してください。 ネットワーク暗号化の構文 ネットワーク暗号化を構成するには、CSM 環境変数を設定します。以下に、CSM 環境変数と暗号化オプションの構文を示します。 CSM 環境変数の構文 CSM=(“CLASSNAME=com.informix.jdbc.Crypto” ) , option tags config=parameterfile 要素 説明 option tags 暗号化タグの構文を指定します。詳しくは、『オプション タグ の使用』を参照してください。 config=parameterfile ファイル内の暗号化オプションを指定します。詳しくは、 48 ペ ージの『オプション パラメータの使用』を参照してください。 オプション タグの使用 暗号化 CSM に渡すことができるオプション タグは、サーバまたは CSDK で使用 される CSM 構成ファイルで指定されている暗号化オプション タグと同じです。 cipher、mac、および switch という 3 つのオプション タグがあります。 v cipher タグは、セッションで使用できるすべての暗号を定義します。 v mac オプションは、メッセージ確認コード (MAC) 生成時に使用される MAC キ ー ファイル、および使用される MAC 生成レベルを定義します。 v switch タグは、暗号または秘密鍵がリネゴシエーションされる頻度を定義しま す。秘密鍵や暗号を長い間使用していると、アタッカーに暗号化ルールを解読さ れる可能性が高くなります。これを防ぐため、暗号の専門家は、接続が長時間に 及ぶ場合は秘密鍵と暗号を定期的に変更することを推奨しています。リネゴシエ ーションのデフォルトは、1 時間に 1 回です。switch タグを使用することによ り、リネゴシエーションの時間を分単位で設定できます。 これらのタグの構文については「IBM Informix セキュリティ ガイド」を参照してく ださい。 暗号化 CSM オプション パラメータはコンマで分離され、セミコロンでは分離され ないことに注意してください。DataSource を使用している場合は、getIfxCSM() お よび setIfxCSM() メソッドを使用して、CSM をプロパティとして取得および設定 できます。CSM をプロパティとして設定するときは、オプション文字列を括弧で囲 まないでください。CSM をプロパティとして正しく設定する例を次に示します。 第 2 章 データベースへの接続 47 connProperties.put("CSM","classname=com.informix.jdbc.Crypto,cipher[all], mac[<builtin>]"); オプション パラメータの使用 暗号化パラメータを含むファイルを作成してからそのファイル名を指定することに より、暗号化を構成できます。暗号化パラメータは次のとおりです。 v ENCCSM_CIPHERS: 使用する暗号 v ENCCSM_MAC: MAC レベル v ENCCSM_MACFILES: MAC ファイルの場所 v ENCCSM_SWITCH: 暗号とキーの変更頻度 (コンマで分離) これらのパラメータの構文については「IBM Informix セキュリティ ガイド」を参照 してください。 構成ファイルで CSM パラメータを指定する例を次に示します。 String newUrl = "jdbc:informix-sqli: //beacon:8779/test:INFORMIXSERVER=danon950_beacon_encrypt; user=rdtest;password=test; csm=(classname=com.informix.jdbc.Crypto,config=test.cfg)"; try { Class.forName( "com.informix.jdbc.IfxDriver" ); }catch( Exception e ) { System.out.println( "ERROR: failed to load Informix JDBC driver." ); } try { Connection con = DriverManager.getConnection( newUrl ); } catch( SQLException e ) { System.out.println( "ERROR: failed to connect." ); e.printStackTrace(); return; } サーバでの暗号化 CSM の構成 暗号化されたポートで IBM Informix データベース サーバに接続するためには、 JDBC クライアントは JDBC 暗号化 CSM を使用する必要があります。 また、 JDBC 暗号化 CSM を使用するときは、暗号化されていないポートで IBM Informix データベース サーバに接続しようとすると、失敗することにも注意してください。 IBM Informix データベース サーバのインスタンスは、暗号化されたポートと暗号 化されていないポートで同時に listen するように構成できます。 暗号化 CSM を使 用するための Dynamic Server の構成に関する詳細については、「IBM Informix 管 理者ガイド」を参照してください。 48 IBM Informix JDBC ドライバ プログラマーズ ガイド Informix JDBC ドライバ でのシングル サインオン アクセス コントロー ルの使用 DriverManager.getConnection() メソッドを使用して、サービス プリンシパルへの 接続 URL に通信サポート モジュール (CSM) を設定することで、JDBC でシング ル サインオン (SSO) アクセス コントロールを使用できます。SSO アクセス コン トロールを使用すると、ユーザ ID とパスワードのオプションが置き換えられま す。 前提条件:: データベース サーバが SSO 認証に対してセットアップされていることを確認して ください。詳細については、「IBM Informix セキュリティ ガイド」で『シングル サインオン アクセス制御』セクションを参照してください。 1. 接続 URL を変更して、サービス プリンシパルを含めます。サービス プリンシ パルは、データベース サーバ名と SSO 領域から構成されます。 CSM=(SSO=database_server@realm,ENC=true) ENC=true 設定は、Generic Security Service (GSS) 暗号化が有効になっているこ とを意味します。ENC=true 設定の値は、デフォルトでは true であるため、こ の設定はオプションです。GSS 暗号化を有効にしない場合は、値を false に設定 します (ENC= false)。 接続 URL の完全な構文については、21 ページの『データベース URL のフォ ーマット』を参照してください。 2. 次のコードを使用して、ログイン構成ファイルを作成します。 com.sun.security.jgss.initiate { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true doNotPrompt=true; } 3. java.security.auth.login.config プロパティをログイン構成ファイルの絶対パス名 に設定し、その後に TestSso クラスを続けて、アプリケーションを実行します。 以下に例を示します。この場合、IfmxLog.conf はログイン構成ファイルです。 java -Djava.security.auth.login.config=mydirectory/IfmxLog.conf TestSso PAM 認証方法 IBM Informix JDBC ドライバ バージョン 2.21.JC5 以降には、PAM (Pluggable Authentication Module) 対応の Dynamic Server 9.40 以降のサーバを処理するための サポートが実装されています。このインプリメンテーションは、PAM とエンド ユ ーザ間のユーザ確認のための質問への応答ダイアログをサポートします。このダイ アログを円滑に使用するためには、JDBC 開発者が com.informix.jdbc.IfmxPAM イ ンターフェイスを実装する必要があります。 IfmxPAM インターフェイスの IfxPAM() メソッドが、PAM とユーザとの間のゲートウェイとして機能します。 JDBC サーバで PAM チャレンジ メソッドが検出されると、IfxPAM() メソッドが 呼び出されます。IfxPAM() メソッドからの戻り値は、チャレンジ メッセージへの 応答として機能し、PAM に送信されます。 第 2 章 データベースへの接続 49 IfxPAM() メソッドのシグニチャは次のとおりです。 public IfxPAMResponse IfxPAM(IfxPAMChallenge challengeMessage) 2 つのクラス、IfxPAMChallenge と IfxPAMResponse が、JDBC ドライバと PAM との間のメッセージを導きます。IfxPAMChallenge クラスには、PAM からユーザ に送信された情報が含まれます。 チャレンジ メッセージは、getChallenge() メソッドを使用して IfxPAMChallenge クラスから取得されます。このメッセージは、Dynamic Server 上で実行されている PAM からエンド ユーザに向けて経路指定され、直接送信されるものです。次の表 にチャレンジ メッセージをリストします。 表 3. チャレンジ メッセージのタイプ メッセージ 説明 PAM_PROMPT_ECHO_ON メッセージがユーザに対して表示され、ユーザの応 答をエコー バックできます。 PAM_PROMPT_ECHO_OFF メッセージがユーザに対して表示され、ユーザの応 答は非表示になるか、マスクされます (つまり、ユ ーザがパスワードを入力すると、ユーザが入力する 文字そのものの代わりにアスタリスクが表示されま す)。 PAM_PROMPT_ERROR_MSG メッセージがユーザに対してエラーとして表示さ れ、応答を必要としません。 PAM_TEXT_INFO_MSG メッセージがユーザに対して通知メッセージとして 表示され、応答を必要としません。 注: チャレンジ メッセージ タイプは PAM 標準により規定され、ベンダ固有の値 を持つことができます。PAM 標準およびベンダ固有の情報を参照して可能値と 解釈を調べてください。 注: PAM 標準では、PAM メッセージの最大サイズは 512 バイトに定義されていま す (IfxPAMChallenge.PAM_MAX_MESSAGE_SIZE)。 IfxPAMResponse クラスは IfxPAMChallenge と非常に類似していますが、 IfxPAMResponse クラスは、メッセージをユーザに送信するために PAM により使 用されるのではなく、メッセージをユーザから PAM に送信するために使用されま す。ユーザ確認のための質問への応答文字列を PAM に送信するには、 IfxPAMResponse.setResponse() メソッドを使用します。ただし、応答タイプは現在 は将来の使用のために予約されているため、応答タイプ (IfxPAMResponse.setResponseType() メソッドを使用して設定) をゼロ (デフォルト) に設定します。 ユーザ確認のための質問への応答文字列は、チャレンジ メッセージのサイズ (IfxPAMResponse.PAM_MAX_MESSAGE_SIZE または 512 バイト) に制限されて います。応答文字列がこの制限を超えた場合、SQL 例外が呼び出されます。 さらに、チャレンジ メッセージのタイプが PAM_INFO_TEXT または PAM_PROMPT_ERR_MSG である場合 (意味と整数値については PAM 標準を参 照)、PAM はユーザの応答を予期しません。したがって、NULL の 50 IBM Informix JDBC ドライバ プログラマーズ ガイド IfxPAMResponse オブジェクト、または特定の値で設定されていない IfxPAMResponse オブジェクトが JDBC に戻される場合があります。JDBC 開発者 が PAM セッション中の接続試行をアボートできるように、IfxPAMResponse クラ スは次のメソッドを提供しています。 public void setTerminateConnection(boolean flag) flag の値は、TRUE または FALSE です。 setTerminateConnection に渡されたパラ メータの値が TRUE である場合、PAM 対応の Dynamic Server への接続は IfxPAM() から戻った直後に終了します。値が FALSE に設定されている場合、 PAM 対応のサーバへの接続試行は通常どおり継続されます。 JDBC での PAM の使用 PAM 対応の Dynamic Server と通信するために PAM を使用している JDBC 開発 者は、com.informix.jdbc.IfmxPAM インターフェイスを実装する必要があります。 これを行うには、Java クラス ファイルのクラス宣言行に次の文字列を書き込みま す。 implements IfmxPAM 次に、この Java クラスは Java 標準と上記の詳細に準拠して IfmxPAM インター フェイスを実装する必要があります。 次の手順は、IfmxPAM インターフェイスを 実装した Java クラスの JDBC ドライバへの通知です。 これを行うには次の 2 つ の方法があります。 v キーと値のペア、IFX_PAM_CLASS=your.class.name を、接続 URL に追加しま す。ここで、値 your.class.name は IfmxPAM インターフェイスを実装したクラス へのパスです。 この方法は、通常、DriverManager.getConnection (URL) アプローチを使用して Dynamic Server に接続するときに使用されます。 v PAM 対応のサーバに接続する前に、プロパティ リストにプロパティ IFX_PAM_CLASS と値 your.class.name を追加します。 この方法は、DataSource.getConnection() アプローチを使用して Dynamic Server に接続するときに使用されます。 JDBC 開発者は、IfmxPAM インターフェイスの実装をかなり自由に行うことができ ます。PAM を使用した認証中に以下の処理が発生します。 1. JDBC ドライバは、PAM 対応のサーバとの通信を検出すると、IfxPAM() メソッ ドにコンタクトし、PAM のユーザ確認のための質問を含む IfxPAMChallenge オブジェクトを渡します。 2. PAM により送信されたチャレンジ メッセージを含むテキスト形式の質問が、ユ ーザ作成のダイアログ ボックスに表示されます。 3. ユーザが応答すると、応答は IfxPAMResponse オブジェクトにパッケージさ れ、IfxPAMResponse オブジェクトを戻す IfxPAM() メソッドを終了することに より JDBC ドライバに戻されます。 4. PAM は、ユーザ確認のための質問に対する応答を受信すると、ユーザを認可す るか、ユーザのアクセスを拒否するか、あるいは別のユーザ確認のための質問を 出して上記のプロセスを繰り返すことができます。 第 2 章 データベースへの接続 51 このプロセスは、そのユーザが認可されるか、またはアクセスを拒否されるかのい ずれかになるまで続きます。Java 開発者またはユーザは、 IfxPAMResponse.setTerminateConnection() メソッドを、値 TRUE を使用して呼び 出すことにより、PAM 認証シーケンスを終了できます。 接続のクローズ 次の表は、Connection.close() と scrubConnection() メソッドを呼び出した場合の効 果の違いを、接続プールを使用する環境と使用しない環境とで対比しています。 リソースの割当て解除の詳細については、56 ページの『リソースの割当て解除』を 参照してください。scrubConnection() メソッドの詳細については、215 ページの 『プールされた接続のクリーニング』を参照してください。 接続プールの状態 Connection.close() メソッド呼出しの 効果 scrubConnection() メソッド呼出しの効果 接続プールがセット アップされていない データベース接続、すべての関連し た文オブジェクト、およびそれらの 結果セットをクローズします。接続 は無効になります。 接続を元の状態に戻し、オープンされている文を保持し ますが、結果セットはクローズします。接続は有効なま まになります。 結果セットに関連付けられたリソースのみを解放しま す。 Informix インプリメ ンテーションでの接 続プール データベースへの接続をクローズし てから再オープンし、接続オブジェ クトに関連付けられたすべての文を クローズして接続を元の状態にリセ ットします。その後接続オブジェク トは接続プールに戻され、新規アプ リケーション接続により要求された ときに使用できます。 接続を元の状態に戻し、すべてのオープンされている文 を保持しますが、結果セットはすべてクローズします。 この状態でこのメソッドを呼び出すことは推奨されませ ん。 アプリケーション サーバ インプリメ ンテーションでの接 続プール ユーザの接続プール インプリメンテ 接続を元の状態に戻し、オープンされている文を保持し ーションにより定義されます。 ますが、結果セットはクローズします。 この機能は、接続で JDBC 3.0 の文のプール機能を使用 しているときに役立つ場合があります。アプリケーショ ンが Connection.close() メソッドを呼び出すと、アプリ ケーション サーバの接続プール マネージャは、プール された接続オブジェクトに対して scrubConnection() を 呼び出してからそのオブジェクトを接続プールに戻すこ とができます。 重要: scrubConnection() メソッドを呼び出す場合は、アプリケーションがサーバの みの接続を使用している必要があります。 52 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 3 章 データベース操作の実行 本章について . . . . . . . . . . . . . . . . . . . . . データベースの問合せ . . . . . . . . . . . . . . . . . . Informix データベースへの問合せ送信の例 . . . . . . . . . . 結果セットの使用 . . . . . . . . . . . . . . . . . . 複数行のスクロール可能結果セット . . . . . . . . . . . リソースの割当て解除 . . . . . . . . . . . . . . . . . 複数のスレッドでの実行 . . . . . . . . . . . . . . . . スクロール カーソルの使用 . . . . . . . . . . . . . . . スクロール感度 . . . . . . . . . . . . . . . . . . クライアント サイド スクロール . . . . . . . . . . . . 結果セットの更新可能性 . . . . . . . . . . . . . . . HOLD カーソルの使用 . . . . . . . . . . . . . . . . データベースの更新 . . . . . . . . . . . . . . . . . . バッチ更新の実行 . . . . . . . . . . . . . . . . . . SQL 文とバッチ更新 . . . . . . . . . . . . . . . . Statement.executeBatch() メソッドからの戻り値 . . . . . . . . バルク挿入の実行 . . . . . . . . . . . . . . . . . . パラメータ、エスケープ構文、およびサポートされていないメソッド . . CallableStatement OUT パラメータの使用 . . . . . . . . . . サーバとドライバの制約事項と制限 . . . . . . . . . . . CallableStatement での名前付きパラメータ . . . . . . . . . . CallableStatement で使用される名前付きパラメータの要件と制約事項 ストアド プロシジャのパラメータ名の抽出. . . . . . . . . 名前付きパラメータと固有のストアド プロシジャ . . . . . . 名前付きパラメータとオーバーロード ストアド プロシジャ . . . DESCRIBE INPUT の JDBC サポート . . . . . . . . . . . エスケープ構文の使用 . . . . . . . . . . . . . . . . . サポートされないメソッドおよび動作が異なるメソッド . . . . . トランザクションの処理 . . . . . . . . . . . . . . . . . エラーの処理 . . . . . . . . . . . . . . . . . . . . . SQLException クラスを使用したエラーの処理 . . . . . . . . . 構文エラー オフセットの抽出 . . . . . . . . . . . . . . RSAM エラー メッセージのキャッチ. . . . . . . . . . . com.informix.jdbc.Message クラスを使用したエラー処理 . . . . . . データベース メタデータへのアクセス . . . . . . . . . . . . JDBC API に対するその他の Informix 拡張機能 . . . . . . . . . 自動解放機能の使用 . . . . . . . . . . . . . . . . . ドライバのバージョン情報の取得 . . . . . . . . . . . . . XML 文書の格納と抽出 . . . . . . . . . . . . . . . . . XML メソッドを使用するための環境設定 . . . . . . . . . . CLASSPATH の設定 . . . . . . . . . . . . . . . . パーサ ファクトリの指定. . . . . . . . . . . . . . . データの挿入 . . . . . . . . . . . . . . . . . . . . データの抽出 . . . . . . . . . . . . . . . . . . . . データ挿入の例 . . . . . . . . . . . . . . . . . . . XMLtoString() の例 . . . . . . . . . . . . . . . . . XMLtoInputStream() の例 . . . . . . . . . . . . . . . データ抽出の例 . . . . . . . . . . . . . . . . . . . StringtoDOM() の例 . . . . . . . . . . . . . . . . . InputStreamtoDOM() の例 . . . . . . . . . . . . . . . © Copyright IBM Corp. 1996, 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 54 54 55 55 56 56 56 57 57 57 58 58 58 58 58 59 59 60 60 66 66 67 67 69 70 71 72 75 76 76 77 77 77 77 79 79 80 80 81 81 82 82 84 84 84 85 85 85 86 53 getInputSource() の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 本章について この章では、IBM Informix JDBC ドライバを使用して Informix データベースに対 する操作を実行するために必要なことについて説明します。 この章には以下のセク ションが含まれています。 v データベースの問合せ v データベースの更新 v パラメータ、エスケープ構文、およびサポートされていないメソッド データベースの問合せ IBM Informix JDBC ドライバは、データベースへの問合せの送信と結果の抽出に関 する JDBC API 仕様に準拠しています。このドライバは、Statement、 PreparedStatement、CallableStatement、ResultSet、および ResultSetMetaData の各 インターフェイスのほとんどのメソッドをサポートしています。 以下のセクションでは、データベースの問合せについて説明し、Sun Microsystems の JDBC 3.0 仕様と比較した場合の Informix の相違点と拡張点について説明しま す。 v Informix データベースへの問合せ送信の例 v 結果セットの使用 v リソースの割当て解除 v 複数のスレッドでの実行 v スクロール カーソルの使用 v HOLD カーソルの使用 Informix データベースへの問合せ送信の例 SimpleSelect.java プログラムに含まれる次の例は、PreparedStatement インターフ ェイスを使用して、1 つの入力パラメータを持つ SELECT 文を実行する方法を示し ています。 try { PreparedStatement pstmt = conn.prepareStatement("Select * from x " + "where a = ?;"); pstmt.setInt(1, 11); ResultSet r = pstmt.executeQuery(); while(r.next()) { short i = r.getShort(1); System.out.println("Select: column a = " + i); } r.close(); pstmt.close(); } catch (SQLException e) { System.out.println("ERROR: Fetch statement failed: " + e.getMessage()); } 54 IBM Informix JDBC ドライバ プログラマーズ ガイド このプログラムは、まず Connection.prepareStatement() メソッドを使用して、単一 の入力パラメータを持つ SELECT 文を準備します。次に、 PreparedStatement.setInt() メソッドを使用してそのパラメータに値を割り当て、 PreparedStatement.executeQuery() メソッドを使用して問合せを実行します。 プログラムは、結果行を ResultSet オブジェクトに戻し、最後の行まで ResultSet.next() メソッドの実行を繰り返します。選択された列のデータ型が小桁整 数 (SMALLINT) 型であるため、プログラムは ResultSet.getShort() メソッドを使用 して個々の列の値を抽出します。 最後に、ResultSet オブジェクトと PreparedStatement オブジェクトの両方が、適 切な close() メソッドを使用して明示的にクローズされます。 個々の列の値を抽出する getXXX() メソッドの詳細については、245 ページの 『ResultSet.getXXX() メソッドに対するデータ型マッピング』を参照してください。 結果セットの使用 Statement.execute() メソッドの IBM Informix JDBC ドライバ インプリメンテーシ ョンは、単一の ResultSet オブジェクトを戻します。サーバは複数の ResultSet オ ブジェクトをサポートしないため、Statement.execute() メソッドが複数の ResultSet オブジェクトを戻すことができるとしている JDBC API 仕様とは異なります。 注: IBM Informix JDBC ドライバでは、複数結果セットの返却をサポートしていま せん。 複数行のスクロール可能結果セット スクロール可能 ResultSet は、サーバから一度に 1 行をフェッチします。スクロー ル可能 ResultSet のパフォーマンス拡張により、一度に複数行をフェッチできるよ うになりました。次の例では、行 m から n が必要で、これらの行が ResultSet に フェッチされます。 m から n に含まれている行のみがアクセスされる限り、それ 以上、行はフェッチされません。 この例では、行 50 から 100 が必要で、 ResultSet は SCROLL_INSENSITIVE です。 rs.setFetchSize(51); rs.absolute(49); // one row will be fetched rs.next() // rs will contain 51 rows IBM Informix Dynamic Server は、正方向で 1 行のみをフェッチします。ただし、 DIR_NEXT フェッチが使用されるときは例外で、複数行がフェッチされます。 DIR_NEXT 操作の場合は、フェッチ バッファがいっぱいになるか、または最終行 が送られるまで、サーバが行を送ります。 DIR_NEXT 操作を生成できるのは、 resultSet.next() のみです。 このパフォーマンス拡張では、FORWARD_ONLY ResultSet の動作は変更されてい ません。フェッチ バッファのサイズの計算方法は変わっていません。 SCROLL_INSENTIVE ResultSet の場合は、フェッチ バッファのサイズは、フェッ チ サイズおよび行サイズによって決まります。 Statement.setFetchSize() および ResultSet.setFetchSize() を使用すると、フェッチ サイズを設定できます。 フェッチ サイズがゼロである場合は、フェッチ バッファのデフォルト サイズが使用されま す。フェッチ バッファのサイズは 32K が上限です。 第 3 章 データベース操作の実行 55 ResultSet メソッドには、問合せによって生成された行数に関する情報を必要とする ものがあります。これらのメソッドは、情報を取得するためにまず 1 行フェッチ し、次に現行行を再フェッチします。 該当するメソッドは isBeforeFirst()、 isLast()、および absolute(-row) です。 さらに setMaxRows() は、SCROLL_INSENSITIVE ResultsSet のフェッチ バッファ サイズを変更できます。 setMaxRows() を効率的に使用するには、追加のサーバ サ ポートが必要になるため、この時点では ResultSet.setMaxRows() を使用しないよう にお勧めします。 リソースの割当て解除 SQL 文の結果の処理が終了したら、Java プログラムで適切な close() メソッドを呼 び出して、Statement、PreparedStatement、および CallableStatement の各オブジェ クトをクローズします。 クローズされると、SQL 文を実行するために割り当てら れていたリソースが即時に割当て解除されます。 ResultSet.close() メソッドは ResultSet オブジェクトをクローズしますが、Statement、PreparedStatement、また は CallableStatement オブジェクトに割り当てられたリソースの割当て解除は行い ません。 文または結果セットの処理が完了したことを IBM Informix JDBC ドライバに知ら せるために、SQL 文の結果の処理の終了時に ResultSet.close() および Statement.close() メソッドを呼び出すのは適切な方法です。これを実行すると、プ ログラムは、データベース サーバ上のそのプログラムのリソースすべてを解放しま す。ただし、これらのリソースの解放を行う Connection.close() を呼び出すのであ れば、ResultSet.close() および Statement.close() を特に 呼び出す必要はありませ ん。 複数のスレッドでの実行 同一の Statement または ResultSet インスタンスに、複数のスレッドが並行してア クセスすることはできません。ただし、複数のスレッド間で 1 つの Connection オ ブジェクトを共用できます。 例えば、あるスレッドが Statement オブジェクトに対して Statement.executeQuery() メソッドを実行し、別のスレッドが同じ Statement オブ ジェクトに対して Statement.executeUpdate() メソッドを実行した場合、両方のメソ ッドの結果は予期できず、どちらのメソッドが最後に実行されたかに依存します。 同様に、あるスレッドがメソッド ResultSet.next() を実行し、別のスレッドが同じ ResultSet オブジェクトに対して同じメソッドを実行した場合、両方のメソッドの結 果は予期できず、どちらのメソッドが最後に実行されたかに依存します。 スクロール カーソルの使用 IBM Informix JDBC ドライバのスクロール カーソル機能は Sun Microsystems JDBC 3.0 仕様に従っていますが、以下の例外があります。 v スクロール感度 v クライアント サイド スクロール v 結果セットの更新可能性 56 IBM Informix JDBC ドライバ プログラマーズ ガイド スクロール感度 スクロール カーソルの Informix データベース サーバ インプリメンテーションで は、取り出された行は一時表に配置されます。 別のプロセスが元の表の行を変更し (その行がロックされていないと想定)、その行が再度取り出された場合、その変更内 容はクライアントからは見えません。 この動作は、JDBC 3.0 仕様の SCROLL_INSENSITIVE 記述に類似しています。 IBM Informix JDBC ドライバは、SCROLL_SENSITIVE カーソルをサポートしてい ません。更新された行を参照するには、クライアント アプリケーションはカーソル をクローズしてから再オープンする必要があります。 クライアント サイド スクロール JDBC 仕様によるとクライアント サイドの結果セットでのスクロールが可能です。 IBM Informix JDBC ドライバは、データベース サーバがスクロールをサポートす る範囲内でのみ、結果セットのスクロールをサポートしています。 結果セットの更新可能性 Sun Microsystems の JDBC 3.0 API には、更新可能な結果セットを生成する SQL 問合せに関する厳密な仕様が規定されていません。通常、次の基準を満たす問合せ が、更新可能な結果セットを生成できます。 v 問合せがデータベース内の単一の表のみを参照する。 v 問合せに JOIN 操作が含まれない。 v 問合せが参照する表の主キーを選択する。 v 選択リストの各値表現式が単一の列指定から構成され、複数回使用されている列 指定がない。 v 表表現式の WHERE 節に副問合せが含まれていない。 IBM Informix JDBC ドライバでは、ドライバが以下の操作を行うため、主キー要件 が緩和されています。 1. ドライバは ROWID という列を検索します。 2. ドライバは、表内のシリアル (SERIAL) 型列または SERIAL8 型列を検索しま す。 3. ドライバは、システム カタログで表の主キーを検索します。 これらのいずれも存在しない場合、ドライバはエラーを戻します。 結果セット内の行を削除すると、削除の後では各行の位置が変わるため、 ResultSet.absolute() メソッドが影響を受けます。 問合せにシリアル (SERIAL) 型列が含まれており、データが複数行で重複している 場合は、updateRow() または deleteRow() を実行すると、そのデータを含むすべて の行が影響を受けます。 ScrollCursor.java サンプル ファイルは、スクロール カーソルを使用して結果セッ トを抽出する方法を示しています。更新可能な両方向スクロール カーソルの使用例 については、UpdateCursor1.java、UpdateCursor2.java、および UpdateCursor3.java の各ファイルを参照してください。 第 3 章 データベース操作の実行 57 HOLD カーソルの使用 トランザクション ログ機能を使用している場合、トランザクションが終了すると、 IBM Informix Dynamic Server は通常すべてのカーソルをクローズしてすべてのロッ クを解放します。 マルチユーザ環境では、この動作が常に望ましいわけではありま せん。 IBM Informix JDBC ドライバは、Informix 拡張セットを使用して HOLD 可能なカ ーソルのサポートをすでに実装しています。 Informix データベース サーバ (5.x、7.x、SE、8.x、9.x、および 10.x 以降) では、カーソルの宣言時にキーワード WITH HOLD を追加できます。このようなカーソルは HOLD カーソルとして参照 され、トランザクションの終了時にクローズされません。 IBM Informix JDBC ドライバは、JDBC 3.0 仕様に準拠して、HOLD 可能なカーソ ルをサポートするために JDBC インターフェイスにメソッドを追加しています。 HOLD カーソルの詳細については、「IBM Informix SQL ガイド: 構文」を参照して ください。 データベースの更新 バッチ更新文の実行またはバルク挿入の実行によりデータベースを更新できます。 バッチ更新の実行 バッチ更新機能は、複数の Informix SQL PREPARE 文に類似しています。 次の例 のようにバッチ更新文を実行できます。 PREPARE stmt FROM "insert into tab values (1); insert into tab values (2); update table tab set col = 3 where col = 2"; IBM Informix JDBC ドライバのバッチ更新機能は Sun Microsystems JDBC 3.0 仕様 に従っていますが、以下の例外があります。 v SQL 文 v Statement.executeBatch() からの戻り値 以下のセクションで詳細を示します。 SQL 文とバッチ更新 以下のコマンドは、複数の文を処理する PREPARE 文に書き込むことができませ ん。 v SELECT (SELECT INTO TEMP を除く) 文 v DATABASE 文 v CONNECTION 文 詳細については、「IBM Informix SQL ガイド: 構文」を参照してください。 Statement.executeBatch() メソッドからの戻り値 戻り値は、以下の点で Sun Microsystems JDBC 3.0 仕様と異なります。 58 IBM Informix JDBC ドライバ プログラマーズ ガイド v IFX_BATCHUPDATE_PER_SPEC 環境変数が 0 に設定されている場合は、バッチ 内で最初に実行された文の更新カウント数のみが戻されます。 IFX_BATCHUPDATE_PER_SPEC 環境変数が 1 (デフォルト) に設定されている 場合は、戻り値は、Statement.executeBatch() により実行されるすべての SQL 文 の影響を受ける行数と等しくなります。詳しくは、26 ページの『IBM Informix JDBC ドライバ での Informix 環境変数の使用』を参照してください。 v Statement オブジェクトで実行されるバッチ更新でエラーが発生した場合は、文 が実行されないため、文の影響を受ける行はありません。この場合、 BatchUpdateException.getUpdateCounts() を呼び出すと、0 が戻されます。 v PreparedStatement オブジェクトで実行されるバッチ更新でエラーが発生した場 合、正常にデータベース サーバに挿入または更新された行は、更新前の状態には 戻されません。ただし、文が常にコミットされるわけではありません。文はこの 場合も基礎となる自動コミット モードに従います。 BatchUpdate.java サンプル ファイルは、バッチ更新をデータベース サーバに送信 する方法を示しています。 バルク挿入の実行 バルク挿入は、Sun Microsystems JDBC 3.0 のバッチ更新機能に対する Informix の 拡張機能です。 バルク挿入機能は、複数回、複数の値設定で実行される、単一の INSERT 文のパフォーマンスを向上させます。この機能を有効にするには、 IFX_USEPUT 環境変数を 1 に設定します。(デフォルト値は 0 です。) この機能は、同一の PreparedStatement インスタンスに渡された複数の文に対し て、あるいは INSERT 文以外の文に対しては無効です。この機能が有効で、 INSERT 文と、それに続くパラメータを持たない文を渡した場合、そのパラメータ を持たない文は無視されます。 バルク挿入機能を使用するには、クライアントが、不透明 (OPAQUE) 型または複合 データ型以外のすべてのデータ型について、サーバ上のターゲット列型に一致する ように Java データ型を変換する必要があります。 BulkInsert.java サンプルは、バルク挿入を実行する方法を示しています。このサン プルは、JDBC ドライバをインストールした場所の demo ディレクトリにインスト ールされています。 パラメータ、エスケープ構文、およびサポートされていないメソッド このセクションでは、次の情報を紹介します。 v OUT パラメータの使用方法 v CallableStatement での名前付きパラメータの使用方法 v DESCRIBE INPUT 文のサポート v エスケープ構文を使用して JDBC から Informix に変換する方法 また、サポートされないメソッド、および標準とは異なる動作をするメソッドもリ ストします。 第 3 章 データベース操作の実行 59 CallableStatement OUT パラメータの使用 CallableStatement メソッドは、C 関数および Java のユーザ定義ルーチン (UDR) の OUT パラメータを処理します。 2 つの registerOutParameter() メソッドが、ド ライバへの OUT パラメータのデータ型を指定します。一連の getXXX() メソッド により OUT パラメータが抽出されます。 Informix Dynamic Server バージョン 9.2x および 9.3x は、OUT パラメータを文の 局所変数 (SLV) であると見なします。SLV は単一の文の存続中にのみ有効で、ル ーチン実行時に直接戻すことはできません。JDBC CallableStatement インターフェ イスは、OUT パラメータを抽出するためのメソッドを提供します。 IBM Informix Dynamic Server バージョン 10.0 以降では、OUT パラメータ ルーチ ンにより、有効な BLOB 記述子とデータを JDBC クライアントで BINARY OUT パラメータに使用できるようになっています。 IDS 10.0 以降をサポートする IBM Informix JDBC ドライバ バージョン 3.0 以降の受信メソッドを使用することによ り、サーバが提供するこれらの OUT パラメータ記述子とデータを使用できます。 IDS と JDBC の間での記述子とデータの交換は、データが JDBC の結果セット メ ソッドにおいて交換される既存のメカニズム (SQLI プロトコル メソッドを介して BLOB 記述子とデータを渡すなど) と一貫しています。(SPL UDR は、BINARY OUT パラメータをサポートする唯一の UDR のタイプです。) 背景情報については、以下のマニュアルを参照してください。 v 「IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド」には、 Informix データベースで使用する不透明 (OPAQUE) 型およびユーザ定義ルーチ ン (UDR) に関する入門的な情報と背景情報が記載されています。 v 「J/Foundation 開発者ガイド」では、データベース サーバで使用する Java UDR を記述する方法について説明しています。 v 「IBM Informix SQL ガイド: チュートリアル」では、ストアド プロシジャ言語 (SPL) ルーチンの記述方法について説明しています。 v 「IBM Informix DataBlade API プログラマーズ ガイド」では、外部 C ルーチン の記述方法について説明しています。 Informix データベース サーバ バージョン 9.2 以降のみが、IBM Informix JDBC ド ライバに OUT パラメータを戻します。 Informix Dynamic Server バージョン 9.4 以降は、複数の OUT パラメータをサポートしています。 OUT パラメータの使用例については、IBM Informix JDBC ドライバのインストー ル場所の demo ディレクトリ内の basic サブディレクトリにある、CallOut1.java、 CallOut2.java、CallOut3.java、および CallOut4.java の各サンプル プログラムを参 照してください。 サーバとドライバの制約事項と制限 サーバの制約事項: このセクションでは、Dynamic Server の 9.x 以降のさまざま なバージョンで課せられる制約事項について説明します。また、JDBC ドライバに 対して行われた拡張と、それにより課せられる制約事項についても説明します。 60 IBM Informix JDBC ドライバ プログラマーズ ガイド Informix Dynamic Server のバージョン 9.2x および 9.3x には、OUT パラメータに 関して以下のような要件と制限があります。 v 関数のみが OUT パラメータを持つことができます。関数は、値を戻す UDR と して定義されます。プロシジャは、値を戻さない UDR として定義されます。 v 1 つの関数あたり 1 つしか OUT パラメータを持つことができません。 v OUT パラメータは、最後のパラメータである必要があります。 v INOUT パラメータは指定できません。 IBM Informix Dynamic Server バージョン 10.0 以降では、INOUT パラメータ (C、 SPL、または Java UDR) を指定できます。 v サーバは外部関数に対して値 NULL を正しく戻しません。 v 複合データ型である OUT パラメータは指定できません。 v RETURN WITH RESUME 構文を使用する C および SPL ルーチンは指定できま せん。 サーバ バージョン 9.2x および 9.3x に対するこれらの制約事項は、ユーザが C、 SPL、または Java で UDR を作成する場合に課せられます。 Informix Dynamic Server バージョン 9.4 の機能により、以下が許可されます。 v C、SPL、または Java UDR について、あらゆるパラメータを OUT パラメータ にする v 戻り値がないユーザ定義プロシジャで OUT パラメータを使用する v 複数の OUT パラメータ INOUT パラメータは指定できません。 UDR の詳細については、「IBM Informix ユーザ定義ルーチンおよびデータ タイプ 開発者ガイド」および「J/Foundation 開発者ガイド」を参照してください。 ドライバの拡張: CallableStatement オブジェクトは、すべてのデータベース サー バに対して標準的な方法で UDR を呼び出す、または実行するための方法を提供し ます。これらの UDR の実行結果は、結果セットまたは OUT パラメータとして戻 されます。 2 つの OUT パラメータと 1 つの IN パラメータを持つユーザ定義関数、myudr を作成してから、その myudr() 関数を実行するプログラムを次に示します。この例 を実行するには、サーバ サイドで複数の OUT パラメータがサポートされている必 要があります。したがって、Informix Dynamic Server バージョン 9.4 以降でのみ動 作します。UDR の詳細については、「IBM Informix ユーザ定義ルーチンおよびデ ータ タイプ開発者ガイド」および「J/Foundation 開発者ガイド」を参照してくださ い。 import java.sql.*; public class myudr { public myudr() { } public static void main(String args[]) { Connection myConn = null; try { 第 3 章 データベース操作の実行 61 Class.forName("com.informix.jdbc.IfxDriver"); myConn = DriverManager.getConnection( "jdbc:informix-sqli:MYSYSTEM:18551/testDB:" +"INFORMIXSERVER=patriot1;user=USERID;" +"password=MYPASSWORD"); } catch (ClassNotFoundException e) { System.out.println( "problem with loading Ifx Driver¥n" + e.getMessage()); } catch (SQLException e) { System.out.println( "problem with connecting to db¥n" + e.getMessage()); } try { Statement stmt = myConn.createStatement(); stmt.execute("DROP FUNCTION myudr"); } catch (SQLException e){ } try { Statement stmt = myConn.createStatement(); stmt.execute( "CREATE FUNCTION myudr(OUT arg1 int, arg2 int, OUT arg3 int)" +" RETURNS boolean; LET arg1 = arg2; LET arg3 = arg2 * 2;" +"RETURN ’t’; END FUNCTION;"); } catch (SQLException e) { System.out.println( "problem with creating function¥n" + e.getMessage()); } Connection conn = myConn; try { String command = "{? = call myudr(?, ?, ?)}"; CallableStatement cstmt = conn.prepareCall (command); // Register arg1 OUT parameter cstmt.registerOutParameter(1, Types.INTEGER); // Pass in value for IN parameter cstmt.setInt(2, 4); // Register arg3 OUT parameter cstmt.registerOutParameter(3, Types.INTEGER); // Execute myudr ResultSet rs = cstmt.executeQuery(); // executeQuery returns values via a resultSet while (rs.next()) { // get value returned by myudr boolean b = rs.getBoolean(1); System.out.println("return value from myudr = " + b); } // Retrieve OUT parameters from myudr int i = cstmt.getInt(1); System.out.println("arg1 OUT parameter value = " + i); int k = cstmt.getInt(3); System.out.println("arg3 OUT parameter value = " + k); 62 IBM Informix JDBC ドライバ プログラマーズ ガイド rs.close(); cstmt.close(); conn.close(); } catch (SQLException e) { System.out.println("SQLException: " + e.getMessage()); System.out.println("ErrorCode: " + e.getErrorCode()); e.printStackTrace(); } } } - - .../j2sdk1.4.0/bin/java ... myudr return value from myudr = true arg1 OUT parameter value = 4 arg3 OUT parameter value = 8 ドライバの制約事項と制限: IBM Informix JDBC ドライバには、OUT パラメータ に関して以下のような要件と制限があります。 v Informix Dynamic Server バージョン 9.2 では、関数に OUT パラメータが含まれ る場合、ドライバは常に -9752 エラーを戻します。ドライバは SQLWarning オ ブジェクトを作成して CallableStatement オブジェクトにチェーニングします。 CallableStatement.getWarnings() メソッド、または関数に OUT パラメータが含 まれる場合に TRUE を戻す IfmxCallableStatement.hasOutParameter() メソッドを 呼び出すことにより、関数に OUT パラメータが含まれているかどうかを判別で きます。 関数に OUT パラメータが含まれている場合、OUT パラメータの登録には CallableStatement.registerOutParameter() メソッド、IN および OUT パラメータ 値の登録には setXXX() メソッド、OUT パラメータ値の抽出には getXXX() メソ ッドを使用する必要があります。 v CallableStatement.getMetaData() メソッドは、executeQuery() メソッドが実行さ れるまでは NULL を戻します。executeQuery() が呼び出された後は、 ResultSetMetaData オブジェクトには戻り値のみに関する情報が含まれ、OUT パ ラメータの情報は含まれません。 v IN パラメータは、すべて setXXX() メソッドを使用して指定する必要がありま す。 SQL 文ではリテラルを使用できません。例えば、次の文は信頼できない結 果を生成します。 CallableStatement cstmt = myConn.prepareCall("{call myFunction(25, ?)}"); 代わりに、リテラル パラメータを指定しない次のような文を使用します。 CallableStatement cstmt = myConn.prepareCall("{call myFunction(?, ?)}"); 両方のパラメータに対して setXXX() メソッドを呼び出します。 v getXXX() メソッドを使用して OUT パラメータ値を抽出するまでは、 CallableStatement.executeQuery() メソッドにより戻された ResultSet をクローズ しないでください。 v SQL 文で OUT パラメータを別のデータ型にキャストすることはできません。例 えば、次のキャストは無視されます。 第 3 章 データベース操作の実行 63 CallableStatement cstmt = myConn.prepareCall("{call foo(?::lvarchar, ?)}"; v setNull() と registerOutParameter() メソッドは両方とも、パラメータとして java.sql.Types の値を取ります。 java.sql.Types 値から Informix データ型への、 いくつかの 1 対多のマッピングがあります。 さらに、Informix のデータ型の中には java.sql.Types の値にマップされないもの もあります。 setNull() および registerOutParameter() に対する拡張機能によ り、これらの問題が解決されます。次の、『IN パラメータと OUT パラメータの 型マッピング』を参照してください。 これらの制約事項は、C、SPL、または Java の UDR を処理する JDBC アプリケー ションに適用されます。 IN パラメータと OUT パラメータの型マッピング: ドライバが、一致する Informix データ型を検出できない場合、またはマッピングのあいまいさ (一致する Informix データ型が複数ある) を検出した場合は、registerOutParameter(int, int)、 registerOutParameter(int, int, int)、または setNull(int, int) メソッドにより例外が 呼び出されます。 次の表に、CallableStatement インターフェイスが使用するマッ ピングを示します。アスタリスク (*) はマッピングのあいまいさを示します。 java.sql.Types com.informix.lang.IfxTypes Array* IFX_TYPE_LIST IFX_TYPE_MULTISET IFX_TYPE_SET Bigint IFX_TYPE_INT8 Binary IFX_TYPE_BYTE Bit 非サポート Blob IFX_TYPE_BLOB Char IFX_TYPE_CHAR (n) Clob IFX_TYPE_CLOB Date IFX_TYPE_DATE Decimal IFX_TYPE_DECIMAL Distinct* 基本型に依存 Double IFX_TYPE_FLOAT Float IFX_TYPE_FLOAT1 Integer IFX_TYPE_INT Java_Object* IFX_TYPE_UDTVAR IFX_TYPE_UDTFIX Long IFX_TYPE_BIGINT IFX_TYPE_BIGSERIAL Longvarbinary* 64 IBM Informix JDBC ドライバ プログラマーズ ガイド IFX_TYPE_BYTE IFX_TYPE_BLOB Longvarchar* IFX_TYPE_TEXT IFX_TYPE_CLOB IFX_TYPE_LVARCHAR Null 非サポート Numeric IFX_TYPE_DECMIAL Other 非サポート Real IFX_TYPE_SMFLOAT Ref 非サポート Smallint IFX_TYPE_SMINT Struct IFX_TYPE_ROW Time IFX_TYPE_DTIME (hour to second) Timestamp IFX_TYPE_DTIME (year to fraction(5)) Tinyint IFX_TYPE_SMINT Varbinary IFX_TYPE_BYTE Varchar IFX_TYPE_VCHAR (n) なし* IFX_TYPE_BOOL 1 このマッピングは JDBC に準拠しています。 IFX_SET_FLOAT_AS_SMFLOAT 接続プロパティを 1 に設定することにより、下位方向の互換性のために JDBC 実 数 (FLOAT) 型を Informix 小桁実数 (SMALLFLOAT) 型にマップできます。 マッピングのあいまいさを回避するには、IfmxCallableStatement インターフェイス で定義されている CallableStatement に対する次の拡張を使用します。 public void IfxRegisterOutParameter(int parameterIndex, int ifxType) throws SQLException; public void IfxRegisterOutParameter(int parameterIndex, int ifxType, String name) throws SQLException; public void IfxRegisterOutParameter(int parameterIndex, int ifxType, int scale) throws SQLException; public void IfxSetNull(int i, int ifxType) throws SQLException; public void IfxSetNull(int i, int ifxType, String name) throws SQLException; ifxType パラメータの可能値は 241 ページの『IfxTypes クラスの使用』にリストさ れています。 IBM Informix Dynamic Server バージョン 10.0 では、SPL UDR に対するバイナリ OUT パラメータをサポートするために、有効な BLOB 記述子とデータを JDBC ク ライアントが使用できるようにしています。 IBM Informix JDBC ドライバ バージョン 3.0 以降では、サーバが提供する OUT パラメータ記述子とデータを受信して、Java アプリケーション内で使用できます。 第 3 章 データベース操作の実行 65 注: メソッド getParameterType (ParameterMetaData) により取得されるすべての JDBC バイナリ型 (バイナリ (BINARY) 型、可変長バイナリ (VARBINARY) 型、ロング可変長バイナリ (LONGVARBINARY) 型) に対する唯一の正しい戻 り値は -4 です。これは、java.sql.Type.LONGVARBINARY データ型と関連付 けられています。これは、すべての JDBC バイナリ型が同一の Informix SQL データ型、バイト (BYTE) 型にマップされることを反映しています。 CallableStatement での名前付きパラメータ CallableStatement は、サーバで Java プログラムからストアド プロシジャを呼び出 す方法を提供します。 CallableStatement で名前付きパラメータを使用すると、序数 位置ではなく名前でパラメータを識別できます。この機能強化は、JDBC 3.0 仕様で 導入されました。プロシジャが固有である場合は、デフォルト値を持つパラメータ を省略でき、任意の順序でパラメータを入力できます。名前付きパラメータは特 に、多数の引数を持ち、それらの引数のいくつかはデフォルト値を持っているよう な、ストアド プロシジャを呼び出す場合に役立ちます。 JDBC ドライバはパラメータ名の大文字小文字を区別しません。ストアド プロシジ ャにすべての引数の名前が指定されていない場合は、サーバが、指定されていない 名前の代わりに空ストリングを受け渡します。 CallableStatement で使用される名前付きパラメータの要件と制約事 項 IBM Informix JDBC ドライバには、CallableStatement で使用される名前付きパラメ ータに関する次の要件と制約事項があります。 v 最小要件は、IBM Informix Dynamic Server バージョン 11.10.UC1 以降および IBM Informix JDBC ドライバ バージョン 3.10.JC1 以降です。 v CallableStatement のパラメータは、ルーチンの単一呼出しの中で名前または序数 フォーマットで指定する必要があります。例えば、1 つの引数のパラメータ名を 指定する場合は、すべての引数のパラメータ名を使用する必要があります。 v 名前付きパラメータは、遠隔 CallableStatement ではサポートされません。 v 名前付きパラメータは、JDK バージョン 1.4.x 以降でサポートされます。 v 名前付きパラメータのサポートは、ストアド プロシジャを呼び出すための既存の 制約事項に従います。 CallableStatement で使用される名前付きパラメータのサポートの検査: JDBC 仕様 では、ドライバと RDMS が CallableStatement での名前付きパラメータをサポート するかどうかを判別するために、DatabaseMetaData.supportsNamedParameters() メ ソッドが提供されています。次に例を示します。 Connection myConn = . . . // connection to the RDBMS for Database . . . DatabaseMetaData dbmd = myConn.getMetaData(); if (dbmd.supportsNamedParameters() == true) { System.out.println("NAMED PARAMETERS FOR CALLABLE" + "STATEMENTS IS SUPPORTED"); . . . } 名前付きパラメータがサポートされる場合、システムは true を戻します。 66 IBM Informix JDBC ドライバ プログラマーズ ガイド ストアド プロシジャのパラメータ名の抽出 ストアド プロシジャのパラメータの名前を抽出するには、次の例で示されているよ うに、JDBC 仕様で定義された DatabaseMetaData メソッドを使用します。 Connection myConn = ... // connection to the RDBMS for Database . . . DatabaseMetaData dbmd = myConn.getMetaData(); ResultSet rs = dbmd.getProcedureColumns( "myDB", schemaPattern, procedureNamePattern, columnNamePattern); rs.next() { String parameterName = rs.getString(4); - - - or - - String parameterName = rs.getString("COLUMN_NAME"); - - System.out.println("Column Name: " + parameterName); getProcedureColumns() メソッドのパラメータと一致するすべての列の名前が表示さ れます。 パラメータ名は、ParameterMetaData インターフェイスの一部ではなく、 ParameterMetaData オブジェクトからは抽出できません。 getProcedureColumns() メソッドを使用すると、その問合せは、システムにより生成 されたルーチンを含め、informix の所有するすべてのプロシジャを sysprocedures システム カタログ表から取得します。エラーが発生しないよう、使用するストアド プロシジャに、サーバ上での正しい権限が構成されていることを確認してくださ い。 getProcedureColumns() メソッドでの JDBC API の振舞いにおける重要な相違点に ついては、72 ページの『サポートされないメソッドおよび動作が異なるメソッド』 を参照してください。 名前付きパラメータと固有のストアド プロシジャ 固有のストアド プロシジャには、固有の名前および固有の数の引数があります。 CallableStatement でのパラメータの数が、固有のストアド プロシジャの引数の数以 下であるときには、そのストアド プロシジャで名前付きパラメータがサポートされ ます。 名前付きパラメータの数が引数の数と等しい場合の例: 次のストアド プロシジャ には 5 個の引数があります。 create procedure createProductDef(productname productdesc varchar(64), listprice float, minprice float, out prod_id float); . . . let prod_id = <value for prod_id>; end procedure; varchar(64), 以下のような 5 個のパラメータを持つ次の Java コードは、ストアド プロシジャに 相当します。JDBC 呼び出しの括弧内の疑問符 (?) は、パラメータを指します。(こ の場合は、5 個の引数に 5 個のパラメータがあります。)すべてのパラメータを設 定または登録してください。cstmt.setString("arg", name); という形式でパラメ ータの名前を指定します。この arg は、対応するストアド プロシジャでの引数の 名前です。ストアド プロシジャでの引数の順序と同じ順序でパラメータ名を指定す る必要はありません。 第 3 章 データベース操作の実行 67 String sqlCall = "{call CreateProductDef(?,?,?,?,?)}"; CallableStatement cstmt = conn.prepareCall(sqlCall); cstmt.setString("productname", name); cstmt.setString("productdesc", desc); cstmt.setFloat("listprice", listprice); cstmt.setFloat("minprice", minprice); // // // // Set Set Set Set Product Product Product Product Name. Description. ListPrice. MinPrice. // Register out parameter which should return the product is created. cstmt.registerOutParameter("prod_id", Types.FLOAT); // Execute the call. cstmt.execute(); // Get the value of the id from the OUT parameter: prod_id float id = cstmt.getFloat("prod_id"); Java コードおよびストアド プロシジャは、次のようなイベントの進行を示します。 1. ストアド プロシジャの呼出しが準備されます。 2. パラメータ名で、どの引数がどのパラメータの値またはデータ型に対応するかが 示されます。 3. 入力パラメータの値が設定され、出力パラメータのデータ型が登録されます。 4. ストアド プロシジャが、引数として入力パラメータを使用して実行されます。 5. ストアド プロシジャが、出力パラメータとして引数の値を戻し、出力パラメー タの値が抽出されます。 名前付きパラメータの数が引数の数より少ない場合の例: CallableStatement でのパ ラメータの数が、ストアド プロシジャの引数の数より少ない場合は、残りの引数は デフォルト値を持つ必要があります。サーバは自動的にデフォルト値を使用するの で、デフォルト値を持つ引数の値を設定する必要はありません。ただし、 CallableStatement で非デフォルト値を持つ引数、または疑問符 (?) でデフォルト値 を上書きする引数の場合は、指示する必要があります。 例えば、ストアド プロシジャに 10 個の引数があり、そのうち 4 個が非デフォル ト値を持ち、6 個がデフォルト値を持つ場合は、CallableStatement に 4 個以上の疑 問符が必要です。あるいは、5 個、6 個、または最大 10 個の疑問符を使用できま す。 CallableStatement に、非デフォルト値より多いがストアド プロシジャの引数の数よ り少ないパラメータが作成された場合は、非デフォルト引数の値を設定する必要が あります。残りのパラメータは、他の引数にすることができ、実行のたびに変更で きます。 次の固有のストアド プロシジャでは、引数 listprice および minprice にデフォ ルト値があります。 create procedure createProductDef(productname varchar(64), productdesc varchar(64), listprice float default 100.00, minprice float default 90.00, out prod_id float); . . . let prod_id = <value for prod_id>; end procedure; 68 IBM Informix JDBC ドライバ プログラマーズ ガイド 次の Java コードでは、ストアド プロシジャの引数より少ない数のパラメータを持 つストアド プロシジャを呼び出します (5 個の引数に 4 個のパラメータ)。 listprice にはデフォルト値があるため、CallableStatement から省略できます。 String sqlCall = "{call CreateProductDef(?,?,?,?)}"; // 4 params for 5 args CallableStatement cstmt = conn.prepareCall(sqlCall); cstmt.setString("productname", name); cstmt.setString("productdesc", desc); // Set Product Name. // Set Product Description. cstmt.setFloat("minprice", minprice); // Set Product MinPrice. // Register out parameter which should return the product id created. cstmt.registerOutParameter("prod_id", Types.FLOAT); // Execute the call. cstmt.execute(); // Get the value of the id from the OUT parameter: prod_id float id = cstmt.getFloat("prod_id"); また、同じストアド プロシジャの場合、minprice 引数のパラメータを省略できま す。CallableStatement をもう一度作成する必要はありません。 cstmt.setString("productname", name); // Set Product Name. cstmt.setString("productdesc", desc); // Set Product Description. cstmt.setFloat("listprice", listprice); // Set Product ListPrice. // Register out parameter which should return the product id created. cstmt.registerOutParameter("prod_id", Types.FLOAT); // Execute the call. cstmt.execute(); // Get the value of the id from the OUT parameter: prod_id float id = cstmt.getFloat("prod_id"); また、両方のデフォルト引数のパラメータを省略することもできます。 cstmt.setString("productname", name); cstmt.setString("productdesc", desc); cstmt.registerOutParameter("prod_id", Types.FLOAT); cstmt.execute(); float id = cstmt.getFloat("prod_id"); 名前付きパラメータとオーバーロード ストアド プロシジャ 複数のストアド プロシジャに同じ名前が付けられており、同じ数の引数がある場 合、それらのプロシジャはオーバーロードされます (オーバーロード UDR とも呼 ばれる)。 呼出しを単一のストアド プロシジャに解決できないため、JDBC ドライバはオーバ ーロード ストアド プロシジャについて SQLException をスローします。 SQLException が出されないようにするには、パラメータ リストで名前付きパラメ ータの Informix サーバ データ型を指定します。これには、::data_type を疑問符 に追加します。この data_type は、Informix サーバ データ型です。 例えば、 ?::varchar、?::float などです。すべての引数にオーバーロード ストアド プロシ ジャの引数と同じ順序で名前付きパラメータを入力する必要があります。 第 3 章 データベース操作の実行 69 例えば、次の 2 つのプロシジャには、同じ名前 (createProductDef) が付けられてお り、同じ数の引数があります。prod_id 引数のデータ型は、各プロシジャで異なり ます。 プロシジャ 1: create procedure createProductDef(productname productdesc varchar(64), listprice float default 100.00, minprice float default 90.00, prod_id float); ... let prod_id = <value for prod_id>; end procedure; varchar(64), プロシジャ 2: create procedure createProductDef(productname productdesc varchar(64), listprice float default 100.00, minprice float default 90.00, prod_id int); ... let prod_id = <value for prod_id>; end procedure; varchar(64), 次の Java コードを使用すると、1 つのプロシジャのみに解決できないため、 SQLException を戻します。 String sqlCall = "{call CreateProductDef(?,?,?,?,?)}"; CallableStatement cstmt = con.prepareCall(sqlCall); cstmt.setString("productname", name); // Set Product Name. 異なるデータ型を持つ引数の Informix データ型を指定する場合は、Java コードが 1 つのプロシジャに解決されます。 次の Java コードは prod_id 引数の実数 (FLOAT) 型を指定するため、このコードはストアド プロシジャ 1 に解決されま す。 String sqlCall = "{call CreateProductDef(?,?,?,?,?::float)}"; CallableStatement cstmt = con.prepareCall(sqlCall); cstmt.setString("productname", name); // Set Product Name DESCRIBE INPUT の JDBC サポート SQL 92 および SQL 99 標準には、動的 SQL に対する DESCRIBE INPUT 文の仕 様が定められています。IBM Informix Dynamic Server のバージョン 9.4 はこの文 をサポートしています。 (SQL 標準、構文、およびこの文の詳細については、 「IBM Informix SQL ガイド: 構文」を参照してください。) JDBC 3.0 仕様には、DESCRIBE INPUT のサポートに対応する ParameterMetaData クラスおよびメソッドが導入されています。 IBM Informix JDBC ドライバは、java.sql.ParameterMetaData クラスを実装してい ます。このインターフェイスは PREPARE 文で処理された文の入力パラメータを記 述するために使用されます。特定の文に対するメタデータを抽出するために、メソ ッド getParameterMetaData() が実装されています。 ParameterMetaData クラスと getParameterMetaData() メソッドは JDBC 3.0 API の一部であり、J2SDK1.4.0 のインターフェイスとして組み込まれています。これら のインターフェイスの詳細は、JDBC 3.0 仕様に明記されています。 70 IBM Informix JDBC ドライバ プログラマーズ ガイド IBM Informix JDBC ドライバは、機能拡張のために、ParameterMetaData インター フェイスに次の表に示すような追加メソッドを実装しています。 戻り型 メソッド 説明 int getParameterLength (int param) パラメータの長さを抽出します。 int getParameterExtendedId (int param) パラメータの拡張 ID を抽出します。 java.lang.String getParameterExtendedName (int param) パラメータの拡張名を抽出します。 java.lang.String getParameterExtendedOwnerName (int param) パラメータの拡張データ型の所有者名 を抽出します。 int getParameterSourceType (int param) パラメータの SourceType を抽出しま す。 int getParameterAlignment (int param) パラメータの配置を抽出します。 以下は、IBM Informix JDBC ドライバでの ParameterMetaData インターフェイス の使用例です。 . . . try { PreparedStatement pstmt = null; pstmt = myConn.prepareStatement( "select * from table_1 where int_col = ? " +"and string_col = ?"); ParameterMetaData paramMeta = pstmt.getParameterMetaData(); int count = paramMeta.getParameterCount(); System.out.println("Count : "+count); for (int i=1; i <= count; i++) { System.out.println("Parameter type name : " +paramMeta.getParameterTypeName(i)); System.out.println("Parameter type : " +paramMeta.getParameterType(i)); System.out.println("Parameter class name : " +paramMeta.getParameterClassName(i)); System.out.println("Parameter mode : " +paramMeta.getParameterMode(i)); System.out.println("Parameter precision : " +paramMeta.getPrecision(i)); System.out.println("Parameter scale : " +paramMeta.getScale(i)); System.out.println("Parameter nullable : " +paramMeta.isNullable(i)); System.out.println("Parameter signed : " +paramMeta.isSigned(i)); } . . . エスケープ構文の使用 エスケープ構文は、JDBC フォーマットから Informix ネイティブ フォーマットに 変換する必要がある情報を示します。 SQL 文に対する有効なエスケープ構文は以 下のとおりです。 文のタイプ エスケープ構文 プロシジャ {call procedure} 第 3 章 データベース操作の実行 71 関数 {var = call function} 日付 {d ’yyyy-mm-dd’} 時間 {t ’hh:mm:ss’} タイムスタンプ (日時) {ts ’yyyy-mm-dd hh:mm:ss[.fffff]’} 関数呼出し {fn func[(args)]} エスケープ文字 {escape ’escape-char’} 外部結合 {oj outer-join-statement} 次のように、任意の構文を SQL 文に書き込むことができます。 executeUpdate("insert into tab1 values( {d ’1999-01-01’} )"); 大括弧の内側にある内容はすべて有効な Informix SQL 文に変換され、呼出し関数 に戻されます。 サポートされないメソッドおよび動作が異なるメソッド 以下の JDBC API メソッドは IBM Informix JDBC ドライバでサポートされていな いため、Informix データベースに接続する Java プログラム内で使用できません。 v CallableStatement.getRef(int) v Connection.setCatalog() v Connection.setReadOnly() v PreparedStatement.addBatch(String) v PreparedStatement.setRef(int, Ref) v PreparedStatement.setUnicodeStream(int, java.io.InputStream, int) v ResultSet.getRef(int) v ResultSet.getRef(String) v ResultSet.getUnicodeStream(int) v ResultSet.getUnicodeStream(String) v ResultSet.refreshRow() v ResultSet.rowDeleted() v ResultSet.rowInserted() v ResultSet.rowUpdated() v ResultSet.setFetchSize() v Statement.setMaxFieldSize() Connection.setCatalog() および Connection.setReadOnly() メソッドはエラーなしで 戻ります。その他の上記メソッドは、「このメソッドはサポートされていません」 という例外を呼び出します。 次の JDBC API メソッドの動作は、JavaSoft 仕様で指定されているものとは異なり ます。 v CallableStatement.execute() 単一の結果セットを戻します。 72 IBM Informix JDBC ドライバ プログラマーズ ガイド v DatabaseMetaData.getProcedureColumns() 次に例を示します。 DBMD.getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) columnNamePattern フィールドを無視します。9.x より前のサーバ バージョンで 使用された場合は、NULL を戻します。 getProcedureColumns() メソッドを使用すると、その問合せは、システムにより生 成されたルーチンを含め、informix の所有するすべてのプロシジャを sysprocedures システム カタログ表から取得します。エラーが発生しないよう、 使用するストアド プロシジャに、サーバ上での正しい権限が構成されていること を確認してください。 例えば、以下のいずれかの文を使用するとします。 getProcedureColumns("","","","") getProcedureColumns("",informix,"","") DatabaseMetaData.getProcedureColumns() メソッドは、すべてのサーバ UDR、 またはユーザ informix によって所有されるすべての UDR をロードします。 J/Foundation をインストールしない場合、または J/Foundation の構成パラメータ が onconfig ファイルで有効な値に設定されていない場合、このメソッドは失敗し ます。また、サーバでいずれかの UDR が正しくセットアップされていない場合 も、メソッドは失敗します。 Informix サーバでの J/Foundation のセットアップ方法、および Informix サーバ での Java UDR の実行方法の詳細については、「J/Foundation 開発者ガイド」を 参照してください。C UDR をセットアップして実行する方法の詳細について は、「IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド」を 参照してください。 v DatabaseMetaData.othersUpdatesAreVisible() 常に FALSE を戻します。 v DatabaseMetaData.othersDeletesAreVisible() 常に FALSE を戻します。 v DatabaseMetaData.othersInsertsAreVisible() 常に FALSE を戻します。 v DatabaseMetaData.ownUpdatesAreVisible() 常に FALSE を戻します。 v DatabaseMetaData.ownDeletesAreVisible() 常に FALSE を戻します。 v DatabaseMetaData.ownInsertsAreVisible() 常に FALSE を戻します。 第 3 章 データベース操作の実行 73 v DatabaseMetaData.deletesAreDetected() 常に FALSE を戻します。 v DatabaseMetaData.updatesAreDetected() 常に FALSE を戻します。 v DatabaseMetaData.insertsAreDetected() 常に FALSE を戻します。 v PreparedStatement.execute() 単一の結果セットを戻します。 v ResultSet.getFetchSize() 常に 0 v ResultSetMetaData.getCatalogName() 常に、1 つの空白を含む String オブジェクトを戻します。 v ResultSetMetaData.getTableName() SELECT 文、INSERT 文、および UPDATE 文に対する表名を戻します。 複数の表名が指定された SELECT 文とその他のすべての文は、1 つの空白を含む String オブジェクトを戻します。 v ResultSetMetaData.getSchemaName() 常に、1 つの空白を含む String オブジェクトを戻します。 v ResultSetMetaData.isDefinitelyWriteable() 常に TRUE v ResultSetMetaData.isReadOnly() 常に FALSE を戻します。 v ResultSetMetaData.isWriteable() 常に TRUE v Statement.execute() 単一の結果セットを戻します。 v Connection.isReadOnly() HDR シナリオの副サーバに接続しているときにのみ TRUE を戻します (下記の 注、『重要』を参照)。 重要: IBM Informix サーバは、現在は読取り専用接続をサポートしていません。 IBM Informix JDBC ドライバ バージョン 2.21.JC4 において、 java.sql.Connection インターフェイスの setReadOnly() メソッドのインプリメ ンテーションは、呼出しプロセスにより渡された値を受け入れるように変更 されました。setReadOnly() メソッドは、Informix データベース サーバと対話 することなく、単に呼出しプロセスに戻ります。 (JDBC ドライバの前のバー 74 IBM Informix JDBC ドライバ プログラマーズ ガイド ジョンでは、サポートされないメソッドであるという例外が呼び出されまし た。) この変更は、IBM Informix JDBC ドライバに存在する機能を IBM DB2® JDBC ドライバと同期化させ、また、Sun Conformance Test (CTS) で の高水準な準拠を達成するために行われました。 トランザクションの処理 すべての新規 Connection オブジェクトは、デフォルトで自動コミット モードにな ります。自動コミット モードがオンのときは、データベース サーバに送信される 各文の後で COMMIT 文が自動的に実行されます。自動コミット モードをオフにす るには、明示的に Connection.setAutoCommit(false) を呼び出します。 自動コミット モードがオフの場合、次の文がデータベース サーバに送信される と、IBM Informix JDBC ドライバは暗黙的に新規トランザクションを開始します。 このトランザクションは、ユーザが COMMIT 文または ROLLBACK 文を実行する まで持続します。ユーザが setAutoCommit(false) を実行することですでにトランザ クションを開始しており、再度 setAutoCommit(false) を呼び出した場合、既存のト ランザクションが変更されずに継続されます。Java プログラムは、データベースま たはデータベース サーバへの接続を削除する前に、COMMIT 文または ROLLBACK 文のいずれかを実行して明示的にトランザクションを終了する必要が あります。 Java プログラムがトランザクション中に自動コミット モードをオンに設定すると、 JDK がバージョン 1.4 以降の場合は IBM Informix JDBC ドライバが現行のトラン ザクションをコミットし、それ以外の場合は自動コミットをオンにする前にドライ バが現行のトランザクションをロールバックします。 ログ機能付きで作成されたデータベースで、COMMIT 文がデータベース サーバに 送信され、自動コミット モードがオンである場合は、現在開始されているユーザ トランザクションが存在しないため、データベース サーバによりエラー「-255: ト ランザクションが開始されていません」が戻されます。これは、COMMIT 文が Connection.commit() メソッドを使用して送信された場合にも、SQL 文を使用して 直接送信された場合にも発生します。 ANSI モードで作成されたデータベースでは、データベース サーバに明示的に COMMIT 文を送信すると、空のトランザクションがコミットされます。データベー ス サーバは、現在オープンされているユーザ トランザクションが存在しなけれ ば、文を実行する前に自動的にトランザクションを開始するため、エラーは戻され ません。 XAConnection オブジェクトの場合、自動コミット モードはデフォルトでオフであ り、分散トランザクションの実行中はオフのままにしておく必要があります。トラ ンザクション マネージャがコミット操作とロールバック操作を実行します。したが って、ユーザがこれらの操作を直接実行するのは避ける必要があります。 第 3 章 データベース操作の実行 75 エラーの処理 Java プログラム内のエラーを処理するには、JDBC API SQLException クラスを使 用します。 Informix 固有の com.informix.jdbc.Message クラスを Java プログラム の外側で使用して、指定のエラー番号に対する Informix エラー テキストを抽出す ることもできます。 SQLException クラスを使用したエラーの処理 IBM Informix JDBC ドライバまたはデータベース サーバのいずれかでエラーが発 生すると、必ず SQLException が発生します。エラー メッセージのテキスト、エラ ー コード、および SQLSTATE 値を抽出するには、SQLException クラスの次のメ ソッドを使用します。 v getMessage() エラーの説明を戻します。 SQLException は、このメソッドを java.util.Throwable クラスから継承していま す。 v getErrorCode() Informix データベース サーバまたは IBM Informix JDBC ドライバのエラー コ ードに対応する整数値を戻します。 v getSQLState() SQLSTATE 値を説明する文字列を戻します。 文字列は X/Open SQLSTATE 規則に従っています。 全ての IBM Informix JDBC ドライバ エラーのエラー コードは、「-79708: NULL は入力できません」などのように、-79XXX という形式です。 Informix データベース サーバ エラーのリストについては、「IBM Informix エラー メッセージ」を参照してください。 IBM Informix JDBC ドライバ エラーのリスト については、本書の最後の方にある『エラー メッセージ』を参照してください。 SimpleSelect.java プログラムに含まれる次の例は、SQLException クラスを使用し て、IBM Informix JDBC ドライバまたはデータベース サーバのエラーを try-catch ブロックでキャッチする方法を示しています。 try { PreparedStatement pstmt = conn.prepareStatement("Select * from x " + "where a = ?;"); pstmt.setInt(1, 11); ResultSet r = pstmt.executeQuery(); while(r.next()) { short i = r.getShort(1); System.out.println("Select: column a = " + i); } r.close(); pstmt.close(); } catch (SQLException e) 76 IBM Informix JDBC ドライバ プログラマーズ ガイド { System.out.println("ERROR: Fetch statement failed: " + e.getMessage()); } 構文エラー オフセットの抽出 構文エラーの正確な位置を判別するには、getSQLStatementOffset() メソッドを使用 して構文エラー オフセットを戻します。 次の例は、SQL 文から構文エラー オフセット (この例では 10) を抽出する方法を 示しています。 try { Statement stmt = conn.createStatement(); String command = "select * fom tt"; stmt.execute( command ); } catch(Exception e) { System.out.println ("Error Offset :"+((IfmxConnection conn).getSQLStatementOffset() ); System.out.println(e.getMessage() ); } RSAM エラー メッセージのキャッチ RSAM メッセージは SQLCODE メッセージに付加されています。例えば、 SQLCODE メッセージが表を作成できないことを示すものである場合、RSAM メッ セージが、ディスク領域が十分でないなど、その理由を示します。 SQLException.getNextException() メソッドを使用して RSAM エラー メッセージを キャッチできます。これらのメッセージをキャッチする方法の例については、IBM Informix JDBC ドライバに含まれている ErrorHandling.java プログラムを参照して ください。 com.informix.jdbc.Message クラスを使用したエラー処理 Informix は、Informix エラー番号に基づいて Informix エラー メッセージ テキスト を抽出するためのクラス com.informix.jdbc.Message を提供しています。このクラス を使用するには、次の例に示すように、Java インタープリタ java に Informix エラ ー番号を渡して直接呼び出します。 java com.informix.jdbc.Message 100 この例は Informix エラー 100 に対するメッセージ テキストを戻します。 100: ISAM エラー: レコードの一意キーの値が重複しています。 com.informix.jdbc.Message クラス使用時に符号なし数値を指定すると、正のエラー 番号が戻されます。これは、符号なし数値に対して負のエラー番号を戻す finderr ユーティリティとは異なっています。 データベース メタデータへのアクセス Informix データベースに関する情報にアクセスするには、JDBC API DatabaseMetaData インターフェイスを使用します。 第 3 章 データベース操作の実行 77 IBM Informix JDBC ドライバは、DatabaseMetaData のメソッドに対するすべての JDBC 3.0 仕様を実装しています。 JDBC 3.0 に準拠するため、IBM Informix JDBC ドライバ 2.21.JC5 以降では DatabaseMetaData に以下の新規メソッドが追加されています。 v getSuperTypes() v getSuperTables() v getAttributes() v getResultSetHoldability() v getDatabaseMajorVersion() v getDatabaseMinorVersion() v getJDBCMajorVersion() v getJDBCMinorVersion() v getSQLStateType() v locatorsUpdateCopy() v supportsGetGeneratedKeys() v supportsMultipleOpenResults() v supportsNamedParameters() v supportsGetGeneratedKeys() v supportsMultipleOpenResults() Dynamic Server 10.0 以降と IBM Informix JDBC ドライバ 3.0 以降では、サーバで 生成されたキーを抽出するためのメソッドが実装されています。自動生成されたキ ーの抽出には、以下の操作が含まれます。 1. JDBC アプリケーション プログラマが、実行する SQL 文を作成します。 2. サーバが SQL 文を実行し、自動生成されたキーの抽出が可能であるという情報 が戻されます。 3. サーバが SQL 文を実行する前に、columnNames または columnIndexes (指定さ れている場合) の妥当性が検証されます。これらが無効である場合は SQLException が呼び出されます。 4. 要求された場合、JDBC ドライバとサーバは resultSet オブジェクトを戻しま す。キーが生成されなかった場合、resultSet は空で、行も列も含まれません。 5. ユーザは resultSet オブジェクトに対するメタデータを要求することが可能であ り、JDBC ドライバとサーバは resultSetMetaData オブジェクトを戻します。 自動生成キーの抽出の詳細については、JDBC 3.0 仕様、セクション 13.6 の 『Retrieving Auto Generated Keys』を参照してください。 IBM Informix JDBC ドライバは、データベース メタデータの取得に sysmaster デ ータベースを使用します。Java プログラム内で DatabaseMetaData インターフェイ スを使用する場合は、その Java プログラムが接続する Informix データベース サ ーバに sysmaster データベースが存在している必要があります。 例えば、IBM Informix SE には sysmaster データベースがないため、その環境では DatabaseMetaData インターフェイスを使用できません。 78 IBM Informix JDBC ドライバ プログラマーズ ガイド IBM Informix JDBC ドライバは、JDBC API の用語スキーマ を、表を所有する Informix ユーザの名前を意味するものとして解釈します。 DatabaseMetaData.getSchemas() メソッドは、systables システム カタログの owner 列で検出されたすべてのユーザを戻します。 同様に、IBM Informix JDBC ドライバは、JDBC API の用語カタログ を Informix データベースの名前を意味するものとして解釈します。 DatabaseMetaData.getCatalogs() メソッドは、Java プログラムが接続している Informix データベース サーバに現在存在するすべてのデータベースの名前を戻しま す。 DBMetaData.java の例は、DatabaseMetaData および ResultSetMetaData インター フェイスを使用して新規プロシジャに関する情報を収集する方法を示しています。 この例の詳細については、付録 A を参照してください。 JDBC API に対するその他の Informix 拡張機能 このセクションでは、このガイドでまだ説明されていない JDBC API に対する Informix 固有の拡張機能について説明します。これらの拡張機能は Informix データ ベースに固有な情報を処理します。 別の Informix 拡張機能、com.informix.jdbc.Message クラスについては、 76 ページ の『エラーの処理』で詳細に説明されています。 自動解放機能の使用 Informix 自動解放機能を有効にすると、データベース サーバはカーソルのクローズ 時に自動的にカーソルを解放します。 したがって、アプリケーションはクローズし てからカーソルを解放するために 2 つの別々の要求を送信する必要はありません。 カーソルをクローズするだけで済みます。 次の例のように、データベース URL で IFX_autofree 変数を TRUE に設定すること により、自動解放機能を有効にできます。 jdbc:informix-sqli://123.45.67.89:1533:INFORMIXSERVER=myserver; user=rdtest;password=test;ifx_autofree=true; 以下のメソッドのいずれかを使用することもできます。 public void setAutoFree (boolean flag) public boolean getAutoFree() setAutoFree() メソッドは executeQuery() メソッドの前に呼び出す必要があります が、getAutoFree() メソッドは executeQuery() メソッドの前でも後でも呼び出すこ とができます。 これらのメソッドを使用するには、アプリケーションが、次に示すように Informix パッケージ com.informix.jdbc からクラスをインポートし、Statement クラスを IfmxStatement クラスにキャストする必要があります。 import com.informix.jdbc.*; ... (IfmxStatement)stmt.setAutoFree(true); 自動解放機能は以下のデータベース サーバ バージョンで使用できます。 第 3 章 データベース操作の実行 79 v バージョン 7.23 以降 v バージョン 9.0 以降 ドライバのバージョン情報の取得 IBM Informix JDBC ドライバに関するバージョン情報を取得するには 2 つの方法 があります。Java プログラムからの取得と、UNIX® または MS-DOS のコマンド プロンプトからの取得です。 Java プログラムからバージョン情報を取得するには: 1. import セクションに次の行を追加して、Java プログラムに Informix パッケージ com.informix.jdbc.* をインポートします。 import com.informix.jdbc.*; 2. 静的メソッド IfxDriver.getJDBCVersion() を起動します。このメソッドは、現行 の IBM Informix JDBC ドライバの完全なバージョンを含む String オブジェク トを戻します。 IBM Informix JDBC ドライバのバージョンは、例えば 2.00.JC1 のようになりま す。 IfxDriver.getJDBCVersion() メソッドはバージョンのみを戻し、ドライバのイン ストール時に指定したシリアル番号は戻しません。 重要: IBM Informix JDBC ドライバのバージョン X.Y に対して、JDBC API メソ ッド Driver.getMajorVersion() および DatabaseMetaData.getDriverMajorVersion() は常に値 X を戻します。同様 に、メソッド Driver.getMinorVersion() および DatabaseMetaData.getDriverMinorVersion() は常に値 Y を戻します。 コマンド行から IBM Informix JDBC ドライバのバージョンを取得するには、UNIX シェル プロンプトまたは Windows コマンド プロンプトで、次のコマンドを入力 します。 java com.informix.jdbc.Version このコマンドは、ドライバのインストール時に指定したシリアル番号も戻します。 XML 文書の格納と抽出 Extensible Markup Language (XML) は、World Wide Web Consortium (W3C) によ り定義されているように、構造化データをプレーン テキストの編集可能ファイル (XML 文書 と呼ばれる) に記述するためのルール、ガイドライン、および規則を規 定しています。XML はデータの部分を区切るためにのみタグを使用し、データの解 釈はそれを使用するアプリケーションが行います。XML は、オープンでプラットフ ォームに依存しない形式でデータを表現する方法としてますます普及してきていま す。 XML 文書にアクセスするために現在使用可能な API は、JAXP (Java API for XML Parsing) と呼ばれています。 この API には次の 2 つのサブセットがありま す。 80 IBM Informix JDBC ドライバ プログラマーズ ガイド v SAX (Simple API for XML) はイベント ドリブン プロトコルで、XML パーサ が文書の分析時に呼び出すコールバック メソッドをプログラマが提供します。 v DOM (Document Object Model) はランダム アクセス プロトコルで、XML 文 書を、プログラマが思うとおりに操作できるメモリ内のオブジェクトの集合に変 換します。DOM オブジェクトのデータ型は Document です。 JAXP には、SAX パーサの作成と構成、および DOM オブジェクトの作成を行うた めの標準ファクトリ メソッドを提供することにより SAX と DOM へのプログラ マチックなアクセスを標準化する、プラグ可能層 も含まれています。 JDBC API に対する Informix 拡張セットにより、データベース列の XML データ の格納と取得が容易に行えます。 データ格納時に使用されるメソッドは、XML デ ータの構文解析、正しい形式で有効な XML データが格納されることの確認、およ び無効な XML データがリジェクトされることの確認を支援します。データ抽出時 に使用されるメソッドは、XML データの、DOM オブジェクトおよびデータ型 InputSource への変換を支援します。InputSource は、SAX と DOM の両方のメソ ッドへの標準入力データ型です。 Informix 拡張セットは、XML プログラマをサポ ートするとともに、プログラマが使用している JAXP パッケージを考慮した柔軟性 も提供するように設計されています。 XML メソッドを使用するための環境設定 このセクションには、JDBC ドライバの XML メソッドを使用できるように、シス テムを準備するために理解しておく必要がある情報が含まれます。 CLASSPATH の設定 XML メソッドを使用するには、以下のファイルのパス名を CLASSPATH 設定に追 加します。 v ifxtools.jar v xerces.jar これらのファイルはすべて、ドライバをインストールした場所の lib ディレクトリ にあります。 注: Xerces XML ライブラリ xerces.jar は、IBM Informix JDBC ドライバ バージ ョン 3.00 で、配布から除去されました。 Xerces は、http:// www.alphaworks.ibm.com/tech/xml4j から自由にダウンロード可能なオープン ソ ース ライブラリです。 XML メソッドは ifxjdbc.jar ファイルには含まれていません。代わりに、これらの メソッドは ifxtools.jar という別の .jar ファイルでリリースされています。これら のメソッドを使用するには、このファイルを ifxjdbc.jar とともに CLASSPATH 設 定に追加する必要があります。 さらに、ifxtools.jar のビルドには、SAX、DOM、および JAXP のメソッドをサポ ートする .jar ファイルのコードの使用が必要です。ifxtools.jar を使用するには、こ れらの .jar ファイルを CLASSPATH 設定に追加する必要があります。 JDK バージョン 1.4 以降は、CLASSPATH に xml4j パーサが含まれている場合で も、Sun Microsystems のデフォルトの XML パーサを使用します。 SAX パーサの 第 3 章 データベース操作の実行 81 xml4j インプリメンテーションを使用するには、アプリケーション コードで次のシ ステム プロパティを設定するか、-D コマンド行オプションを使用します。 v プロパティ javax.xml.parsers.SAXParserFactory は、 org.apache.xerces.jaxp.SAXParserFactoryImpl に設定する必要があります。 v Document Object Model の場合は、プロパティ javax.xml.parsers.DocumentBuilderFactory を org.apache.xerces.jaxp.DocumentBuilderFactoryImpl に設定する必要があります。 これらのプロパティの設定方法の詳細については、82 ページの『パーサ ファクト リの指定』を参照してください。 パーサ ファクトリの指定 デフォルトで、xml4j xerces パーサ (したがって ifxtools.jar) は、妥当性を検査しな い XML パーサを使用します。代わりの SAX パーサ ファクトリを使用するには、 コマンド行から次のようにアプリケーションを実行します。 % java -Djavax.xml.parsers.SAXParserFactory=new-factory コマンド行から実行していない場合は、次のようにファクトリ名を二重引用符で囲 む必要があります。 % java -Djavax.xml.parsers.SAXParserFactory="new-factory" 次のように、コード内でシステム プロパティを設定することもできます。 System.setProperty("javax.xml.parsers.SAXParserFactory", "new-factory") このコードで、new-factory は代わりのパーサ ファクトリです。例えば、xerces パ ーサを使用している場合、new-factory は org.apache.xerces.jaxp.SAXParserFactoryImpl で置き換えられます。 DOM メソッドに対して代替ドキュメント ファクトリを使用することもできます。 次のように、コマンド行からアプリケーションを実行します。 % java -Djavax.xml.parsers.DocumentBuilderFactory=new-factory コマンド行から実行していない場合は、次のようにファクトリ名を二重引用符で囲 む必要があります。 % java -Djavax.xml.parsers.DocumentBuilderFactory="new-factory" 次のように、コード内でシステム プロパティを設定することもできます。 System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "new-factory") 例えば、xerces パーサを使用している場合、new-factory は jorg.apache.xerces.jaxp.DocumentBuilderFactoryImpl で置き換えられます。 データの挿入 このセクションのメソッドを使用して、データベースの列に XML データを挿入で きます。 このセクションのメソッド宣言で使用されるパラメータの意味は次のとおりです。 82 IBM Informix JDBC ドライバ プログラマーズ ガイド v file パラメータは XML 文書です。文書は、URL (http://server/file.xml や file:///path/file.xml など)、またはパス名 (/tmp/file.xml や c:¥¥work¥¥file.xml な ど) で参照できます。 v handler パラメータはユーザが提供するオプションのクラスで、SAX パーサがフ ァイルの構文解析時に呼び出すコールバック ルーチンが含まれます。値が指定さ れない場合、または handler が NULL に設定されている場合、ドライバは成功か 失敗 (ドライバは SQLException の形式で失敗を報告) かをエコーイングする空 のコールバック ルーチンを使用します。 v validating パラメータは、SAX パーサ ファクトリに、形式をチェックするだけの パーサではなく、妥当性を検査するパーサを使用するように伝えます。 nsa も validating も指定しない場合、ドライバは xml4j の妥当性を検査しない XML パーサを使用します。デフォルトを変更するには、前のセクション、82 ペ ージの『パーサ ファクトリの指定』を参照してください。 v nsa パラメータは、ネーム スペースを処理できるパーサを使用する必要があるか どうかを SAX パーサ ファクトリに伝えます。 以下のメソッドは、SAX を使用してファイルを構文解析し、文字列に変換します。 その後、ユーザはこれらのメソッドから戻される文字列を PreparedStatement.setString() メソッドへの入力として使用して、データベースの列 にデータを挿入できます。 public String XMLtoString(String file, String handler, boolean validating,boolean nsa) throws SQLException public String XMLtoString(String file, String handler) throws SQLException public String XMLtoString(String file) throws SQLException 以下のメソッドは、SAX を使用してファイルを構文解析し、クラス InputStream のオブジェクトに変換します。その後、ユーザはその InputStream オブジェクトを PreparedStatement.setAsciiStream() メソッド、PreparedStatement.setBinaryStream() メソッド、または PreparedStatement.setObject() メソッドへの入力として使用し て、データベースの列にデータを挿入できます。 public InputStream XMLtoInputStream(String file, String handler, boolean validating,boolean nsa) throws SQLException; public InputStream XMLtoInputStream(String file, String handler) throws SQLException; public InputStream XMLtoInputStream(String file) throws SQLException; これらのメソッドの使用例については、84 ページの『データ挿入の例』を参照して ください。 値が指定されない場合、または handler が NULL に設定されている場合、ドライバ はデフォルトの Informix ハンドラを使用します。 重要: ドライバは、列に対して大きすぎる入力データは切り捨てます。例えば、 x.xml ファイルを、char (255) 型の列ではなく char (55) 型の列に挿入する と、ドライバは切り捨てられたファイルをエラーなしで挿入します (ただし、 第 3 章 データベース操作の実行 83 ドライバは SQLWarn 例外を呼び出します)。切り捨てられた行が選択される と、その行には無効な XML が含まれているため、パーサは SAXParseException を呼び出します。 データの抽出 このセクションのメソッドを使用して、データベースの列から取り出された XML データを変換できます。これらのメソッドは、選択された XML テキストを DOM に変換する場合、または SAX を使用してデータを構文解析する場合に役立ちま す。InputSource クラスは JAXP 構文解析メソッドへの入力データ型です。 file、handler、nsa、および validating の各パラメータの詳細については、82 ページ の『データの挿入』を参照してください。 以下のメソッドは、データ型 String または InputStream のオブジェクトをデータ型 InputSource のオブジェクトに変換します。ResultSet.getString() メソッド、 ResultSet.getAsciiStream() メソッド、または ResultSet.getBinaryInputStream() メソ ッドを使用してデータベースの列からデータを抽出した後で、抽出されたデータを getInputSource() に渡して SAX または DOM の任意の構文解析メソッドで使用す ることができます。(例については、85 ページの『データ抽出の例』を参照してく ださい。) public InputSource getInputSource(String s) throws SQLException; public InputSource getInputSource(InputStream is) throws SQLException; 以下のメソッドは、データ型 String または InputStream のオブジェクトを、データ 型 Document のオブジェクトに変換します。 public Document StringtoDOM(String s, String handler, boolean validating,boolean nsa) throws SQLException public Document StringtoDOM(String s, String handler) throws SQLException public Document StringtoDOM(String s) throws SQLException public Document InputStreamtoDOM(String s, String handler, boolean validating,boolean nsa) throws SQLException public Document InputStreamtoDOM(String file, String handler) throws SQLException public Document InputStreamtoDOM(String file) throws SQLException これらのメソッドの使用例については、85 ページの『データ抽出の例』を参照して ください。 データ挿入の例 このセクションの例は、XML 文書を、Informix データベースの列に挿入可能なフォ ーマットに変換する方法を示しています。 XMLtoString() の例 次の例は、3 つの XML 文書を文字列に変換してから、それらの文字列を SQL INSERT 文のパラメータ値として使用します。 84 IBM Informix JDBC ドライバ プログラマーズ ガイド PreparedStatement p = conn.prepareStatement("insert into tab values(?,?,?)"); p.setString(1, UtilXML.XMLtoString("/home/file1.xml")); p.setString(2, UtilXML.XMLtoString("http://server/file2.xml"); p.setString(3, UtilXML.XMLtoString("file3.xml"); 次の例は、XML ファイルをラージ可変長文字 (LVARCHAR) 型列に挿入します。 この例で、tab1 は次の SQL 文を使用して作成される表です。 create table tab1 (col1 lvarchar); コードは次のとおりです。 try { String cmd = "insert into tab1 values (?)"; PreparedStatement pstmt = conn.prepareStatement(cmd); pstmt.setString(1, UtilXML.XMLtoString("/tmp/x.xml")); pstmt.execute(); pstmt.close(); } catch (SQLException e) { // Error handling } XMLtoInputStream() の例 次の例は、XML ファイルをテキスト (TEXT) 型列に挿入します。この例で、表 tab2 は次の SQL 文を使用して作成されます。 create table tab2 (col1 text); コードは次のとおりです。 try { String cmd = "insert into tab2 values (?)"; PreparedStatement pstmt = conn.prepareStatement(cmd); pstmt.setAsciiStream(1, UtilXML.XMLtoInputStream("/tmp/x.xml"), (int)(new File("/tmp/x.xml").length())); pstmt.execute(); pstmt.close(); } catch (SQLException e) { // Error handling } データ抽出の例 次の例は、Informix データベースの列からデータを抽出し、そのデータを XML パ ーサが許容するフォーマットに変換する方法を示しています。 StringtoDOM() の例 この例は、xmlcol がラージ可変長文字 (LVARCHAR) 型列で、XML データを含ん でいることを前提として動作します。次のようなコードでデータを取り出して DOM に変換することができます。 ResultSet r = stmt.executeQuery("select xmlcol from table where ..."); while (r.next() 第 3 章 データベース操作の実行 85 { Document doc= UtilXML.StringtoDOM(r.getString("xmlcol")); // Process ‘doc’ } InputStreamtoDOM() の例 次の例は、XML データをテキスト (TEXT) 型列から DOM オブジェクトに取り出 します。 try { String sql = "select col1 from tab2"; Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery(sql); while(r.next()) { Document doc = UtilXML.InputStreamtoDOM(r.getAsciiStream(1)); } r.close(); } catch (Exception e) { // Error handling } getInputSource() の例 この例は、列 xmlcol に格納されている XML データを抽出し、そのデータをデー タ型 InputSource のオブジェクトに変換します。その後、InputSource オブジェクト i を、SAX または DOM の任意の構文解析メソッドとともに使用できます。 InputSource i = UtilXML.getInputSource (resultset.getString("xmlcol")); この例は、xerces.jar にある Sun の JAXP API インプリメンテーションを使用し て、列 xmlcol に取り出された XML データを構文解析します。 InputSource input = UtilXML.getInputSource(resultset.getString("xmlcol")); SAXParserFactory f = SAXParserFactory.newInstance(); SAXParser parser = f.newSAXParser(); parser.parse(input); 次の例で、tab1 は次の SQL 文を使用して作成される表です。 create table tab1 (col1 lvarchar); 次の例は、構文解析のために、ラージ可変長文字 (LVARCHAR) 型列から InputSource オブジェクトに XML データを取り出します。この例では、 org.apache.xerces.parsers.SAXParser のパーサを起動することにより、SAX 構文解 析を使用しています。 try { String sql = "select col1 from tab1"; Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery(sql); Parser p = ParserFactory.makeParser("org.apache.xerces.parsers.SAXParser"); while(r.next()) { InputSource i = UtilXML.getInputSource(r.getString(1)); p.parse(i); } r.close(); } 86 IBM Informix JDBC ドライバ プログラマーズ ガイド catch (SQLException e) { // Error handling } 次の例は、構文解析のために、テキスト (TEXT) 型列から InputSource オブジェク トに XML データを取り出します。これは前の例と同じ例ですが、データの分析 に、SAX パーサの代わりに JAXP ファクトリ メソッドを使用しています。 try { String sql = "select col1 from tab2"; Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery(sql); SAXParserFactory factory = SAXParserFactory.newInstance(); Parser p = factory.newSAXParser(); while(r.next()) { InputSource i = UtilXML.getInputSource(r.getAsciiStream(1)); p.parse(i); } r.close(); } catch (Exception e) { // Error handling } 第 3 章 データベース操作の実行 87 88 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 4 章 Informix データ型に関する作業 本章について . . . . . . . . . . . . . . . . . . . . ディスティンクト (DISTINCT) 型 . . . . . . . . . . . . . データ挿入の例 . . . . . . . . . . . . . . . . . . データ抽出の例 . . . . . . . . . . . . . . . . . . サポートされないメソッド . . . . . . . . . . . . . . バイト (BYTE) 型とテキスト (TEXT) 型 . . . . . . . . . . ラージ オブジェクトのキャッシュ. . . . . . . . . . . . 例: データの挿入または更新 . . . . . . . . . . . . . . 例: データの選択 . . . . . . . . . . . . . . . . . シリアル (SERIAL) 型と SERIAL8 型 . . . . . . . . . . . 大桁整数 (BIGINT) 型と BIGSERIAL 型 . . . . . . . . . . 時間隔 (INTERVAL) 型 . . . . . . . . . . . . . . . . Interval クラス . . . . . . . . . . . . . . . . . . バイナリ修飾子に対する変数の使用 . . . . . . . . . . Interval メソッドの使用 . . . . . . . . . . . . . . IntervalYM クラス . . . . . . . . . . . . . . . . . IntervalYM コンストラクタの使用 . . . . . . . . . . IntervalYM メソッドの使用 . . . . . . . . . . . . . IntervalDF クラス . . . . . . . . . . . . . . . . . IntervalDF コンストラクタの使用 . . . . . . . . . . . IntervalDF メソッドの使用 . . . . . . . . . . . . . 時間隔の例 . . . . . . . . . . . . . . . . . . . コレクションと配列 . . . . . . . . . . . . . . . . . コレクションの例 . . . . . . . . . . . . . . . . . 配列の例 . . . . . . . . . . . . . . . . . . . . 名前付き行と名前なし行. . . . . . . . . . . . . . . . 時間隔とコレクションのサポート. . . . . . . . . . . . サポートされないメソッド . . . . . . . . . . . . . . SQLData インターフェイスの使用 . . . . . . . . . . . SQLData の例 . . . . . . . . . . . . . . . . . Struct インターフェイスの使用 . . . . . . . . . . . . Struct の例 . . . . . . . . . . . . . . . . . . ClassGenerator ユーティリティの使用 . . . . . . . . . . 単純な名前付き行の例 . . . . . . . . . . . . . . ネストされた名前付き行の例 . . . . . . . . . . . . 型情報のキャッシュ . . . . . . . . . . . . . . . . . スマート ラージ オブジェクト データ型 . . . . . . . . . . データベース サーバ内のスマート ラージ オブジェクト . . . . クライアント アプリケーション内のスマート ラージ オブジェクト スマート ラージ オブジェクトの作成手順. . . . . . . . スマート ラージ オブジェクトへのアクセス手順 . . . . . スマート ラージ オブジェクトに対する操作の実行. . . . . . スマート ラージ オブジェクトのオープン. . . . . . . . スマート ラージ オブジェクト内での位置決め . . . . . . スマート ラージ オブジェクトからの読込み . . . . . . . スマート ラージ オブジェクトへの書込み. . . . . . . . スマート ラージ オブジェクトの切捨て . . . . . . . . スマート ラージ オブジェクトの測定 . . . . . . . . . スマート ラージ オブジェクトのクローズと解放 . . . . . IfxLocator の 16 進文字列への変換 . . . . . . . . . . © Copyright IBM Corp. 1996, 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 . 90 . 90 . 92 . 92 . 93 . 93 . 93 . 95 . 96 . 97 . 98 . 98 . 98 . 99 . 99 . 100 . 101 . 101 . 101 . 103 . 103 . 103 . 104 . 106 . 107 . 108 . 108 . 108 . 109 . 112 . 113 . 116 . 116 . 117 . 118 . 118 . 120 . 121 . 121 . 126 . 127 . 128 . 128 . 129 . 130 . 131 . 131 . 131 . 131 89 格納特性に関する作業 . . . . . . . . . . . . . . . システム指定の格納特性の使用 . . . . . . . . . . . ディスク格納領域情報に関する作業 . . . . . . . . . . ロギング、最終アクセス時間、およびデータ整合性に関する作業 格納特性の変更. . . . . . . . . . . . . . . . . 状態特性に関する作業 . . . . . . . . . . . . . . . ロックに関する作業 . . . . . . . . . . . . . . . . バイト範囲ロックの使用. . . . . . . . . . . . . . ラージ オブジェクトのキャッシュ . . . . . . . . . . . スマート ラージ オブジェクトの例 . . . . . . . . . . . スマート ラージ オブジェクトの作成 . . . . . . . . . スマート ラージ オブジェクトへのデータの挿入 . . . . . スマート ラージ オブジェクトからのデータの抽出. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 134 136 138 141 142 143 145 146 146 146 146 147 本章について この章では、IBM Informix JDBC ドライバでサポートされている Informix 固有の データ型 (不透明 (OPAQUE) 型を除く) について説明します。不透明 (OPAQUE) 型については、 149 ページの『第 5 章 不透明 (OPAQUE) 型に関する作業』を参照 してください。この章には以下のセクションが含まれます。 v ディスティンクト (DISTINCT) 型 v バイト (BYTE) 型とテキスト (TEXT) 型 v シリアル (SERIAL) 型と SERIAL8 型 v 大桁整数 (BIGINT) 型と BIGSERIAL 型 v 時間隔 (INTERVAL) 型 v コレクションと配列 v 名前付き行と名前なし行 v スマート ラージ オブジェクト データ型 ディスティンクト (DISTINCT) 型 ディスティンクト (DISTINCT) 型は、基礎となる基本型またはユーザ定義の Java オブジェクトにマップできます。 例えば、整数 (INT) 型のディスティンクト (DISTINCT) 型は、整数 (INT) 型、またはそのデータ表現をカプセル化する Java オブジェクトにマップできます。 この Java オブジェクトは java.sql.SQLData イン ターフェイスを実装する必要があります。 この Java オブジェクトを対応する SQL 型名にマップするには、 233 ページの『付録 C. データ型のマッピング』で説明さ れているようにカスタム型マップを指定する必要があります。 データ挿入の例 次の例に、ディスティンクト (DISTINCT) 型を定義する SQL 文を示します。 CREATE DISTINCT TYPE mymoney AS NUMERIC(10, 2); CREATE TABLE distinct_tab (mymoney_col mymoney); 以下は、基本型へのマッピングの例です。 String s = "insert into distinct_tab (mymoney_col) values (?)"; System.out.println(s); pstmt = conn.prepareStatement(s); 90 IBM Informix JDBC ドライバ プログラマーズ ガイド ... BigDecimal bigDecObj = new BigDecimal(123.45); pstmt.setBigDecimal(1, bigDecObj); System.out.println("setBigDecimal...ok"); pstmt.executeUpdate(); データベース サーバは基礎データ型とディスティンクト (DISTINCT) 型との間で暗 黙的なキャストを提供するため、ユーザが基礎データ型にマップすると、IBM Informix JDBC ドライバはクライアント サイドでマッピングを実行します。 ディスティンクト (DISTINCT) 型を、SQLData インターフェイスを実装する Java オブジェクトにマップすることもできます。 次の例に、ディスティンクト (DISTINCT) 型を定義する SQL 文を示します。 CREATE DISTINCT TYPE mymoney AS NUMERIC(10,2) 次のコードは、ディスティンクト (DISTINCT) 型を MyMoney という Java オブジ ェクトにマップします。 import java.sql.*; import com.informix.jdbc.*; public class myMoney implements SQLData { private String sql_type = "mymoney"; public java.math.BigDecimal value; public myMoney() { } public myMoney(java.math.BigDecimal value) this.value = value; public String getSQLTypeName() { return sql_type; { public void readSQL(SQLInput stream, String type) throws SQLException { sql_type = type; value = stream.readBigDecimal(); { public void writeSQL(SQLOutput stream) throws SQLException { stream.writeBigDecimal(value); } // overides Object.equals() public boolean equals(Object b) return value.equals(((myMoney)b).value); } public String toString() { return "value=" + value; } } ... String s - "insert into distinct_tab (mymoney_col) values (?)"; pstmt = conn.prepareStatement(s); myMoney mymoney = new myMoney(); mymoney.value = new java.math.BigDecimal(123.45); pstmt.setObject(1, mymoney); System.out.println("setObject(myMoney)...ok"); pstmt.executeUpdate(); 第 4 章 Informix データ型に関する作業 91 この場合、setBigDecimal() メソッドの代わりに setObject() メソッドを使用してデー タを挿入します。 データ抽出の例 カスタム型マップでマッピングが定義されている場合は、ディスティンクト (DISTINCT) 型を、その基礎となる基本型または Java オブジェクトとして取り出す ことができます。 前の例を使用して、次の例に示すように、Java オブジェクトとし てデータを取り出せます。 java.util.Map customtypemap = conn.getTypeMap(); System.out.println("getTypeMap...ok"); if (customtypemap == null) { System.out.println("¥n***ERROR: typemap is null!"); return; } customtypemap.put("mymoney", Class.forName("myMoney")); ... String s = "select mymoney_col from distinct_tab order by 1"; try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); System.out.println("Fetching data ..."); int curRow = 0; while (rs.next()) { curRow++; myMoney mymoneyret = (myMoney)rs.getObject("mymoney_col"); } System.out.println("total rows expected: " + curRow); stmt.close(); } catch (SQLException e) { System.out.println("***ERROR: " + e.getErrorCode() + " " + e.getMessage()); e.printStackTrace(); } この場合、getBigDecimal() メソッドの代わりに getObject() メソッドを使用してデ ータを抽出します。 サポートされないメソッド SQLInput および SQLOutput インターフェイスの以下のメソッドは、ディスティ ンクト (DISTINCT) 型に対してはサポートされていません。 v java.sql.SQLInput – readArray() – readCharacterStream() – readRef() v java.sql.SQLOutput – writeArray() – writeCharacterStream(Reader x) – writeRef(Ref x) 92 IBM Informix JDBC ドライバ プログラマーズ ガイド バイト (BYTE) 型とテキスト (TEXT) 型 このセクションでは、Informix のバイト (BYTE) 型とテキスト (TEXT) 型につい て、およびこれらのデータ型の列を JDBC API を使用して操作する方法について説 明します。 バイト (BYTE) 型は、差異のないバイト ストリームの任意の種類のデータを格納す るシンプル ラージ オブジェクト用のデータ型です。このバイナリ形式のデータの 例としては、スプレッドシート、ディジタル化された音声パターン、ビデオ クリッ プなどがあります。テキスト (TEXT) 型は、任意の種類のテキスト データを格納す るシンプル ラージ オブジェクト用のデータ型です。1 バイト文字とマルチバイト 文字の両方を含むことができます。 どちらのデータ型の列も、理論上の制限は 231 バイトで、実際的な制限はディスク 容量によって決定されます。 Informix のバイト (BYTE) 型とテキスト (TEXT) 型の詳細については、「IBM Informix SQL ガイド: リファレンス」および「IBM Informix SQL ガイド: 構文」を 参照してください。 ラージ オブジェクトのキャッシュ BLOB 型、CLOB 型、テキスト (TEXT) 型、またはバイト (BYTE) 型のオブジェ クトがデータベース サーバから取り出される場合、そのデータは必ずクライアント のメモリにキャッシュされます。ラージ オブジェクトのサイズが LOBCACHE 環 境変数の値よりも大きい場合、ラージ オブジェクトのデータは一時ファイルに格納 されます。LOBCACHE 変数の詳細については、208 ページの『ラージ オブジェク トのメモリ管理』を参照してください。 例: データの挿入または更新 バイト (BYTE) 型列およびテキスト (TEXT) 型列に挿入したり、これらの列を更新 したりするには、オペレーティング システムのファイルなどのソースからデータの ストリームを読み込み、java.io.InputStream オブジェクトとしてデータベースに転 送します。 PreparedStatement インターフェイスは、この Java 入力ストリームへ の入力パラメータの設定用メソッドを提供しています。 文が実行されると、IBM Informix JDBC ドライバは入力ストリームに対する呼出しを繰り返し、内容を読み 込んで実パラメータ データとしてデータベースに転送します。 バイト (BYTE) 型の場合は、PreparedStatement.setBinaryStream() メソッドを使用 して InputStream オブジェクトに対する入力パラメータを設定します。テキスト (TEXT) 型の場合は、PreparedStatement.setAsciiStream() メソッドを使用します。 ByteType.java プログラムに含まれる次の例は、オペレーティング システムのファ イル data.dat の内容をバイト (BYTE) 型列に挿入する方法を示しています。 try { stmt = conn.createStatement(); stmt.executeUpdate("create table tab1(col1 byte)"); } catch (SQLException e) { System.out.println("Failed to create table ..." + e.getMessage()); 第 4 章 Informix データ型に関する作業 93 } try { pstmt = conn.prepareStatement("insert into tab1 values (?)"); } catch (SQLException e) { System.out.println("Failed to Insert into tab: " + e.toString()); } File file = new File("data.dat"); int fileLength = (int) file.length(); InputStream value = null; FileInputStream fileinp = null; int row = 0; String str = null; int rc = 0; ResultSet rs = null; System.out.println("Inserting data ...¥n"); try { fileinp = new FileInputStream(file); value = (InputStream)fileinp; } catch (Exception e) {} try { pstmt.setBinaryStream(1,value,10); //set 1st column } catch (SQLException e) { System.out.println("Unable to set parameter"); } set_execute(); ... public static void set_execute() { try { pstmt.executeUpdate(); } catch (SQLException e) { System.out.println("Failed to Insert into tab: " + e.toString()); e.printStackTrace(); } } この例は、まずオペレーティング システム ファイル data.dat を表す java.io.File オブジェクトを作成します。次に、File 型のオブジェクトから読み込むための FileInputStream オブジェクトを作成します。FileInputStream 型のオブジェクト は、そのスーパークラス InputStream にキャストされます。これは、 PreparedStatement.setBinaryStream() メソッドに対する 2 番目のパラメータに予期 されるデータ型です。準備済みの INSERT 文で setBinaryStream() メソッドが実行 されます。これにより、入力ストリーム パラメータが設定されます。最後に、 94 IBM Informix JDBC ドライバ プログラマーズ ガイド PreparedStatement.executeUpdate() メソッドが実行されます。これにより、オペレ ーティング システムのファイル data.dat の内容が、バイト (BYTE) 型列に挿入さ れます。 TextType.java プログラムは、テキスト (TEXT) 型列にデータを挿入する方法を示 しています。バイト (BYTE) 型列への挿入の場合と類似していますが、入力パラメ ータの設定には、setBinaryStream() メソッドではなく、setAsciiStream() メソッド が使用されています。 例: データの選択 表から ResultSet オブジェクトに選択した後で、ResultSet.getBinaryStream() メソ ッドおよび ResultSet.getAsciiStream() メソッドを使用して、バイト (BYTE) 型列お よびテキスト (TEXT) 型列から、バイナリまたは ASCII データのストリームをそ れぞれ抽出できます。どちらのメソッドも、InputStream オブジェクトを戻しま す。このオブジェクトはチャンク単位でのデータの読込みに使用できます。 次の行を抽出するために next() メソッドを呼び出す前に、現在行で戻されたストリ ームのデータをすべて読み込む必要があります。 ByteType.java プログラムに含まれる次の例は、バイト (BYTE) 型列からデータを 選択し、そのデータを標準出力装置に出力する方法を示しています。 try { stmt = conn.createStatement(); rs = stmt.executeQuery("Select * from tab1"); while( rs.next() ) { row++; value = rs.getBinaryStream(1); dispValue(value); } } catch (Exception e) { } ... public static void dispValue(InputStream in) { int size; byte buf; int count = 0; try { size = in.available(); byte ary[] = new byte[size]; buf = (byte) in.read(); while(buf!=-1) { ary[count] = buf; count++; buf = (byte) in.read(); } } catch (Exception e) { System.out.println("Error occured while reading stream ... ¥n"); } } 第 4 章 Informix データ型に関する作業 95 この例は、まず SELECT 文の結果を ResultSet オブジェクトに書き込みます。次 に、ResultSet.getBinaryStream() メソッドを実行して、バイト (BYTE) 型データを Java InputStream オブジェクトに抽出します。 列の内容を標準出力装置に出力するために、dispValue() メソッドが使用されていま す。このメソッドの Java コードもサンプルに含まれています。 dispValue() メソッ ドは、バイト配列と InputStream.read() メソッドを使用して、バイト (BYTE) 型列 の内容を体系的に読み込みます。 TextType.java プログラムは、テキスト (TEXT) 型列からデータを選択する方法を 示しています。バイト (BYTE) 型列からの選択の場合と非常に類似していますが、 getBinaryStream() メソッドではなく getAsciiStream() メソッドが使用されていま す。 シリアル (SERIAL) 型と SERIAL8 型 IBM Informix JDBC ドライバは、getSerial() メソッドおよび getSerial8() メソッド により、Informix のシリアル (SERIAL) 型および SERIAL8 型をサポートしていま す。これらのメソッドは、java.sql.Statement インターフェイスのインプリメンテー ションの一部です。 シリアル (SERIAL) 型および SERIAL8 型には java.sql.Types クラスの JDBC API データ型への明確なマッピングがないため、シリアル (SERIAL) 型列および SERIAL8 型列を処理するためには、Java プログラムに Informix 固有のクラスをイ ンポートする必要があります。これを行うには、Java プログラムに次の import 行 を追加します。 import com.informix.jdbc.*; INSERT 文の後で getSerial() メソッドおよび getSerial8() メソッドを使用して、表 のシリアル (SERIAL) 型列または SERIAL8 型列に自動的に挿入されたシリアル値 をそれぞれ戻します。以下のいずれかの条件に該当する場合、これらのメソッドは 0 を戻します。 v 最後の文が INSERT 文ではなかった。 v 挿入対象の表に、シリアル (SERIAL) 型列または SERIAL8 型列が含まれていな い。 v まだ INSERT 文が実行されていない。 CREATE TABLE 文の後で getSerial() メソッドまたは getSerial8() メソッドを実行 すると、このメソッドはデフォルトで 1 を戻します (新規表にシリアル (SERIAL) 型列または SERIAL8 型列が含まれていると想定)。その表にシリアル (SERIAL) 型 列または SERIAL8 型列が含まれない場合、このメソッドは 0 を戻します。新規シ リアル開始番号を割り当てる場合、メソッドはその番号を戻します。 getSerial() メソッドおよび getSerial8() メソッドを使用する場合、Statement または PreparedStatement オブジェクトを IfmxStatement (Statement インターフェイスの Informix 固有のインプリメンテーション) にキャストする必要があります。次の例 は、キャストの実行方法を示しています。 96 IBM Informix JDBC ドライバ プログラマーズ ガイド cmd = "insert into serialTable(i) values (100)"; stmt.executeUpdate(cmd); System.out.println(cmd+"...okay"); int serialValue = ((IfmxStatement)stmt).getSerial(); System.out.println("serial value: " + serialValue); シリアル (SERIAL) 型列または SERIAL8 型列に連続するシリアル値を挿入する場 合は、INSERT 文のシリアル (SERIAL) 型列または SERIAL8 型列に対して、値 0 を指定します。列が 0 に設定されている場合、データベース サーバは次の最高値 を割り当てます。 Informix のシリアル (SERIAL) 型と SERIAL8 型の詳細については、「IBM Informix SQL ガイド: リファレンス」および「IBM Informix SQL ガイド: 構文」を 参照してください。 大桁整数 (BIGINT) 型と BIGSERIAL 型 大桁整数 (BIGINT) 型と BIGSERIAL 型の値の範囲は、INT8 型と SERIAL8 型の 値の範囲と同じです。ただし、大桁整数 (BIGINT) 型と BIGSERIAL 型は、格納域 と計算の点で INT8 型と SERIAL8 型より優れています。 大桁整数 (BIGINT) 型と BIGSERIAL 型の両方が、クラス java.sql.Types で大桁整 数 (BIGINT) Java 型にマップされます。データベースからデータを抽出する際に、 大桁整数 (BIGINT) 型と BIGSERIAL 型は長 Java 型にマップされます。 Informix JDBC ドライバ では、java.sql.Statement インターフェースの一部である getBigSerial() メソッドにより、Informix BIGSERIAL 型と大桁整数 (BIGINT) 型が サポートされます。 BIGSERIAL 型および 大桁整数 (BIGINT) 型には java.sql.Types クラスの JDBC API 型への明確なマッピングがないため、BIGSERIAL 型列および大桁整数 (BIGINT) 型列を処理するためには、Java プログラムに Informix 固有のクラスをイ ンポートする必要があります。これを行うには、Java プログラムに次の import 行 を追加します。 import com.informix.jdbc.*; INSERT 文の後で getBigSerial() メソッドを使用して、表のシリアル (SERIAL) 型 列または SERIAL8 型列に自動的に挿入された値をそれぞれ戻します。 getBigSerial() メソッドを使用する場合、Statement または PreparedStatement オブ ジェクトを IfmxStatement (Statement インターフェイスの Informix 固有のインプ リメンテーション) にキャストする必要があります。次の例は、キャストの実行方 法を示しています。 cmd = "insert into bigserialTable(i) values (100)"; stmt.executeUpdate(cmd); System.out.println(cmd+"...okay"); long serialValue = ((IfmxStatement)stmt).getBigSerial(); System.out.println("serial value: " + serialValue); これらのデータ型は com.informix.lang.IfxTypes クラスに含まれています。IfxTypes 定数と、対応する Informix 型については、241 ページの『IfxTypes クラスの使用』 表を参照してください。 第 4 章 Informix データ型に関する作業 97 時間隔 (INTERVAL) 型 Informix 時間隔 (INTERVAL) 型は、時間の間隔を表す値を格納します。 時間隔 (INTERVAL) 型は、年月時間隔と日時時間隔という 2 つのデータ型から構成されま す。年月時間隔は年と月のスパンを表し、日時時間隔は日、時、分、秒、および秒 の小数部のスパンを表します。時間隔 (INTERVAL) 型、および 修飾子、精度、小 数部 の定義の詳細については、以下の資料を参照してください。 v IBM Informix SQL ガイド: チュートリアル v IBM Informix SQL ガイド: リファレンス v IBM Informix SQL ガイド: 構文 Interval クラス com.informix.lang.Interval クラスは、Sun Microsystems の JDBC 仕様に対する Informix 固有の拡張です。Interval は、時間隔 (INTERVAL) 型に対する基本クラス です。Interval には、IntervalYM (年月修飾子用) と IntervalDF (日時修飾子用)、と いう 2 つのサブクラスがあります。これらのサブクラスを使用して、時間隔 (INTERVAL) 型を作成し、操作します。 ヒント: Interval、IntervalYM、および IntervalDF コンストラクタの多くは、パラ メータとして Connection オブジェクトを取ります。これにより CLIENT_LOCALE 環境変数の値が、Interval、IntervalYM、または IntervalDF オブジェクトに渡され、例外が呼び出された場合にローカライ ズされたエラー メッセージを表示できるようになります。詳しくは、205 ページの『ローカライズされたエラー メッセージのサポート』を参照して ください。 このセクションの時間隔 (INTERVAL) 型の文字列フォーマットについては、「IBM Informix SQL ガイド: 構文」を参照してください。 このセクションでは、時間隔 (INTERVAL) 型とともに使用できる多くのメソッドに ついて説明します。詳細な参照情報については、ソフトウェアをインストールした 後で、ディレクトリ doc/javadoc/* のオンライン参考資料を参照してください。(doc ディレクトリは、IBM Informix JDBC ドライバをインストールしたディレクトリの サブディレクトリです。) バイナリ修飾子に対する変数の使用 文字列修飾子を使用して時間隔 (INTERVAL) 型を操作できますが、バイナリ修飾子 を使用する方が高速なパフォーマンスを得られます。 Interval 基本クラスで以下の 変数が定義され、バイナリ修飾子のフィールドの時間単位 (開始コードと終了コー ド) を表しています。これらの変数を使用するには、IntervalYM および IntervalDF クラスのオブジェクトをインスタンス化します。これらのクラスは、Interval 基本 クラスからこれらの変数を継承します。 98 変数 説明 TU_YEAR YEAR 修飾子フィールドに対する時間単位 TU_MONTH MONTH 修飾子フィールドに対する時間単位 TU_DAY DAY 修飾子フィールドに対する時間単位 IBM Informix JDBC ドライバ プログラマーズ ガイド TU_HOUR HOUR 修飾子フィールドに対する時間単位 TU_MINUTE MINUTE 修飾子フィールドに対する時間単位 TU_SECOND SECOND 修飾子フィールドに対する時間単位 TU_FRAC 先行する FRACTION 修飾子フィールドに対する時間単位 TU_F1 FRACTION の最初の位置の終了フィールドに対する時間単位 TU_F2 FRACTION の 2 番目の位置の終了フィールドに対する時間単位 TU_F3 FRACTION の 3 番目の位置の終了フィールドに対する時間単位 TU_F4 FRACTION の 4 番目の位置の終了フィールドに対する時間単位 TU_F5 FRACTION の 5 番目の位置の終了フィールドに対する時間単位 Interval メソッドの使用 Interval のメソッドを使用して、バイナリ修飾子に関する情報を抽出できます。こ れらのメソッドを使用するには、IntervalYM および IntervalDF クラスのオブジェ クトをインスタンス化します。これらのクラスは、Interval 基本クラスからこれら の変数を継承します。 以下に、実行可能なタスクと使用可能なメソッドをいくつか示します。 v 修飾子の長さの抽出: public static byte getLength(short qualifier) v 修飾子から開始フィールド コード (TU_XXX 変数のいずれか) を抽出: public static byte getStartCode(short qualifier) v 修飾子から終了フィールド コード (TU_XXX 変数のいずれか) を抽出: public static byte getEndCode(short qualifier) v 時間隔の部分の TU_XXX 値に対応する文字列値の取得 (例えば、 getFieldName(TU_YEAR) は、文字列 year を戻す): public static String getFieldName(byte code) v 修飾子を入力として取り、時間隔の名前全体を文字列として取得: public static String getIfxTypeName(int type, short qualifier) v 時間隔 (INTERVAL) 型の FRACTION 部分の桁数の取得: public static byte getScale(short qualifier) v 長さ、開始コード (TU_XXX)、および終了コード (TU_XXX) からバイナリ修飾子 を作成: public static short getQualifier(byte length, byte startCode, byte endCode) throws SQLException 例えば、getQualifier(4, TU_YEAR, TU_MONTH) は、YEAR TO MONTH 修飾子 のバイナリ表現を作成します。 IntervalYM クラス com.informix.lang.IntervalYM クラスを使用して年月時間隔を操作できます。 第 4 章 Informix データ型に関する作業 99 IntervalYM コンストラクタの使用 デフォルト コンストラクタは次のように定義されています。 public IntervalYM() throws SQLException 例外が呼び出された場合にローカライズされたエラー メッセージを表示するには、 次の 2 番目のバージョンのコンストラクタを使用します。 public IntervalYM(Connection conn) throws SQLException 特定の入力値から年月時間隔を作成するには、次のコンストラクタを使用します。 v Timestamp1 - Timestamp2 に等しい IntervalYM 値を戻す 2 つのタイムスタンプ: public IntervalYM(Timestamp t1, Timestamp t2) throws SQLException public IntervalYM (Timestamp t1, Timestamp t2, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 v 年と月の値 (月の値が大きい場合は年に変換): public IntervalYM(int years, int months) throws SQLException public IntervalYM(int years, int months, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 v 月の値と符号化された修飾子: public IntervalYM(int months, short qualifier, Connection conn) throws SQLException 修飾子を指定するには、99 ページの『Interval メソッドの使用』で説明されてい る getQualifier() メソッドを使用します。このコンストラクタは、ローカライズ されたエラー メッセージをサポートします。 v 文字列: public IntervalYM(String string) throws SQLException public IntervalYM(String string, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 v 文字列と修飾子: public IntervalYM(String string, short qualifier, Connection conn) throws SQLException 修飾子を指定するには、99 ページの『Interval メソッドの使用』で説明されてい る getQualifier() メソッドを使用します。このコンストラクタは、ローカライズ されたエラー メッセージをサポートします。 v 文字列と修飾子情報: 100 IBM Informix JDBC ドライバ プログラマーズ ガイド public IntervalYM(String string, int length, byte startCode, byte endCode) throws SQLException public IntervalYM(String string, int length, byte startCode, byte endCode, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 IntervalYM メソッドの使用 以下のメソッドを使用して年月時間隔を操作できます。 (前に説明した Interval メ ソッドを使用することもできます。) IntervalYM メソッドを使用して実行できるタ スクには、次のようなものがあります。 v 2 つの時間隔の比較: boolean equals(Object other) boolean greaterThan(IntervalYM other) boolean lessThan(IntervalYM other) v 時間隔の値を以下から設定: – 文字列: void fromString(String other) void set(String string) – 年と月の値 (月の値が大きい場合は年に変換): void set(int years, int months) – 2 つのタイムスタンプ: void set(Timestamp t1, Timestamp t2) v 時間隔に対する修飾子の設定: – 長さ、開始コード、および終了コードから: void setQualifier(int length, byte startcode, byte endcode) – 既存の修飾子の使用: void setQualifier(short qualifier) v 時間隔の月数の取得: long getMonths() v 時間隔の文字列表現を、フォーマット yyyy-mm で作成: String toString() 存在するフィールドは修飾子に依存します。空白で先行ゼロを置き換えます。 IntervalDF クラス com.informix.lang.IntervalDF クラスを使用して、時間隔を操作できます。 IntervalDF コンストラクタの使用 デフォルト コンストラクタは次のように定義されています。 public IntervalDF() throws SQLException 例外が呼び出された場合にローカライズされたエラー メッセージを表示するには、 次の 2 番目のバージョンのデフォルト コンストラクタを使用します。 public IntervalDF(Connection conn) throws SQLException 第 4 章 Informix データ型に関する作業 101 特定の入力値から時間隔を作成するには、次のコンストラクタを使用します。 v t1 - t2 に等しい IntervalDF 値を戻す 2 つのタイムスタンプ t1 と t2: public IntervalDF(Timestamp t1, Timestamp t2) throws SQLException public IntervalDF(Timestamp t1, Timestamp t2, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 v 秒数とナノ秒数 (大きい秒の値は、分、時間、または日に変換): public IntervalDF(long seconds, long nanos) throws SQLException public IntervalDF(long seconds, long nanos, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 v 秒数、ナノ秒数、および修飾子: public IntervalDF(long seconds, long nanos, short qualifier) throws SQLException public IntervalDF(long seconds, long nanos, short qualifier, Connection conn) throws SQLException 修飾子を指定するには、99 ページの『Interval メソッドの使用』で説明されてい る getQualifier() メソッドを使用します。2 番目のバージョンで、ローカライズ されたエラー メッセージをサポートできます。 v 文字列: public IntervalDF(String string) throws SQLException public IntervalDF(String string, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 これらのコンストラクタを使用すると、デフォルト修飾子は次の値に設定されま す。 先行するフィールド精度: 2 開始コード: TU_DAY 終了コード: TU_F5 時間隔 (INTERVAL) 型の文字列フォーマットについては、「IBM Informix SQL ガイド: 構文」を参照してください。 v 文字列と修飾子: public IntervalDF(String string, short qualifier) throws SQLException public IntervalDF(String string, short qualifier, Connection conn) throws SQLException 修飾子を指定するには、99 ページの『Interval メソッドの使用』で説明されてい る getQualifier() メソッドを使用します。2 番目のバージョンで、ローカライズ されたエラー メッセージをサポートできます。 v 文字列と修飾子情報: 102 IBM Informix JDBC ドライバ プログラマーズ ガイド public IntervalDF(String string, int length, byte startcode, byte endcode) throws SQLException public IntervalDF(String string, int length, byte startcode, byte endcode, Connection conn) throws SQLException 2 番目のバージョンで、ローカライズされたエラー メッセージをサポートできま す。 IntervalDF メソッドの使用 以下のメソッドを使用して時間隔を操作できます。 (前に説明した Interval メソッ ドを使用することもできます。) 実行可能なタスクと使用可能なメソッドを以下に 示します。 v 2 つの時間隔の比較: boolean equals(Object other) boolean greaterThan(IntervalDF other) boolean lessThan(IntervalDF other) v 時間隔の値を以下から設定: – 文字列: void fromString(String other) void set(String string) – 秒とナノ秒の値 (大きい秒の値は、分、時間、または日に変換): void set(long seconds, long nanos) – 2 つのタイムスタンプ: void set(Timestamp t1, Timestamp t2) v 長さ、開始コード、および終了コードからの修飾子の設定: void setQualifier(int length, byte startcode, byte endcode) v 時間隔のナノ秒数の取得: long getNanoSeconds() v 時間隔の秒数の取得: long getSeconds() v 時間隔の文字列表現をフォーマット ddddd hh:mm:ss.nano で作成: String toString() 存在するフィールドは修飾子に依存します。空白で先行ゼロを置き換えます。 時間隔の例 IBM Informix JDBC ドライバに含まれている Intervaldemo.java プログラムは、2 つの種類の時間隔 (INTERVAL) 型への挿入、およびこれらからの選択を行う方法を 示しています。 コレクションと配列 Sun Microsystem JDBC 3.0 仕様には、Java クライアントとリレーショナル データ ベースとの間でコレクション データを交換する方法が、1 つのみ記述されていま す。それは配列です。 第 4 章 Informix データ型に関する作業 103 Array インターフェイスにはコンストラクタが含まれないため、IBM Informix JDBC ドライバには、PreparedStatement.setObject() メソッドおよび ResultSet.getObject() メソッドで java.util.Collection オブジェクトを使用できるようにするための拡張が 含まれています。 Array オブジェクトを使用する場合は、PreparedStatement.setArray() メソッドおよ び ResultSet.getArray() メソッドを使用します。 Collection オブジェクトを使用す る方が簡単ですが、Array オブジェクトは JDBC 3.0 標準に準拠しています。 デフォルトで、ドライバはフェッチ中に、リスト (LIST) 型列を java.util.ArrayList オブジェクトに、セット (SET) 型列とマルチセット (MULTISET) 型列を java.util.HashSet オブジェクトにマップします。これらのデフォルトを上書きでき ますが、使用するクラスが java.util.Collection インターフェイスを実装する必要が あります。 このデフォルトのマッピングを上書きするために、java.util.Collection インターフェ イスの他のクラス (TreeSet クラスなど) を使用できます。java.util.Collection イン ターフェイスを実装する独自のクラスを作成することもできます。どちらの場合で も、Connection.setTypeMap() メソッドを使用してカスタマイズされた型マップを指 定する必要があります。 INSERT 操作中に、java.util.Set インターフェイスのインスタンスである java.util.Collection オブジェクトはすべて、Informix のマルチセット (MULTISET) 型にマップされます。 java.util.List インターフェイスのインスタンスは、Informix のリスト (LIST) 型にマップされます。 カスタマイズされた型マッピングを作成す ることにより、これらのデフォルトを上書きできます。 カスタマイズされた型マッピングについては、付録 C を参照してください。 重要: セットには定義上順序がありません。HashSet オブジェクトを使用してコレ クション データを選択した場合、HashSet オブジェクト内の要素の順序がセ ットの挿入時に指定した順序と同一でない可能性があります。例えば、デー タベース サーバ上のデータが set {1, 2, 3} である場合、HashSet オブジェ クトには、{3, 2, 1} など、他の順序で抽出される可能性があります。 以下のセクションのすべての例の完全なバージョンは、ドライバをインストールし た場所の complex-types ディレクトリにあります。詳しくは、 217 ページの『付録 A. サンプル コード ファイル』を参照してください。 コレクションの例 以下は、サンプルのデータベース スキーマです。 create table tab ( a set(integer not null), b integer); insert into tab values ("set{1, 2, 3}", 10); 以下は、java.util.HashSet オブジェクトを使用したフェッチの例です。 java.util.HashSet set; PreparedStatement pstmt; ResultSet rs; pstmt = conn.prepareStatement("select * from tab"); System.out.println("prepare ... ok"); rs = pstmt.executeQuery(); 104 IBM Informix JDBC ドライバ プログラマーズ ガイド System.out.println("executeQuery ... ok"); rs.next(); set = (HashSet) rs.getObject(1); System.out.println("getObject() ... ok"); /* The user can now use HashSet.iterator() to extract * each element in the collection. */ Iterator it = set.iterator(); Object obj; Class cls = null; int i = 0; while (it.hasNext()) { obj = it.next(); if (cls == null) { cls = obj.getClass(); System.out.println(" Collection class: " + cls.getName()); } System.out.println(" element[" + i + "] = " + obj.toString()); i++; } pstmt.close(); この例の set = (HashSet) rs.getObject(1) 文で、IBM Informix JDBC ドライバ は列 1 のデータ型を取得します。列はセット (SET) 型であるため、HashSet オブ ジェクトがインスタンス化されます。次に、コレクションの各要素が Java オブジェ クトに変換され、コレクションに挿入されます。 次のフェッチの例は、java.util.TreeSet オブジェクトを使用しています。 java.util.TreeSet set; PreparedStatement pstmt; ResultSet rs; /* * Fetch a SET as a TreeSet instead of the default * HashSet. In this example a new java.util.Map object has * been allocated and passed in as a parameter to getObject(). * Connection.getTypeMap() could have been used as well. */ java.util.Map map = new HashMap(); map.put("set", Class.forName("java.util.TreeSet")); System.out.println("mapping ... ok"); pstmt = conn.prepareStatement("select * from tab"); System.out.println("prepare ... ok"); rs = pstmt.executeQuery(); System.out.println("executeQuery ... ok"); rs.next(); set = (TreeSet) rs.getObject(1, map); System.out.println("getObject(Map) ... ok"); /* The user can now use HashSet.iterator() to extract * each element in the collection. */ Iterator it = set.iterator(); Object obj; Class cls = null; int i = 0; while (it.hasNext()) { obj = it.next(); if (cls == null) { 第 4 章 Informix データ型に関する作業 105 cls = obj.getClass(); System.out.println(" Collection class: " + cls.getName()); } System.out.println(" element[" + i + "] = " + obj.toString()); i++; } pstmt.close(); map.put("set", Class.forName( "java.util.TreeSet" )); 文で、デフォルトのマ ッピング set = HashSet が上書きされます。 set = (TreeSet) rs.getObject(1, map) 文で、IBM Informix JDBC ドライバは列 1 のデータ型を取得し、それがセット (SET) 型オブジェクトであると検出します。 次に、ドライバは、型マッピング情報をルックアップし、TreeSet を検出し、 TreeSet オブジェクトをインスタンス化します。次に、コレクションの各要素が Java オブジェクトに変換され、コレクションに挿入されます。 HashSet オブジェクトと TreeSet オブジェクトの使用方法の詳細については、Sun Microsystems のマニュアルでクラス定義を参照してください。 次の例は挿入を示します。この例は、セット (SET) 型列にセット (0、1、2、3、4) を挿入します。 java.util.HashSet set = new HashSet(); Integer intObject; int i; /* Populate the Java collection */ for (i=0; i < 5; i++) { intObject = new Integer(i); set.add(intObject); } System.out.println("populate java.util.HashSet...ok"); PreparedStatement pstmt = conn.prepareStatement ("insert into tab values (?, 20)"); System.out.println("prepare...ok"); pstmt.setObject(1, set); System.out.println("setObject()...ok"); pstmt.executeUpdate(); System.out.println("executeUpdate()...ok"); pstmt.close(); この例の pstmt.setObject(1, set) 文は、まず、コレクションの各要素を直列化し ます。次に、各要素の Java オブジェクトへの変換時に型情報が構成されます。 コ レクションに、最初の要素の型と一致しない型を持つ要素がある場合、例外が呼び 出されます。型情報はデータベース サーバに送信されます。 配列の例 以下は、サンプルのデータベース スキーマです。 CREATE TABLE tab (a set(integer not null), b integer); INSERT INTO tab VALUES ("set{1,2,3}", 10); 次の例は、java.sql.Array オブジェクトを使用してデータを取り出します。 106 IBM Informix JDBC ドライバ プログラマーズ ガイド PreparedStatement pstmt = conn.prepareStatement("select a from tab"); System.out.println("prepare ... ok"); ResultSet rs = pstmt.executeQuery(); System.out.println("executeQuery ... ok"); rs.next(); java.sql.Array array = rs.getArray(1); System.out.println("getArray() ... ok"); pstmt.close(); /* * The user can now materialize the data into either * an array or else a ResultSet. If the collection elements * are primitives then the array should be an array of primitives, * not Objects. Mapping data can be provided at this point. */ Object obj = array.getArray((long) 1, 2); int [] intArray = (int []) obj; // cast it to an array of ints int i; for (i=0; i < intArray.length; i++) { System.out.println("integer element = " + intArray[i]); } pstmt.close(); java.sql.Array array = rs.getArray(1) 文は、java.sql.Array オブジェクトをイン スタンス化します。この時点ではデータは変換されません。 Object obj = array.getArray((long) 1, 2) 文は、データを整数 (Integer オブジ ェクトではなく整数 (INT) 型) の配列に変換します。インデックスとカウント値を 使用して getArray() メソッドが呼び出されたため、データのサブセットのみが戻さ れます。 名前付き行と名前なし行 Sun Microsystem の JDBC 仕様では、構造型 あるいは struct と呼ばれる SQL デ ータ型を参照しています。この型は Informix の名前付き行 に相当します。 この仕 様では、Java クライアントとリレーショナル データベースとの間で構造型データを 交換するための、2 つのアプローチを定義しています。 v SQLData インターフェイスの使用。1 つの名前付き行型あたり 1 つの Java ク ラスが SQLData インターフェイスを実装します。このクラスには名前付き行の 各要素に対するメンバが含まれます。 v Struct インターフェイスの使用。このインターフェイスは、名前付き行の各要素 に対して必要な Java オブジェクトをインスタンス化し、java.util.Object Java オ ブジェクトの配列を構築します。 次のように、IBM Informix JDBC ドライバが取り出された名前付き行に対して Java オブジェクトまたは Struct オブジェクトをインスタンス化するかどうかは、カスタ マイズされた型マッピング エントリが存在するかどうかに依存しています。 v Connection.getTypeMap() マップに名前付き行に対するエントリが存在する場 合、または getObject() メソッドを使用して型マッピングを指定した場合は、単 一の Java オブジェクトがインスタンス化されます。 v Connection.getTypeMap() マップに名前付き行に対するエントリが存在せず、 getObject() メソッドを使用して型マッピングを指定しなかった場合は、Struct オ ブジェクトがインスタンス化されます。 第 4 章 Informix データ型に関する作業 107 名前なし行は、常に Struct オブジェクトに取り出されます。 重要: SQLData インターフェイスと Struct インターフェイスのどちらを使用する かにかかわらず、名前付き行または名前なし行に不透明 (OPAQUE) 型列が含 まれている場合は、それに対する型マッピング エントリが必要です。Struct インターフェイスを使用して不透明 (OPAQUE) 型列を含む行にアクセスして いる場合、行全体ではなく、不透明 (OPAQUE) 型列に対するカスタマイズさ れた型マップが必要です。 カスタム型マッピングの詳細については、付録 C を参照してください。 時間隔とコレクションのサポート java.sql.SQLOutput メソッドと java.sql.SQLInput メソッドは、名前付き行と名前 なし行で Collection オブジェクトと Interval オブジェクトをサポートするように拡 張されています。これらの拡張機能には以下のメソッドが含まれます。 v データが、セット (SET) 型、リスト (LIST) 型、またはマルチセット (MULTISET) 型である場合、 com.informix.jdbc.IfmxComplexSQLInput.readObject() メソッドは適切な java.util.Collection オブジェクトを戻します。 v 時間隔 (INTERVAL) 型の場合、 com.informix.jdbc.IfmxComplexSQLInput.readInterval() メソッドは、修飾子に応 じて適切な IntervalYM または IntervalDF オブジェクトを戻します。 v com.informix.jdbc.IfmxComplexSQLOutput.writeObject() メソッドは、 java.util.Collection インターフェイスから、または IntervalYM オブジェクトと IntervalDF オブジェクトから派生したオブジェクトのみを受け入れます。 サポートされないメソッド 以下の SQLInput メソッドでは、行 (ROW) 型列の、SQLData を実装する Java オ ブジェクトへの選択はサポートされていません。 v readByte() v readCharacterStream() v readRef() 以下の SQLOutput メソッドでは、SQLData を実装する Java オブジェクトの行 (ROW) 型列への挿入はサポートされていません。 v writeByte(byte) v writeCharacterStream(java.io.Reader x) v writeRef(Ref x) SQLData インターフェイスの使用 名前付き行に対する Java クラスは SQLData インターフェイスを実装する必要が あります。 このクラスには名前付き行の各要素に対するメンバが必要ですが、これ らに加えてその他のメンバを持つこともできます。メンバの順序は任意で、パブリ ックである必要はありません。 108 IBM Informix JDBC ドライバ プログラマーズ ガイド この Java クラスは、名前付き行に対して、SQLData インターフェイスで定義され ているとおりに、writeSQL()、readSQL()、および getSQLTypeName() の各メソッ ドを実装する必要があります。ただし、追加のメソッドを実装することもできま す。 ClassGenerator ユーティリティを使用してクラスを作成できます。詳しくは、 116 ページの『ClassGenerator ユーティリティの使用』を参照してください。 この Java クラスを名前付き行とリンクするには、Connection.setTypeMap() メソッ ドまたは getObject() メソッドを使用して、カスタマイズされた型マッピングを作 成します。 型マッピングの詳細については、付録 C を参照してください。 名前なし行へのアクセスには SQLData インターフェイスを使用できません。 SQLData の例 このセクションのすべての例の完全なバージョンは、ドライバをインストールした 場所の demo/complex-types ディレクトリにあります。詳しくは、付録 A を参照し てください。 次の例には java.sql.SQLData インターフェイスを実装する Java クラスが含まれま す。 以下は、サンプルのデータベース スキーマです。 CREATE CREATE CREATE INSERT ROW TYPE fullname_t (first char(20), last char(20)); ROW TYPE person_t (id int, name fullname_t, age int); TABLE teachers (person person_t, dept char (20)); INTO teachers VALUES ("row(100, row(‘Bill’, ’Smith’), 27)", "physics"); fullname Java クラスを次に示します。 import java.sql.*; public class fullname implements SQLData { public String first; public String last; private String sql_type = "fullname_t"; public String getSQLTypeName() { return sql_type; } public void readSQL (SQLInput stream, String type) throws SQLException { sql_type = type; first = stream.readString(); last = stream.readString(); } public void writeSQL (SQLOutput stream) throws SQLException { stream.writeString(first); stream.writeString(last); } /* * Function not required by SQLData interface, but makes * it easier for displaying results. */ public String toString() { String s = "fullname: "; 第 4 章 Informix データ型に関する作業 109 s += "first: " + first + " last: " + last; return s; } } person Java クラスを次に示します。 import java.sql.*; public class person implements SQLData { public int id; public fullname name; public int age; private String sql_type = "person_t"; public String getSQLTypeName() { return sql_type; } public void readSQL (SQLInput stream, String type) throws SQLException { sql_type = type; id = stream.readInt(); name = (fullname)stream.readObject(); age = stream.readInt(); } public void writeSQL (SQLOutput stream) throws SQLException { stream.writeInt(id); stream.writeObject(name); stream.writeInt(age); } public String toString() { String s = "person:"; s += "id: " + id + "¥n"; s += " name: " + name.toString() + "¥n"; s += " age: " + age + "¥n"; return s; } } これは、名前付き行を取り出す例です。 java.util.Map map = conn.getTypeMap(); conn.setTypeMap(map); map.put("fullname_t", Class.forName("fullname")); map.put("person_t", Class.forName("person")); ... PreparedStatement pstmt; ResultSet rs; pstmt = conn.prepareStatement("select person from teachers"); System.out.println("prepare ...ok"); rs = pstmt.executeQuery(); System.out.println("executetQuery()...ok"); while (rs.next()) { person who = (person) rs.getObject(1); System.out.println("getObject()...ok"); System.out.println("Data fetched:"); System.out.println("row: " + who.toString()); } pstmt.close(); 110 IBM Informix JDBC ドライバ プログラマーズ ガイド conn.getTypeMap() メソッドは、Connection オブジェクトを通して、java.util.Map オブジェクトから名前付き行マッピング情報を戻します。 map.put() メソッドは、データベース サーバ fullname_t 上のネストされた名前付 き行と Java クラス fullname との間のマッピング、およびデータベース サーバ person_t 上の名前付き行と Java クラス person との間のマッピングを登録しま す。 person who = (person) rs.getObject(1) 文は、名前付き行を Java オブジェクト who に抽出します。 データベース サーバにより送信された情報が拡張名 person_t を持っているため、IBM Informix JDBC ドライバは、このオブジェクト who が、 名前付き行、ディスティンクト (DISTINCT) 型、または不透明 (OPAQUE) 型であ ると認識します。 ドライバは person_t をルックアップし、それが名前付き行であることを検出しま す。ドライバは、キー person_t を使用して map.get() メソッドを呼び出し、person クラス オブジェクトが戻されます。クラス person のオブジェクトがインスタンス 化されます。 person クラスの readSQL() メソッドは、SQLInput インターフェイスで定義され ているメソッドを呼び出して、行 (ROW) 型列の各フィールドを Java オブジェクト に変換し、それぞれを person クラスのメンバに割り当てます。 次の例は、setObject() メソッドを使用して、名前付き行の列に Java オブジェクト を挿入する方法を示しています。 java.util.Map map = conn.getTypeMap(); map.put("fullname_t", Class.forName("fullname")); map.put("person_t", Class.forName("person")); ... PreparedStatement pstmt; System.out.println("Populate person and fullname objects"); person who = new person(); fullname name = new fullname(); name.last = "Jones"; name.first = "Sarah"; who.id = 567; who.name = name; who.age = 17; String s = "insert into teachers values (?, ’physics’)"; pstmt = conn.prepareStatement (s); System.out.println("prepared...ok"); pstmt.setObject(1, who); System.out.println("setObject()...ok"); int rowcount = pstmt.executeUpdate(); System.out.println("executeUpdate()...ok"); pstmt.close(); conn.getTypeMap() メソッドは、Connection オブジェクトを通して、java.util.Map オブジェクトから名前付き行マッピング情報を戻します。 第 4 章 Informix データ型に関する作業 111 map.put() メソッドは、データベース サーバ fullname_t 上のネストされた名前付 き行と Java クラス fullname との間のマッピング、およびデータベース サーバ person_t 上の名前付き行と Java クラス person との間のマッピングを登録しま す。 IBM Informix JDBC ドライバは、オブジェクト who が SQLData インターフェイ スを実装していること、したがって、名前付き行、ディスティンクト (DISTINCT) 型、または不透明 (OPAQUE) 型のいずれかであることを認識します。IBM Informix JDBC ドライバはこのオブジェクトに対して getSQLTypeName() メソッドを呼び出 し (SQLData インターフェイスを実装するクラスに必要)、person_t が戻されま す。ドライバは person_t をルックアップし、それが名前付き行であることを検出し ます。 person クラスの writeSQL() メソッドは、このクラスの各メンバに対して対応する SQLOutput.writeXXX() メソッドを呼び出し、それぞれが名前付き行 person_t の 1 つのフィールドにマップされます。このクラスの writeSQL() メソッドには、 SQLOutput.writeObject(name) メソッドおよび SQLOutput.writeInt(id) メソッドへ の呼出しが含まれています。クラス person の各メンバは直列化され、ストリーム に書き込まれます。 Struct インターフェイスの使用 JDBC のマニュアルには、Struct オブジェクトを PreparedStatement.setObject() メ ソッドへのパラメータにすることができるとは明記されていません。しかし、IBM Informix JDBC ドライバは、java.sql.Struct インターフェイスを実装する、 PreparedStatement.setObject() メソッドまたは ResultSet.getObject() メソッドによ って渡された任意のオブジェクトを処理できます。 名前なし行にアクセスするには、Struct インターフェイスを使用する必要がありま す。 java.sql.Struct インターフェイスを実装するために、独自のクラスを作成する必要は ありません。ただし、行 (ROW) 型データを挿入または更新する前にフェッチを実 行して、行 (ROW) 型データと型情報を抽出する必要があります。IBM Informix JDBC ドライバは、自動的に getSQLTypeName() メソッドを呼び出します。このメ ソッドは、名前付き行の場合は型名、名前なし行の場合は行定義を戻します。 独自のクラスを作成して Struct インターフェイスを実装する場合、作成するクラス が、getSQLTypeName() メソッドを含む java.sql.Struct のすべてのメソッドを実装 する必要があります。 getSQLTypeName() メソッドが戻す内容は選択できます。 名前なし行の場合は行定義を戻す必要がありますが、名前付き行の場合は行名また は行定義のいずれかを戻すことができます。それぞれに次のような利点がありま す。 v 行定義。 ドライバは、データベース サーバに型情報を問い合わせる必要があり ません。さらに、必要な場合データベース サーバがキャストを行うため、戻され た行定義が名前付き行定義と正確に一致する必要はありません。これは、例え ば、ある行の不透明 (OPAQUE) 型への挿入に文字列を使用する場合に役立ちま す。 112 IBM Informix JDBC ドライバ プログラマーズ ガイド v 行名。 ユーザ定義ルーチンがパラメータとして名前付き行を取る場合、シグニチ ャが一致する必要があるため、名前付き行を渡す必要があります。 ユーザ定義ルーチンの詳細については、次の資料を参照してください。 「J/Foundation 開発者ガイド」(Java 固有の情報について)、「IBM Informix ユー ザ定義ルーチンおよびデータ タイプ開発者ガイド」と「IBM Informix SQL ガイ ド: リファレンス」(いずれもユーザ定義ルーチンに関する一般情報について)、お よび「IBM Informix SQL ガイド: 構文」(ユーザ定義ルーチンの作成と起動の構文 について)。 重要: 名前付き行に対して Struct インターフェイスを使用し、その名前付き行に対 して型マッピング情報を提供すると、Java が SQLData オブジェクトと Struct オブジェクトとの間でキャストできないため、ResultSet.getObject() メ ソッドが呼び出されたときに ClassCastException メッセージが生成されま す。 Struct の例 このセクションのすべての例の完全なバージョンは、ドライバをインストールした 場所の demo/complex-types ディレクトリにあります。詳しくは、付録 A を参照し てください。 この例は、名前なし行 (ROW) 型列を取り出します。以下は、サンプルのデータベ ース スキーマです。 CREATE TABLE teachers ( person row( id int, name row(first char(20), last char(20)), age int ), dept char(20) ); INSERT INTO teachers VALUES ("row(100, row(’Bill’, ’Smith’), 27)", "physics"); 例の残りの部分を次に示します。 PreparedStatement pstmt; ResultSet rs; pstmt = conn.prepareStatement("select person from teachers"); System.out.println("prepare ...ok"); rs = pstmt.executeQuery(); System.out.println("executetQuery()...ok"); rs.next(); Struct person = (Struct) rs.getObject(1); System.out.println("getObject()...ok"); System.out.println("¥nData fetched:"); Integer id; Struct name; Integer age; Object[] elements; /* Get the row description */ String personRowType = person.getSQLTypeName(); System.out.println("person row description: " + personRowType); System.out.println(""); /* Convert each element into a Java object */ elements = person.getAttributes(); 第 4 章 Informix データ型に関する作業 113 /* * Run through the array of objects in ’person’ getting out each structure * field. Use the class Integer instead of int, because int is not an object. */ id = (Integer) elements[0]; name = (Struct) elements[1]; age = (Integer) elements[2]; System.out.println("person.id: " + id); System.out.println("person.age: " + age); System.out.println(""); /* Convert ’name’ as well. */ /* get the row definition for ’name’ */ String nameRowType = name.getSQLTypeName(); System.out.println("name row description: " + nameRowType); /* Convert each element into a Java object */ elements = name.getAttributes(); /* * run through the array of objects in ’name’ getting out each structure * field. */ String first = (String) elements[0]; String last = (String) elements[1]; System.out.println("name.first: " + first); System.out.println("name.last: " + last); pstmt.close(); 列 1 が行 (ROW) 型で、拡張データ型名がない場合は (名前付き行の場合)、Struct person = (Struct) rs.getObject(1) 文は Struct オブジェクトをインスタンス化し ます。 elements = person.getAttributes(); 文は、以下の操作を実行します。 v java.lang.Object オブジェクトの配列を、正しい要素数で割り当てる v 行内の各要素を Java オブジェクトに変換する 要素が不透明 (OPAQUE) 型である場合は、Connection オブジェクトに型マッピ ングを指定するか、または getAttributes() メソッドへの呼出しで、java.util.Map オブジェクトを渡す必要があります。 String personrowType = person.getSQLTypeName(); 文は行型情報を戻します。名 前付き行型の場合、この文はその名前を戻します。データ型が名前付き行でないた め、この文は次の行定義を戻します。row(int id, row(first char(20), last char(20)) name, int age) 例では、次に、名前なし行 person に対して行ったのと同じ手順を、名前なし行 name に対して行います。 次の例は、java.sql.Struct インターフェイスを実装するユーザ作成クラス GenericStruct を使用します。別の方法として、GenericStruct クラスの代わりに、 ResultSet.getObject() メソッドから戻される Struct オブジェクトを使用することも できます。 import java.sql.*; import java.util.*; public class GenericStruct implements java.sql.Struct { private Object [] attributes = null; private String typeName = null; 114 IBM Informix JDBC ドライバ プログラマーズ ガイド /* * Constructor */ GenericStruct() { } GenericStruct(String name, Object [] obj) { typeName = name; attributes = obj; } public String getSQLTypeName() { return typeName; } public Object [] getAttributes() { return attributes; } public Object [] getAttributes(Map map) throws SQLException { // this class shouldn’t be used if there are elements // that need customized type mapping. return attributes; } public void setAttributes(Object [] objArray) { attributes = objArray; } public void setSQLTypeName(String name) { typeName = name; } } 次の Java プログラムは、行 (ROW) 型列を挿入します。 PreparedStatement pstmt; ResultSet rs; GenericStruct gs; String rowType; pstmt = conn.prepareStatement("insert into teachers values (?, ’Math’)"); System.out.println("prepare insert...ok¥n"); System.out.println("Populate name struct..."); Object[] name = new Object[2]; // populate inner row first name[0] = new String("Jane"); name[1] = new String("Smith"); rowType = "row(first char(20), last char(20))"; gs = new GenericStruct(rowType, name); System.out.println("Instantiate GenericStructObject...okay¥n"); System.out.println("Populate person struct..."); // populate outer row next Object[] person = new Object[3]; person[0] = new Integer(99); person[1] = gs; person[2] = new Integer(56); rowType = "row(id int, " + "name row(first char(20), last char(20)), " + "age int)"; gs = new GenericStruct(rowType, person); System.out.println("Instantiate GenericStructObject...okay¥n"); 第 4 章 Informix データ型に関する作業 115 pstmt.setObject(1, gs); System.out.println("setObject()...okay"); pstmt.executeUpdate(); System.out.println("executeUpdate()...okay"); pstmt.close(); この例の pstmt.setObject(1, gs) 文で、IBM Informix JDBC ドライバは情報を行 (ROW) 型列としてクライアントからデータベース サーバにトランスポートするこ とを判別します。これは、GenericStruct オブジェクトが java.sql.Struct インターフ ェイスのインスタンスであるためです。 配列の各要素が直列化され、各要素が getSQLTypeName() メソッドで定義されたデ ータ型に一致することが確認されます。 ClassGenerator ユーティリティの使用 ClassGenerator ユーティリティは、システム カタログで定義されている名前付き行 型に対する Java クラスを生成します。 このユーティリティは、Sun の JDBC 仕様 に対する Informix の拡張機能です。 作成された Java クラスは java.sql.SQLData インターフェイスを実装します。この クラスには、名前付き行の各フィールドに対するメンバが含まれます。readSQL()、 writeSQL()、および SQLData.readSQL() の各メソッドは、データベースの名前付 き行型の定義にあるとおりの順番で、属性を読み込みます。同様に、writeSQL() は その順序でデータをストリームに書き込みます。 ClassGenerator は ifxtools.jar ファイルにパッケージされているため、 CLASSPATH 環境変数が ifxtools.jar を指している必要があります。 ClassGenerator を使用する構文は、次のとおりです。 java ClassGenerator rowtypename [-u URL] [-c classname] classname のデフォルト値は、rowtypename の値です。 URL パラメータが指定されない場合、必要な情報はホーム ディレクトリの setup.std ファイルから抽出されます。 setup.std の構造は、次のとおりです。 URL jdbc:host-name:port-number informixserver informixservername database database user user passwd password 単純な名前付き行の例 ClassGenerator を使用するには、まず、次の例に示すようにデータベース サーバに 名前付き行を作成します。 create row type employee (name char (20), age int); 次に、ClassGenerator を実行します。 java ClassGenerator employee クラス ジェネレータは、次に示すような employee.java ファイルを生成し、以下に 示すような内容の setup.std からデータベース URL 情報を抽出します。 116 IBM Informix JDBC ドライバ プログラマーズ ガイド URL jdbc:davinci:1528 database test user scott passwd tiger informixserver picasso_ius 生成される .java ファイルを次に示します。 import java.sql.*; import java.math.*; public class employee implements SQLData { public String name; public int age; private String sql_type; public String getSQLTypeName() { return "employee"; } public void readSQL (SQLInput stream, String type) throws SQLException { sql_type = type; name = stream.readString(); age = stream.readInt(); } public void writeSQL (SQLOutput stream) throws SQLException { stream.writeString(name); stream.writeInt(age); } } ネストされた名前付き行の例 ネストされた行に対して ClassGenerator を使用するには、まずデータベース サー バに名前付き行を作成します。 create row type manager (emp employee, salary int); 次に、ClassGenerator を実行します。この場合は、ユーザがコマンド行で必要な情 報をすべて指定するため、setup.std ファイルは参照されません。 java ClassGenerator manager -c Manager -u "jdbc:davinci:1528/test:user=scott; password=tiger;informixserver=picasso_ius" -c オプションは、作成している Java クラス Manager (大文字の M を使用) を定 義します。 前のコマンドは次の Java クラスを生成します。 import java.sql.*; import java.math.*; public class Manager implements SQLData { public employee emp; public int salary; private String sql_type; public String getSQLTypeName() { return "manager"; } public void readSQL (SQLInput stream, String type) throws SQLException { sql_type = type; emp = (employee)stream.readObject(); 第 4 章 Informix データ型に関する作業 117 salary = stream.readInt(); } public void writeSQL (SQLOutput stream) throws SQLException { stream.writeObject(emp); stream.writeInt(salary); } } 型情報のキャッシュ あるデータ型のオブジェクトが別のデータ型の列にデータを挿入すると、IBM Informix JDBC ドライバは、SQLData.getSQLTypeName() メソッドを呼び出すこと により、与えられたデータがデータベース サーバが予期するデータに一致すること を確認します。ドライバは、各挿入ごとにデータベース サーバに型情報を問い合わ せます。 これは、以下のような場合に発生します。 v SQLData オブジェクトが不透明 (OPAQUE) 型列にデータを挿入し、 getSQLTypeName() が不透明 (OPAQUE) 型の名前を戻すとき。 v Struct または SQLData オブジェクトが行 (ROW) 型列にデータを挿入し、 getSQLTypeName() が名前付き行の名前を戻すとき。 v SQLData オブジェクトがディスティンクト (DISTINCT) 型列にデータを挿入す るとき。 データベース URL で環境変数 ENABLE_CACHE_TYPE=1 を設定して、型情報が初めて 抽出されたときにドライバがその型情報をキャッシュするように指定できます。そ の後、データベース サーバにデータを要求する前に、ドライバはキャッシュに型情 報を問い合わせます。 スマート ラージ オブジェクト データ型 スマート ラージ オブジェクト は、以下の機能を持つラージ オブジェクトです。 v スマート ラージ オブジェクトは、非常に大量のデータを保持できます。 現在は、単一のスマート ラージ オブジェクトで最大 4 テラバイトのデータを保 持できます。このデータは、SB 領域 と呼ばれる分離されたディスク領域に格納 されます。 v スマート ラージ オブジェクトはリカバリ可能です。 データベース サーバは、スマート ラージ オブジェクトに対する変更内容をログ に記録できるため、システムまたはハードウェアに障害が発生した場合にスマー ト ラージ オブジェクト データを復旧できます。スマート ラージ オブジェクト のロギングは、デフォルトの動作ではありません。 v スマート ラージ オブジェクトは、そのデータへのランダム アクセスをサポート しています。 シンプル ラージ オブジェクト (バイト (BYTE) 型またはテキスト (TEXT) 型) へのアクセスは、「全か無か」で行われます。つまり、データベース サーバはユ ーザが要求するシンプル ラージ オブジェクトのデータすべてを同時に戻しま 118 IBM Informix JDBC ドライバ プログラマーズ ガイド す。スマート ラージ オブジェクトでは、希望する位置へシークし、希望するバ イト数を読み込む、または書き込むことができます。 v スマート ラージ オブジェクトの格納特性をカスタマイズできます。 スマート ラージ オブジェクト作成時に、スマート ラージ オブジェクトの以下 のような格納特性を指定できます。 – データベース サーバが現行のデータベース ログ モードに基づいてスマート ラージ オブジェクトをログに記録するかどうか – スマート ラージ オブジェクトが最後にアクセスされた時間をデータベース サーバが追跡するかどうか – データベース サーバがデータ破壊を検出するためにページ ヘッダを使用する かどうか スマート ラージ オブジェクトは、データベースに BLOB 型および CLOB 型とし て格納され、次の 2 つの方法でアクセスできます。 v IBM Informix JDBC ドライバ 3.0 以降、およびスマート ラージ オブジェクト データ型をサポートする IDS サーバでは、Sun Microsystems の JDBC 3.0 仕様 に記述されている標準 JDBC API メソッドを使用できます。 これが最も簡単な アプローチです。 BLOB 型と CLOB 型の内部更新用の以下の JDBC 3.0 メソッドは、すでに前の リリースで実装されています。 int setBytes(long, byte[]) throws SQLException void truncate(long) throws SQLException 以下の BLOB インターフェイスの JDBC 3.0 メソッドは、IBM InformixJDBC ドライバ バージョン 3.0 以降で実装されています。 OutputStream setBinaryStream(long) throws SQLException int setBytes(long, byte[], int, int) throws SQLException 以下の CLOB インターフェイスの JDBC 3.0 メソッドは、IBM InformixJDBC ドライバ バージョン 3.0 以降で実装されています。 OutputStream setAsciiStream(long) throws SQLException Writer setCharacterStream(long) throws SQLException int setString(long, String) throws SQLException int setString(long, String, int, int) throws SQLException v Informix Dynamic Server でのスマート ラージ オブジェクト サポートに基づく Informix 拡張セットを使用できます。これらについてはこのセクションで説明し ます。 このアプローチにはより多くのオプションがあります。 このセクションには、以下のサブセクションが含まれています。 v データベース サーバ内のスマート ラージ オブジェクト v クライアント アプリケーション内のスマート ラージ オブジェクト v スマート ラージ オブジェクトの作成手順 v スマート ラージ オブジェクトへのアクセス手順 v スマート ラージ オブジェクトに対する操作の実行 第 4 章 Informix データ型に関する作業 119 v 格納特性に関する作業 v 状態特性に関する作業 v ロックに関する作業 v ラージ オブジェクトのキャッシュ v スマート ラージ オブジェクトの例 データベース サーバ内のスマート ラージ オブジェクト Informix データベース サーバでは、スマート ラージ オブジェクトには 2 つの部 分があります。 v データ。SB 領域 に格納されます。 v ラージ オブジェクト ハンドル。LO ハンドル と呼ばれ、SB 領域内でのスマー ト ラージ オブジェクト データの格納場所を識別します。 従業員のピクチャをスマート ラージ オブジェクトとして格納するとします。図 3 は、SB 領域 sbspace1_100 にある実際の従業員のピクチャの位置に関する情報を、 LO ハンドルが保持している様子を示しています。 図 3. データベース サーバ内のスマート ラージ オブジェクト 図 3 では、SB 領域が、LO ハンドルが識別する実際の従業員の画像を保持してい ます。 SB 領域の構造、および SB 領域の作成と削除を行う onspaces データベー ス ユーティリティの詳細については、「IBM Informix Dynamic Server 管理者ガイ ド」を参照してください。 重要: スマート ラージ オブジェクトは SB 領域にのみ格納できます。スマート ラ ージ オブジェクトをデータベースに挿入する前に、SB 領域を作成する必要 があります。 スマート ラージ オブジェクトは非常に大きくなる可能性があるため、データベー ス サーバはその LO ハンドルのみをデータベースの表に格納します。データベー ス サーバは、その後、このハンドルを使用して SB 領域にあるスマート ラージ オ ブジェクトの実データを見つけることができます。この配置により表のサイズが最 小化されます。 アプリケーションは、データベースから LO ハンドルを取得し、それを使用してス マート ラージ オブジェクト データを見つけ、読込みおよび書込み操作のためにス マート ラージ オブジェクトをオープンします。 120 IBM Informix JDBC ドライバ プログラマーズ ガイド クライアント アプリケーション内のスマート ラージ オブジェク ト クライアント上で、JDBC アプリケーションは、以下のように ResultSet メソッド を使用してスマート ラージ オブジェクト データにアクセスできます。 v CLOB データに対して、getClob() および getAsciiStream() v BLOB データに対して、getBlob() および getBinaryStream() v CLOB データと BLOB データの両方に対して、getString() クライアント サイドでは、JDBC ドライバは IfxLocator オブジェクトを通して LO ハンドルを参照します。 JDBC アプリケーションは、図 4 に示すように、スマ ート ラージ オブジェクトのロケータ ハンドルを含める IfxLocator クラスのイン スタンスを取得します。アプリケーションは、スマート ラージ オブジェクトを独 立して作成し、そのスマート ラージ オブジェクトを別の列 (場合によっては複数 の表) に挿入します。複数のスレッドを使用すると、アプリケーションはスマート ラージ オブジェクトのさまざまな部分に対するデータの書込みまたは読込みを並行 して行うことができ、非常に効率的です。 図 4. クライアント アプリケーションでのスマート ラージ オブジェクトの位置決め IDS では、データベース サーバの 9.x 以降のバージョンのみで、Informix スマー ト ラージ オブジェクト データ型がサポートされています。 スマート ラージ オブジェクトの作成手順 Informix のスマート ラージ オブジェクト インプリメンテーションは、以下のクラ スに基づいています。 v IfxLobDescriptor は、ラージ オブジェクトの属性を格納します。 v IfxLocator は、データベース サーバのラージ オブジェクトへのハンドルを含み ます。 v IfxSmartBlob には、オブジェクト内での位置決め、オブジェクトからのデータの 読込み、オブジェクトへのデータの書込みなど、スマート ラージ オブジェクト を操作するためのメソッドが含まれます。 v IfxBblob および IfxCblob は、Sun Microsystems JDBC 3.0 仕様の java.sql.Blob および java.sql.Clob インターフェイスを実装しています。 v IfxLoStat は、ラージ オブジェクトの状態に関する情報を格納します。 ヒント: このセクションでは Informix のスマート ラージ オブジェクト インター フェイスを使用する方法について説明しますが、現在はインターフェイス 第 4 章 Informix データ型に関する作業 121 のすべてのメソッドとパラメータについて記載しているわけではありませ ん。インターフェイスのすべてのメソッドとそのパラメータに関する包括 的な参考資料については、IBM Informix JDBC ドライバの javadoc ファイ ルを参照してください。これらのファイルは、ドライバをインストールし た場所の doc/javadoc ディレクトリにあります。 スマート ラージ オブジェクトを作成するには: 1. 新規スマート ラージ オブジェクトの場合、そのスマート ラージ オブジェク トに対して、そのデータ用の SB 領域が指定されていることを確認してくださ い。 SB 領域を作成する onspaces ユーティリティの詳細については、「IBM Informix Dynamic Server 管理者ガイド」を参照してください。 SB 領域の作成 例については、135 ページの『SB 領域特性の設定例』を参照してください。 2. IfxLobDescriptor オブジェクトを作成します。 これにより、スマート ラージ オブジェクトに対する格納特性を設定できるよ うになります。ドライバは、IfxSmartBlob.IfxLoCreate() メソッドによるラージ オブジェクトの作成時に、データベース サーバに IfxLobDescriptor オブジェ クトを渡します。 3. 必要な場合、IfxLobDescriptor オブジェクトのメソッドを呼び出して格納特性 を指定します。 ほとんどのスマート ラージ オブジェクトの場合、指定する必要がある格納特 性は SB 領域名のみです。データベース サーバは、他のすべての格納特性の値 を計算することができます。特定の格納特性を設定して、これらの計算された 値を上書きできます。ただし、ほとんどのアプリケーションでは、このように 詳細なレベルで格納特性を設定する必要はありません。詳しくは、133 ページ の『格納特性に関する作業』を参照してください。 4. IfxLocator オブジェクトを作成します。 これは、クライアント上のスマート ラージ オブジェクトへのポインタです。 5. IfxSmartBlob オブジェクトを作成します。 これにより、スマート ラージ オブジェクトに対してさまざまな共通操作を実 行できるようになります。 6. IfxSmartBlob.IfxLoCreate() メソッドを実行して、データベース サーバにラー ジ オブジェクトを作成します。 データベース サーバ内のスマート ラージ オブジェクトを識別するため、 IfxLoCreate() は、パラメータとして IfxLocator オブジェクトと IfxLobDescriptor オブジェクトを取ります。 7. IfxSmartBlob.IfxLoWrite() を実行して、データベース サーバのスマート ラー ジ オブジェクトにデータを書き込みます。 8. さらに IfxSmartBlob のメソッドを実行して、オブジェクト内での位置決め、 オブジェクトからの読込みなどを行います。 9. IfxSmartBlob.IfxLoClose() を実行して、ラージ オブジェクトをクローズしま す。 122 IBM Informix JDBC ドライバ プログラマーズ ガイド 10. スマート ラージ オブジェクトをデータベースに挿入します (126 ページの 『スマート ラージ オブジェクトの列への挿入』を参照)。 11. IfxSmartBlob.IfxLoRelease() を実行して、ロケータ ポインタを解放します。 IfxLobDescriptor オブジェクトの作成: IfxLobDescriptor クラスは、スマート ラ ージ オブジェクトの内部格納特性を格納します。データベース サーバにスマート ラージ オブジェクトを作成する前に、次のように IfxLobDescriptor オブジェクト を作成する必要があります。 IfxLobDescriptor loDesc = new IfxLobDescriptor(conn); conn パラメータは java.sql.Connection オブジェクトです。IfxLobDescriptor() コン ストラクタが、そのオブジェクトのすべてのデフォルト値を設定します。 内部格納特性の詳細については、133 ページの『格納特性に関する作業』を参照し てください。 IfxLocator オブジェクトの作成: IfxLocator オブジェクト (通常、ロケータ ポイ ンタ またはラージ オブジェクト ロケータ と呼ばれる) は、121 ページの図 4 に 示すように、スマート ラージ オブジェクトの位置を識別します。ロケータ ポイン タは、特定のラージ オブジェクトのためのデータベース サーバとクライアントと の間の通信リンクです。ラージ オブジェクトを作成する前、または、読込みまたは 書込みのためにラージ オブジェクトをオープンする前に、アプリケーションは IfxLocator オブジェクトを作成する必要があります。 IfxLocator loPtr = new IfxLocator(); IfxLocator loPtr = new IfxLocator(Connection conn); 例外が呼び出された場合にローカライズされたエラー メッセージを表示するには、 2 番目のコンストラクタを使用します。詳しくは、205 ページの『ローカライズさ れたエラー メッセージのサポート』を参照してください。 IfxSmartBlob オブジェクトの作成: スマート ラージ オブジェクトを作成して、そ のオブジェクトに対する操作を実行するためのメソッドへのアクセスを取得するに は、次のように JDBC 接続への参照を渡して IfxSmartBlob コンストラクタを呼び 出します。 IfxSmartBlob smb = new IfxSmartBlob(myConn) スマート ラージ オブジェクトで必要な操作を実行するメソッドをすべて記述した ら、IfxSmartBlob.IfxLoCreate() メソッドを使用してデータベース サーバにラージ オブジェクトを作成し、アプリケーション内でオープンしてアクセスできます。メ ソッド シグニチャは次のとおりです。 public int IfxLoCreate(IfxLobDescriptor loDesc, int flag, IfxLocator loPtr) throws SQLException public int IfxLoCreate(IfxLobDescriptor loDesc, int flag, IfxBblob blob)throws SQLException public int IfxLoCreate(IfxLobDescriptor loDesc, int flag, IfxCblob clob throws SQLException 戻り値はロケータ ハンドルで、後続の読込み、書込み、シーク、およびクローズの 各メソッドで使用できます (ロケータ ファイル記述子 (lofd) パラメータとして、オ ープンされているスマート ラージ オブジェクトを操作するメソッドに渡すことが 第 4 章 Informix データ型に関する作業 123 できます。これらのメソッドは、128 ページの『スマート ラージ オブジェクト内 での位置決め』以降で説明されています)。 flag パラメータは、新規スマート ラージ オブジェクトがサーバでオープンされる アクセス モードを指定する整数値です。アクセス モードは、オープンされている スマート ラージ オブジェクトに対して有効な読込みおよび書込み操作を決定しま す。値を指定しない場合、オブジェクトは読取り専用モードでオープンされます。 スマート ラージ オブジェクトを特定のアクセス モードでオープンまたは作成する には、IfxLoCreate() メソッドおよび IfxLoOpen() メソッドで次の表にあるアクセ ス モード フラグ 値を使用します。 アクセス モード 目的 IfxSmartBlob の フラグ値 読取り専用 読取り操作のみを許可します。 LO_RDONLY 書込み専用 書込み操作のみを許可します。 LO_WRONLY 書込み/追加 書き込むデータをスマート ラージ オブジェクトの LO_APPEND 最後に追加します。単独で、書込み専用モードにス マート ラージ オブジェクトの最後までのシークを 付加した場合と同じ意味を持ちます。読取り操作は 失敗します。スマート ラージ オブジェクトを書込 み/追加モードのみでオープンすると、スマート ラ ージ オブジェクトは書込み専用モードでオープンさ れます。シーク操作はシーク位置を移動しますが、 スマート ラージ オブジェクトに対する読取り操作 は失敗し、シーク位置は書込みの直前の位置から変 更されないままになります。書込み操作はそのシー ク位置で実行され、その後シーク位置が移動されま す。 読取り/書込み 読取り操作と書込み操作を許可します。 LO_RDWR 次の例は、LO_RDWR フラグ 値の使用方法を示しています。 IfxSmartBlob smb = new IfxSmartBlob(myConn); int loFd = smb.IfxLoCreate(loDesc, smb.LO_RDWR, loPtr); loDesc オブジェクトと loPtr オブジェクトは、それぞれ前に作成された IfxLobDescriptor オブジェクトと IfxLocator オブジェクトです。 データベース サーバは、スマート ラージ オブジェクトをオープンするときに以下 のシステム デフォルトを使用します。 オープン モード情報 デフォルトのオープン モード アクセス モード 読取り専用 アクセス方法 ランダム バッファリング バッファ付きアクセス ロック 全オブジェクト ロック ロックの詳細については、143 ページの『ロックに関する作業』を参照してくださ い。 124 IBM Informix JDBC ドライバ プログラマーズ ガイド 次の表に、すべてのオープン モード フラグを示します。 オープン モード フラグ 説明 LO_APPEND 書き込むデータをスマート ラージ オブジェクトの 最後に追加します。 単独で、書込み専用モードにスマート ラージ オブ ジェクトの最後までのシークを付加した場合と同じ 意味を持ちます。読取り操作は失敗します。 スマート ラージ オブジェクトを書込み/追加モード のみでオープンすると、スマート ラージ オブジェ クトは書込み専用モードでオープンされます。シー ク操作はシーク位置を移動しますが、スマート ラ ージ オブジェクトに対する読取り操作は失敗し、 シーク位置は書込みの直前の位置から変更されない ままになります。書込み操作はそのシーク位置で実 行され、その後シーク位置が移動されます。 LO_WRONLY 書込み操作のみを許可します。 LO_RDONLY 読取り操作のみを許可します。 LO_RDWR 読取り操作と書込み操作を許可します。 LO_DIRTY_READ オープンのみを対象とします。 スマート ラージ オブジェクトのコミットされてい ないデータ ページを読み込むことができます。 モードを LO_DIRTY_READ に設定した後は、スマ ート ラージ オブジェクトに書き込むことができま せん。このフラグを設定すると、スマート ラージ オブジェクトに対する現行のトランザクション排他 モードが単純読込みにリセットされます。 単純読込みモードでスマート ラージ オブジェクト から取得したデータに基づいて更新を行わないでく ださい。 LO_RANDOM オプティマイザによる決定を上書きします。 入出力がランダムで、データベース サーバが先読 みしないことを示します。デフォルトのオープン モードです。 LO_SEQUENTIAL オプティマイザによる決定を上書きします。 正方向または逆方向いずれかの順次読込みであるこ とを示します。 LO_FORWARD 順次アクセスに対してのみ使用され、正方向である ことを示します。 LO_REVERSE 順次アクセスに対してのみ使用され、逆方向である ことを示します。 LO_BUFFER 標準のデータベース サーバ バッファ プールを使 用します。 第 4 章 Informix データ型に関する作業 125 LO_NOBUFFER 標準のデータベース サーバ バッファ プールを使 用しません。データベース サーバのセッション プ ールのプライベート バッファを使用します。 LO_NODIRTY_READ スマート ラージ オブジェクトの単純読込みを許可 しません。詳しくは、LO_DIRTY_READ フラグを 参照してください。 LO_LOCKALL スマート ラージ オブジェクト全体に対してロック が発生することを指定します。 LO_LOCKRANGE ロックがバイト範囲に対して発生することを示しま す。 ロックの設定時に IfxSmartBlob.IfxLoLock() メソッ ドを使用してバイト範囲を指定します。 スマート ラージ オブジェクトの列への挿入: スマート ラージ オブジェクトの作 成後、BLOB 列または CLOB 列に挿入してデータベースに保存する必要がありま す。これを行うには、IfxLocator オブジェクトを、列型に応じて IfxBblob または IfxCblob オブジェクトに変換する必要があります。 スマート ラージ オブジェクトを BLOB 列または CLOB 列に挿入するには: 1. IfxBblob または IfxCblob オブジェクトを、次のように作成します。 IfxBblob blb = new IfxBblob(loPtr); loPtr パラメータは、前の手順のいずれかで取得した IfxLocator オブジェクトで す。 2. PreparedStatement.setBlob() または setClob() メソッドを使用して、オブジェク トを列に挿入します。 重要: 挿入を実行する前に、スマート ラージ オブジェクト用の SB 領域がデータ ベース サーバに存在する必要があります。 スマート ラージ オブジェクトへのアクセス手順 Informix 拡張セットを使用してデータベース列からスマート ラージ オブジェクト を選択するには、以下の手順に従います。 スマート ラージ オブジェクトにアクセスするには: 1. java.sql.Blob または java.sql.Clob オブジェクトを、IfxBblob または IfxCblob オブジェクトにキャストします。 2. IfxBblob.getLocator() メソッドまたは IfxCblob.getLocator() メソッドを使用し て、IfxLocator オブジェクトを抽出します。 3. IfxSmartBlob オブジェクトを作成します。 4. IfxSmartBlob.IfxLoOpen() メソッドを使用してスマート ラージ オブジェクトを オープンします。 5. IfxSmartBlob.IfxLoRead() メソッドを使用してスマート ラージ オブジェクトか らデータを読み取ります。 6. IfxSmartBlob.IfxLoClose() メソッドを使用してスマート ラージ オブジェクトを クローズします。 126 IBM Informix JDBC ドライバ プログラマーズ ガイド 7. IfxSmartBlob.IfxLoRelease() メソッドを呼び出して、サーバ内のロケータ ポイ ンタを解放します。 ResultSet.getBinaryStream()、getAsciiStream()、getString()、getBytes()、getBlob()、 および getClob() などの標準 JDBC ResultSet メソッドは、BLOB データまたは CLOB データを表から取り出すことができます。その後、Informix 拡張クラスでそ のデータにアクセスできます。 スマート ラージ オブジェクトに対する操作の実行 データベース サーバで、スマート ラージ オブジェクトを以下のいずれかのデータ 型の列に直接格納できます。 v CLOB 型はテキスト データを保持します。 v BLOB 型は、差異のないバイト ストリームの任意の種類のバイナリ データを格 納できます。 CLOB 列または BLOB 列は、スマート ラージ オブジェクトに対する LO ハンド ルを保持します。したがって、CLOB 列または BLOB 列を選択すると、スマート ラージ オブジェクトの実データを取得するのではなく、このデータを識別する LO ハンドルを取得することになります。スマート ラージ オブジェクトの列の理論上 の制限は 4 テラバイトであり、実際的な制限はディスク容量によって決定されま す。 以下のいずれかの方法を使用して列にスマート ラージ オブジェクトを格納できま す。 v スマート ラージ オブジェクトに直接アクセスする場合は、CLOB 型または BLOB 型の列を作成します。 v スマート ラージ オブジェクトを最小のデータ型の中に隠す場合は、スマート ラ ージ オブジェクトを保持する不透明 (OPAQUE) 型を作成します。 クライアント アプリケーションでは、IfxBblob クラスと IfxCblob クラスが、Sun Microsystem JDBC 3.0 仕様に記述されているスマート ラージ オブジェクト デー タの処理方法と、Informix 拡張セットとの間の橋渡しをします。 IfxBblob クラスは java.sql.Blob インターフェイスを、IfxCblob クラスは java.sql.Clob インターフェイ スを実装しています。 Informix 拡張セットは、データベース サーバ内のスマート ラージ オブジェクトを識別するために IfxLocator オブジェクトを必要とします。 BLOB 型列または CLOB 型列を含む表に問合せを行うと、列のデータ型に応じて BLOB 型または CLOB 型のオブジェクトが戻されます。その後、BLOB 型または CLOB 型のオブジェクトに対する JDBC 3.0 対応メソッドを使用して、スマート ラージ オブジェクトにアクセスできます。 コンストラクタは、IfxLocator オブジェクト loPtr から、IfxBblob または IfxCblob オブジェクトを作成します。 public IfxBblob(IfxLocator loPtr) public IfxCblob(IfxLocator loPtr) 次のロケータ メソッドは、IfxBblob または IfxCblob オブジェクトから、 IfxLocator オブジェクトを戻します。その後、IfxSmartBlob.IfxLoOpen()、 第 4 章 Informix データ型に関する作業 127 IfxLoRead()、および IfxLoWrite() の各メソッドを使用して、スマート ラージ オ ブジェクトのオープン、読込み、および書込みを行うことができます。 public IfxLocator getLocator() throws SQLException スマート ラージ オブジェクトのオープン IfxSmartBlob クラスの以下のメソッドは、データベース サーバの既存のスマート ラージ オブジェクトをオープンします。 public int IfxLoOpen(IfxLocator loPtr, int flag) throws SQLException public int IfxLoOpen(IfxBblob blob, int flag) throws SQLException public int IfxLoOpen(IfxCblob clob, int flag) throws SQLException 最初のバージョンは、ロケータ ポインタ loPtr で参照されるスマート ラージ オブ ジェクトをオープンします。2 番目と 3 番目のバージョンは、指定された IfxBblob オブジェクトおよび IfxCblob オブジェクトにより参照されるスマート ラージ オ ブジェクトをそれぞれオープンします。flag パラメータは、123 ページの 『IfxSmartBlob オブジェクトの作成』の表にある値です。 スマート ラージ オブジェクト内での位置決め IfxSmartBlob クラスの IfxLoTell() メソッドは、現在のシーク位置を戻します。こ の位置は、スマート ラージ オブジェクトに対する次の読込みまたは書込み操作に 対するオフセットです。IfxSmartBlob クラスの IfxLoSeek() メソッドは、すでにオ ープンされているラージ オブジェクト内の読込み位置または書込み位置を設定しま す。 public long IfxLoTell(int lofd) public long IfxLoSeek(int lofd, long offset, int whence) throws SQLException 絶対位置は、2 番目のパラメータ offset の値、および 3 番目のパラメータ whence の値に依存します。 lofd パラメータは、IfxLoCreate() メソッドまたは IfxLoOpen() メソッドから戻さ れたロケータ ファイル記述子です。 offset パラメータは、開始シーク位置からのオ フセットです。 whence パラメータは、開始シーク位置を示します。次の表の whence 値を使用し て、シーク操作を開始するスマート ラージ オブジェクト内の位置を定義します。 開始シーク位置 Whence 値 スマート ラージ オブジェクト の先頭 IfxSmartBlob.LO_SEEK_SET スマート ラージ オブジェクト 内の現在位置 IfxSmartBlob.LO_SEEK_CUR スマート ラージ オブジェクト の終わり IfxSmartBlob.LO_SEEK_END 戻り値は、スマート ラージ オブジェクト内での絶対位置を表す長整数です。 次の例は、LO_SEEK_SET whence 値の使用方法を示しています。 128 IBM Informix JDBC ドライバ プログラマーズ ガイド IfxLobDescriptor loDesc = new IfxLobDescriptor(myConn); IfxLocator loPtr = new IfxLocator(); IfxSmartBlob smb = new IfxSmartBlob(myConn); int loFd = smb.IfxLoCreate(loDesc, smb.LO_RDWR, loPtr); int n = smb.IfxLoWrite(loFd, fin, fileLength); smb.IfxLoClose(loFd); loFd = smb.IfxLoOpen(loPtr, smb.LO_RDWR); long m = smb.IfxLoSeek(loFd, 200, smb.LO_SEEK_SET); 書込み位置は、スマート ラージ オブジェクトの先頭から 200 バイトのオフセット に設定されます。 スマート ラージ オブジェクトからの読込み 次のような方法で、スマート ラージ オブジェクトからデータを読み込むことがで きます。 v データをオブジェクトから byte[ ] バッファに読み込む。 v データをオブジェクトからファイル出力ストリームに読み込む。 v データをオブジェクトからファイルに読み込む。 スマート ラージ オブジェクトからバッファまたはファイル出力ストリームに読み 込むには、IfxSmartBlob クラスの IfxLoRead() メソッドを使用します。このメソッ ドのシグニチャは次のとおりです。 public byte[] IfxLoRead(int lofd, int nbytes) throws SQLException public int IfxLoRead(int lofd, byte[] buffer, int nbytes) throws SQLException public int IfxLoRead(int lofd, FileOutputStream fout, int nbytes throws SQLException public int IfxLoRead(int lofd, byte[] buffer, int nbytes, int offset throws SQLException lofd パラメータは、IfxLoCreate() メソッドまたは IfxLoOpen() メソッドから戻さ れたロケータ ファイル記述子です。 最初のバージョンは、nbytes バイトのデータをバイト バッファに戻します。このバ ージョンのメソッドは、バッファに対してメモリを割り当てます。2 番目のバージ ョンは、nbytes バイトのデータを、すでに割り当てられているバッファに読み込み ます。3 番目のバージョンは、nbytes バイトのデータをファイル出力ストリームに 読み込みます。4 番目のバージョンは、nbytes バイトのデータを、スマート ラージ オブジェクトの現行のシーク位置に offset を加えた位置 からバイト バッファに読 み込みます。後の 3 つのバージョンの戻り値は、読み込まれたバイト数を示しま す。 スマート ラージ オブジェクトからファイルに読み込むには、IfxSmartBlob クラス の IfxLoToFile() メソッドを使用します。このメソッドのシグニチャは次のとおり です。 public int IfxLoToFile(IfxLocator loPtr, String filename, int flag , int whence) throws SQLException public int IfxLoToFile(IfxBblob blob, String filename, int flag , int whence) throws SQLException public int IfxLoToFile(IfxCblob clob, String filename, int flag , int whence) throws SQLException 第 4 章 Informix データ型に関する作業 129 最初のバージョンは、ロケータ ポインタ loPtr で参照されるスマート ラージ オブ ジェクトを読み込みます。2 番目と 3 番目のバージョンは、指定された IfxBblob オブジェクトおよび IfxCblob オブジェクトにより参照されるスマート ラージ オ ブジェクトをそれぞれ読み込みます。 flag パラメータは、ファイルがクライアント上またはサーバ上のどちらにあるかを 示します。値は、IfxSmartBlob.LO_CLIENT_FILE または IfxSmartBlob.LO_SERVER_FILE のいずれかです。whence パラメータは、開始シーク 位置を示します。値については、128 ページの『スマート ラージ オブジェクト内 での位置決め』を参照してください。 ヒント: 次の関数のシグニチャは変更されています。 IfxSmartBlob.IfxLoToFile(). この関数は 4 つのパラメータを受け入れていましたが、現在は 3 つのパ ラメータのみを受け入れます。IfxLoToFile() の 3 つのオーバーロードされ た関数はすべて、3 つのパラメータを受け入れます。 スマート ラージ オブジェクトへの書込み 次のような方法で、スマート ラージ オブジェクトにデータを書き込むことができ ます。 v データを byte[ ] バッファからオブジェクトに書き込む。 v データをファイル入力ストリームからオブジェクトに書き込む。 v データをファイルからオブジェクトに書き込む。 byte[ ] バッファまたはファイル入力ストリームからスマート ラージ オブジェクト に書き込むには、IfxSmartBlob クラスの IfxLoWrite() メソッドを使用します。 public int IfxLoWrite(int lofd, byte[] buffer) throws SQLException public int IfxLoWrite(int lofd, InputStream fin, int length) throws SQLException 最初のバージョンのメソッドは、buffer.length バイトのデータをバッファからスマー ト ラージ オブジェクトに書き込みます。2 番目のバージョンは、length バイトの データを InputStream オブジェクトからスマート ラージ オブジェクトに書き込み ます。 lofd パラメータは、IfxLoCreate() メソッドまたは IfxLoOpen() メソッドから戻さ れたロケータ ファイル記述子です。buffer パラメータは、データが読み込まれる byte[] バッファです。fin パラメータは、スマート ラージ オブジェクトへのデータ の書込み元となる InputStream オブジェクトです。length パラメータは、スマート ラージ オブジェクトに書き込まれるバイト数です。ドライバは書き込まれたバイト 数を戻します。 ファイルからスマート ラージ オブジェクトにデータを書き込むには、 IfxSmartBlob クラスの IfxLoFromFile() メソッドを使用します。 public int IfxLoFromFile (int lofd, String filename, int flag, int offset, int amount) throws SQLException lofd パラメータは、IfxLoCreate() メソッドまたは IfxLoOpen() メソッドから戻さ れたロケータ ファイル記述子です。flag パラメータは、ファイルがクライアント上 130 IBM Informix JDBC ドライバ プログラマーズ ガイド またはサーバ上のどちらにあるかを示します。値は、IfxSmartBlob.LO_CLIENT_FILE または IfxSmartBlob.LO_SERVER_FILE のいずれかです。 ドライバは書き込まれたバイト数を戻します。 スマート ラージ オブジェクトの切捨て 指定したオフセットでラージ オブジェクトを切り捨てるには、IfxSmartBlob クラ スの IfxLoTruncate() メソッドを使用します。メソッド シグニチャは次のとおりで す。 public void IfxLoTruncate(int lofd, long offset) throws SQLException offset パラメータは、スマート ラージ オブジェクトが切り捨てられる絶対位置で す。 スマート ラージ オブジェクトの測定 スマート ラージ オブジェクトのサイズを戻すには、IfxSmartBlob クラスの IfxLoSize() メソッドを使用します。このメソッドは、ラージ オブジェクトのサイズ を表す長整数を戻します。 メソッド シグニチャは次のとおりです。 public long IfxLoSize(int lofd) throws SQLException スマート ラージ オブジェクトのクローズと解放 アプリケーションが必要とするすべての操作を実行した後は、オブジェクトをクロ ーズし、その後、サーバのリソースを解放する必要があります。これらのタスクを 実行する IfxSmartBlob クラスのメソッドは、次のとおりです。 public public public public void void void void IfxLoClose(int lofd) throws SQLException IfxLoRelease(IfxLocator loPtr) throws SQLException IfxLoRelease(IfxBblob blob) throws SQLException IfxLoRelease(IfxCblob clob) throws SQLException 同じラージ オブジェクトにさらにアクセスする場合は、IfxLoOpen() メソッドを使 用して再オープンする必要があります。 IfxLocator の 16 進文字列への変換 アプリケーションの中には (Web ブラウザなど)、ASCII データしか処理できないも のもあります。これらのアプリケーションでは、IfxLocator を 16 進文字列フォーマ ットに変換する必要があります。標準的な Web ベース アプリケーションでは、 Web サーバがデータベース表に問合せを行い、結果をブラウザに送信します。スマ ート ラージ オブジェクト全体を送信する代わりに、Web サーバはロケータを 16 進文字列フォーマットに変換してブラウザに送信します。ユーザがスマート ラージ オブジェクトの表示をブラウザに要求した場合、ブラウザは 16 進フォーマットの ロケータを Web サーバに送り返します。Web サーバは、その後、16 進文字列から バイナリ ロケータを再構築し、対応するスマート ラージ オブジェクト データを ブラウザに送信します。 IfxLocator バイト配列と 16 進数との間の変換を行うには、次の表にリストされてい るメソッドを使用します。 第 4 章 Informix データ型に関する作業 131 実行するタスク メソッド シグニチャ 注 バイト配列を 16 進文字 列に変換する public static String toHexString( byte[] byteBuf); IfxLocator 以外のデータを処理しま す。com.informix.util.stringUtil クラ スで提供されています。 16 進文字列をバイト配列 に変換する public static byte[] fromHexString( String str) throws NumberFormatException; IfxLocator 以外のデータを処理しま す。com.informix.util.stringUtil クラ スで提供されています。 public IfxLocator(byte[] byteBuf) throws バイト配列を使用して IfxLocator オブジェクトを SQLException; 構築する IfxLocator クラスで提供されていま す。 IfxLocator バイト配列を 16 進文字列に変換する public String toString(); IfxLocator クラスで提供されていま す。 16 進文字列を IfxLocator バイト配列に変換する public byte[] toBytes(); IfxLocator クラスで提供されていま す。 次の例では、toString() メソッドおよび toBytes() メソッドを使用して、スマート ラージ オブジェクトからロケータを取り出し、次にそれを 16 進文字列に変換しま す。 ... String hexLoc = ""; byte[] blobBytes; byte[] rawLocA = null; IfxLocator loc; try { ResultSet rs = stmt.executeQuery("select b1 from btab"); while(rs.next()) { IfxBblob b=(IfxBblob)rs.getBlob(1); loc =b.getLocator(); hexLoc = loc.toString(); rawLocA = loc.toBytes(); } } catch(SQLException e) {} 次の例では、IfxLocator() メソッドを使用して IfxLocator を構築し、その後それを 使用してスマート ラージ オブジェクトを読み込みます。 ... try { IfxLocator loc2 = new IfxLocator(rawLoc); IfxSmartBlob b2 = new IfxSmartBlob((IfxConnection)myConn); int lofd = b2.IfxLoOpen(loc2, b2.LO_RDWR); blobBytes = b2.IfxLoRead(lofd, fileLength); } catch(SQLException e) {} 132 IBM Informix JDBC ドライバ プログラマーズ ガイド 格納特性に関する作業 格納特性は、スマート ラージ オブジェクトの管理方法をデータベース サーバに伝 えます。これらの特性には、サイジング、ロギング、ロック、オープン モードなど の分野があります。格納特性に関して次のようなオプションがあります。 v スマート ラージ オブジェクトの格納特性を取得する基礎として、システム指定 の格納特性を使用する。 v 次のいずれかでシステム デフォルトを上書きする。 – スマート ラージ オブジェクトを格納する特定の CLOB 列または BLOB 列に 対して定義された格納特性 – 列レベルの格納特性 と呼ばれる、特定の CLOB 列または BLOB 列に固有な 格納特性 – ユーザ指定の格納特性 と呼ばれる、このスマート ラージ オブジェクトのみ に対してユーザが定義する特殊な格納特性 データベース サーバは、図 5 に示す階層を使用して、新規スマート ラージ オブジ ェクトに対する格納特性を取得します。 図 5. 格納特性の階層 指定の格納特性に対して、列レベルで定義された値はシステム指定の値を上書き し、ユーザ レベルの値は列レベルの値を上書きします。次の表に示す 3 つの時点 で格納特性を指定できます。 第 4 章 Informix データ型に関する作業 133 指定するとき 指定方法 詳細情報 SB 領域の作成時 onspaces ユーティリティのオプシ ョン 『システム指定の格納特性の使用』 IBM Informix Dynamic Server 管理者 ガイド データベース表の CREATE TABLE 文の PUT 節の 作成時 キーワード IBM Informix SQL ガイド: 構文 スマート ラージ ifxLobDescriptor クラスの オブジェクトの作 作成フラグとメソッド 成時 141 ページの『作成フラグの設定』 システム指定の格納特性の使用 データベース管理者は、データベース サーバを初期化し、onspaces ユーティリティ を使用して SB 領域を作成するときに、次のようにシステム指定の格納特性を設定 します。 v onspaces ユーティリティで特定の格納特性の値を指定した場合、データベース サーバは onspaces の値をシステム指定の格納特性として使用します。 v onspaces ユーティリティで特定の格納特性の値を指定しなかった場合、データベ ース サーバはシステム デフォルトをシステム指定の格納特性として使用しま す。 システム指定の格納特性は、スマート ラージ オブジェクトが列レベルまたはユー ザ指定の格納特性で明確に上書きする場合を除き、SB 領域に格納されるすべてのス マート ラージ オブジェクトに適用されます。 onspaces で設定可能な格納特性、およびシステム デフォルトについては、137 ペー ジの表 5 および 138 ページの表 6 を参照してください。 ほとんどのアプリケーションの場合、格納特性に対してシステム指定のデフォルト 値を使用することを推奨します。以下の例外に注意してください。 v アプリケーションが特別なパフォーマンスを必要とする。 ifxLobDescriptor の setXXX() メソッドを使用して、新規スマート ラージ オブ ジェクトのディスク格納領域情報を変更できます。詳しくは、141 ページの『作 成フラグの設定』を参照してください。 v 既存のスマート ラージ オブジェクトの格納特性を使用する。 IfxLoStat.getLobDescriptor() メソッドは、オープンされているスマート ラージ オブジェクトのラージ オブジェクト記述子を取得できます。 その後、新規オブ ジェクトを作成し、IfxSmartBlob.ifxLoAlter() メソッドを使用してその特性を新 規記述子に設定できます。詳細については、141 ページの『格納特性の変更』を 参照してください。 v 複数のスマート ラージ オブジェクトを扱っており、デフォルトの SB 領域は使 用したくない。 DBA は、ONCONFIG ファイルの SBSPACENAME 構成パラメータで、デフォル トの SB 領域名を指定できます。ただし、その格納場所 (SB 領域の名前) が、作 成するスマート ラージ オブジェクトに対して正しいことを確認する必要があり ます。新規スマート ラージ オブジェクトに対して SB 領域名を指定しない場 134 IBM Informix JDBC ドライバ プログラマーズ ガイド 合、データベース サーバはこのデフォルト SB 領域に格納します。この配置に より領域が制約される可能性があります。 v スマート ラージ オブジェクトのサイズが分かっている場合は、そのサイズを、 onspaces ユーティリティ (システム レベル)、あるいは CREATE TABLE 文また は ALTER TABLE 文 (列レベル) で指定するのではなく、アプリケーション内で IfxLobDescriptor.setEstBytes() メソッドを使用して指定します。 格納特性に関する情報の取得: スマート ラージ オブジェクトの列レベルの格納特 性を取得するには、colname パラメータに列の名前を渡して、アプリケーションで IfxSmartBlob クラスの次のメソッドを呼び出します。 IfxLobDescriptor IfxLoColInfo(java.lang.String colname) throws SQLException ほとんどのアプリケーションでは、SB 領域名 (スマート ラージ オブジェクトの格 納場所) の格納特性が正しいことを確認するだけで十分です。IfxSmartBlob オブジ ェクトを作成する前に ifxLobDescriptor クラスのさまざまな getXXX() メソッドを 呼び出すことにより、これらの格納特性の情報を取得できます。次の表で、 getXXX() メソッドについて要約します。 ifxLobDescriptor の メソッド シグニチャ 目的 int getCreateFlags() オブジェクトの作成フラグを取得する long getEstSize() オブジェクトの見積りサイズをバイト単位で取得す る int getExtSize() オブジェクトのエクステント サイズを取得する long getMaxBytes() オブジェクトの最大サイズをバイト単位で取得する java.lang.String getSbspace() オブジェクトが格納されているデータベース サー バの SB 領域の名前を取得する SB 領域特性の設定例: 次の onspaces ユーティリティ呼出しは、/dev/sbspace1 パ ーティションに sb1 という SB 領域を作成します。 onspaces -c -S sb1 -p /dev/sbspace1 -o 500 -s 2000 -Df "AVG_LO_SIZE=32" 表 4 に、sb1 SB 領域のすべてのスマート ラージ オブジェクトに対して結果とし て指定されたシステム指定の格納特性を示します。 表 4. SB 領域 sb1 に対するシステム指定の格納特性 onspaces ユーティリテ ィによる指定 ディスク格納領域情報 システム指定値 エクステントのサイズ データベース サーバにより計 算 システム デフォルト 追加エクステント サイズ データベース サーバにより計 算 システム デフォルト 最小エクステント サイズ データベース サーバにより計 算 システム デフォルト 第 4 章 Informix データ型に関する作業 135 表 4. SB 領域 sb1 に対するシステム指定の格納特性 (続き) onspaces ユーティリテ ィによる指定 ディスク格納領域情報 システム指定値 スマート ラージ オブジェクト のサイズ AVG_LO_SIZE 32 KB (サイズ見積りとしてデータベー ス サーバが使用) 入出力ブロックの最大サイズ データベース サーバにより計 算 システム デフォルト SB 領域の名前 sb1 -S オプション ロギング オフ システム デフォルト 最終アクセス時間 オフ システム デフォルト ディスク格納領域情報に関する作業 ディスク格納領域情報は、データベース サーバがスマート ラージ オブジェクトを ディスク上で最も効率的に管理する方法を決定するのに役立ちます。 重要: ほとんどのアプリケーションでは、ディスク格納領域情報にデータベース サ ーバが計算する値を使用します。IBM Informix JDBC ドライバで提供されて いるメソッドは特殊な状況を対象にしています。 このディスク格納領域情報には以下のようなものがあります。 v 割当てエクステント情報: – エクステント サイズ: 割当てエクステント は、データベース サーバがスマート ラージ オブジェク トに同時に割り当てる SB 領域内の連続的なバイトの集まりです。データベー ス サーバは、スマート ラージ オブジェクトに対する格納領域の割当てを、 エクステント サイズの単位で実行します。 ifxLobDescriptor.setExtSize() メソッドを呼び出すことにより、エクステント サイズを指定できます。 – 追加エクステント サイズ: データベース サーバは、エクステントをチャンク内の単一の連続的な領域と して割り当てようとします。ただし、十分な大きさの単一エクステントがない 場合、データベース サーバは、現行の書込み要求を満たすために、必要に応 じて複数のエクステントを使用する必要があります。初期エクステントがいっ ぱいになると、データベース サーバは別の連続的なディスク領域のエクステ ントを割り当てようとします。このプロセスは、追加エクステントの割当て と呼ばれます。 エクステントの詳細については、「IBM Informix Dynamic Server 管理者ガイド」 のディスク構造と格納領域に関する章を参照してください。 v サイジング情報: – 新規スマート ラージ オブジェクトの見積りバイト数 – スマート ラージ オブジェクトの最大バイト数 136 IBM Informix JDBC ドライバ プログラマーズ ガイド サイジング情報を指定するには、ifxLobDescriptor クラスの setMaxBytes() メソ ッドおよび setEstBytes() メソッドを使用します。 スマート ラージ オブジェクトのサイズが分かっている場合は、setEstBytes() メ ソッドを使用してそのサイズを指定します。データベース サーバがスマート ラ ージ オブジェクト全体を 1 つのエクステントとして割り当てることができるた め、エクステント サイズを設定するにはこれが最も良い方法です。 v 格納場所: SB 領域の名前により、スマート ラージ オブジェクトを格納する場所が識別さ れます。この名前を設定するには、vifxLobDescriptor.setSbSpace() メソッドを使 用します。 データベース サーバは、ディスク格納領域情報を使用して、SB 領域のエクステン トのサイジング、割当て、および管理を行う最良の方法を決定します。データベー ス サーバは、スマート ラージ オブジェクトに対する、SB 領域名以外のすべての ディスク格納領域情報を計算できます。 表 5 に、スマート ラージ オブジェクトに対するディスク格納領域情報の指定方法 を要約します。 表 5. ディスク格納領域情報の指定 ユーザ指定の 格納特性 システム指定の格納特性 列レベルの格納特性 システム デフォルト値 onspaces ユーティリテ ィで指定 IBM Informix JDBC ドライ CREATE TABLE 文 バ メソッド で指定 の PUT 節で指定 エクステントのサイズ データベース サーバ により計算 EXTENT_SIZE EXTENT SIZE あり 追加エクステント サイズ データベース サーバ により計算 NEXT_SIZE なし なし 最小エクステント サイズ 4 KB MIN_EXT_SIZE なし なし スマート ラージ オブジェ クトのサイズ データベース サーバ により計算 SB 領域のすべてのスマ なし ート ラージ オブジェク トの平均サイズ: AVG_LO_SIZE 入出力ブロックの最大サイ ズ データベース サーバ により計算 MAX_IO_SIZE なし なし SB 領域の名前 SBSPACENAME -S オプション スマート ラージ オ ブジェクトを格納す る既存の SB 領域の 名前 (IN 節で指定) あり ディスク格納領域情報 特定のスマー ト ラージ オ ブジェクトの 見積りサイズ 特定のスマー ト ラージ オ ブジェクトの 最大サイズ 第 4 章 Informix データ型に関する作業 137 ロギング、最終アクセス時間、およびデータ整合性に関する作業 データベース管理者とアプリケーションは、その他いくつかのスマート ラージ オ ブジェクト属性も指定できます。 v スマート ラージ オブジェクトに対する変更内容をシステム ログ ファイルに記 録するかどうか v スマート ラージ オブジェクトに対する最終アクセス時間を保存するかどうか v スマート ラージ オブジェクトの SB 領域のページのフォーマット方法 表 6 に、システム、列、およびアプリケーション レベルでの、これらの属性の変更 方法を要約します。 表 6. 属性情報の指定 システム指定の格納特性 列レベルの格納特性 ユーザ指定の格納特性 属性情報 システム デフォルト値 onspaces ユーティ CREATE TABLE 文の リティで指定 PUT 節で指定 JDBC ドライバ メソ ッドで指定 ロギング オフ LOGGING LOG、NO LOG あり 最終アクセス時間 オフ ACCESSTIME KEEP ACCESS TIME、 NO KEEP ACCESS TIME あり BUFFERING なし なし バッファリング モード オフ ロック モード スマート ラージ LOCK_MODE オブジェクト全体 をロック なし あり データ整合性 高保全性 (High integrity) HIGH INTEG、 MODERATE INTEG 必須 なし 以下のセクションでこれらの属性に関する詳細を示します。 ロギング: デフォルトでは、データベース サーバはスマート ラージ オブジェク トのユーザ データをログに記録しません。スマート ラージ オブジェクトに対する ロギング動作を、作成フラグの一部として制御できます。詳しくは、141 ページの 『作成フラグの設定』を参照してください。 データベースがロギングを実行すると、以下の理由でスマート ラージ オブジェク トがロング トランザクションの原因になる可能性があります。 v スマート ラージ オブジェクトは非常に大きくなる可能性があり、サイズが数 GB になる場合もあります。 ユーザ データを記録するために必要なログ ストレージ量は、容易にログをオー バーフローさせる可能性があります。 v スマート ラージ オブジェクトは、データ収集がかなり長くなるような状況で使 用される可能性があります。 例えば、スマート ラージ オブジェクトが質の低いオーディオ記録を保持する場 合、データ収集の量は適度になるかもしれませんが、記録セッションはかなり長 くなる可能性があります。 138 IBM Informix JDBC ドライバ プログラマーズ ガイド 簡単な予備手段は、ロング トランザクションをより小さい複数のトランザクション に分割することです。ただし、この解決策を受け入れられない場合は、データベー ス サーバがいつスマート ラージ オブジェクトのロギングを実行するかを制御でき ます。(138 ページの表 6 に、スマート ラージ オブジェクトに対するロギング動作 を制御する方法を示します。) ロギングが有効である場合、データベース サーバはスマート ラージ オブジェクト のユーザ データに対する変更内容をログに記録します。このロギングは、現行のデ ータベース ログ モードに基づいて実行されます。 ANSI 標準準拠でないデータベースの場合、データベース サーバは、スマート ラ ージ オブジェクトに関連するログ レコードがトランザクションのコミット時にフ ラッシュされることを保証しません。ただし、メタデータは常に動作が一貫した状 態、つまり、メタデータ (参照カウントなどの、スマート ラージ オブジェクトの 制御情報) 内に構造上の矛盾が存在しないことを保証する状態に復元できます。 米国規格協会 (ANSI) ANSI 標準準拠データベースは、バッファなしログを使用します。スマート ラージ オブジェクトのロギングが有効であるときは、スマート ラージ オブジェクトに関 連するすべてのログ レコード (メタデータとユーザ データ) が、トランザクション のコミット時にログにフラッシュされます。ただし、ユーザ データがコミット時に 安定した格納域にフラッシュされることは保証されません。 米国規格協会 (ANSI) の終り ロギングが無効である場合、データベース サーバは、その他のデータベース変更内 容をログに記録する場合でも、ユーザ データに対する変更内容をログに記録しませ ん。ただし、データベース サーバは常にメタデータに対する変更内容をログに記録 します。したがって、この場合でもデータベース サーバはメタデータを動作が一貫 した状態に復元できます。 重要: スマート ラージ オブジェクトに対するロギングを有効にするかどうかは、 慎重に検討してください。スマート ラージ オブジェクトをログに記録する 場合、データベース サーバに対して相当のオーバーヘッドが発生します。シ ステム ログ ファイルがスマート ラージ オブジェクトの値を保持するのに 十分な大きさであることを確認する必要もあります。論理ログ サイズが、更 新トランザクションがアクティブな間にデータベース サーバが記録するデー タの合計量を超えている必要があります。 更新が長くなる可能性のあるスマート ラージ オブジェクトのトランザクション が、他のトランザクションを待機させる原因となることがないように、アプリケー ションを記述します。以下の条件が満たされる場合は、複数のトランザクションが 同じスマート ラージ オブジェクトのインスタンスにアクセスできます。 v トランザクションがスマート ラージ オブジェクトへの LO ハンドルを含むデー タベースの行にアクセスできる。 複数の列が同一のスマート ラージ オブジェクトに対する LO ハンドルを保持し ている場合は、同一のスマート ラージ オブジェクトに対する複数の参照が存在 することができます。 第 4 章 Informix データ型に関する作業 139 v 別のトランザクションがスマート ラージ オブジェクトに対する競合ロックを保 持していない。 スマート ラージ オブジェクトのロックの詳細については、143 ページの『ロッ クに関する作業』を参照してください。 スマート ラージ オブジェクトをロードするときにロギング機能を無効にし、ロー ド操作の完了後に再度有効にすると、最良の更新パフォーマンスが得られ、論理ロ グの問題が最も少なくなります。ロギングがオンになっている場合は、バルク ロー ドの前にロギングをオフにしてから、レベル 0 バックアップを実行してください。 最終アクセス時間: スマート ラージ オブジェクトの最終アクセス時間は、データ ベース サーバが最後にスマート ラージ オブジェクトを読み込んだ、または書き込 んだシステム時刻です。最終アクセス時間は、スマート ラージ オブジェクトのユ ーザ データおよびメタデータへのアクセスを記録します。このシステム時刻は、 1970 年 1 月 1 日からの秒数として格納されます。データベース サーバは、この 最終アクセス時間を、SB 領域のメタデータ領域に格納します。 デフォルトでは、データベース サーバは最終アクセス時間を保存しません。 LO_KEEP_LASTACCESS_TIME 作成フラグを設定し、 IfxLobDescriptor.setCreateFlags() メソッドを呼び出すことにより、最終アクセス時 間の保存を指定できます。詳細については、141 ページの『作成フラグの設定』を 参照してください。 データベース サーバは、スマート ラージ オブジェクトに対する最終修正時間と状 態の最終変更も追跡します。詳しくは、142 ページの『状態特性に関する作業』を 参照してください。 重要: スマート ラージ オブジェクトの最終アクセス時間を追跡するかどうかは、 慎重に検討してください。スマート ラージ オブジェクトの最終アクセス時 間を管理するためには、ロギングと同時実行性においてデータベース サーバ に対して相当のオーバーヘッドが発生します。 データ整合性: IfxLobDescriptor.setCreateFlags() メソッドを呼び出すことにより、 LO_HIGH_INTEG 作成フラグおよび LO_MODERATE_INTEG 作成フラグを使用し てデータ整合性を指定できます。詳細については、141 ページの『作成フラグの設 定』を参照してください。 SB ページは、スマート ラージ オブジェクト データの割当て単位で、SB 領域の ユーザ データ領域に格納されます。SB 領域の SB ページの構造が、データベース サーバが提供できるデータ整合性の程度を決定します。データベース サーバは、ペ ージ ヘッダとトレイラを使用して、不完全な書込みとデータ破壊を検出します。 データベース サーバは、以下のレベルのデータ整合性をサポートしています。 v 高保全性は、それぞれの SB ページでページ ヘッダとページ トレイラの両方を 使用するように、データベース サーバに指示します。 v 中保全性は、それぞれの SB ページでページ ヘッダのみを使用するように、デ ータベース サーバに指示します。 中保全性には以下のような利点があります。 140 IBM Informix JDBC ドライバ プログラマーズ ガイド v SB ページにページ ヘッダおよびページ トレイラがあるときに必要な追加のデ ータ コピー操作を排除します。 v ページ ヘッダもページ トレイラも存在しないため、ページのユーザ データの配 置を保持します。 中保全性は、データベース サーバ内を移動し、高いデータ整合性を必要としない、 大量のオーディオまたはビデオ データを含むスマート ラージ オブジェクトに対し て有効である可能性があります。デフォルトで、データベース サーバは、SB 領域 ページに対して高保全性 (ページ ヘッダとページ トレイラ) を使用します。スマー ト ラージ オブジェクトのデータ整合性は、その格納特性の一部として制御できま す。 重要: スマート ラージ オブジェクトの SB ページに対して中保全性を使用するか どうかは、慎重に検討してください。中保全性の場合、1 ページあたりに使 用されるディスク領域はより小さくなりますが、ディスク エラーが発生した 場合にデータベース サーバが情報を復旧する機能も制限されます。 SB 領域ページの構造については、「IBM Informix Dynamic Server 管理者ガイド」 を参照してください。 格納特性の変更 IfxSmartBlob クラスの IfxLoAlter() メソッドにより、スマート ラージ オブジェク トの格納特性を変更できます。 スマート ラージ オブジェクトの特性を変更するには: 1. 新規ラージ オブジェクト記述子を作成します。次に例を示します。 IfxLobDescriptor loDesc = new IfxLobDescriptor(conn); 2. IfxLobDescriptor.setCreateFlags()、setEstBytes()、 IfxLobDescriptor.setMaxBytes()、setExtSize、および setSbspace() を呼び出し て、新規特性を指定します。 public public public public public void void void void void setCreateFlags( int flags ) setEstBytes(long estSize) setMaxBytes (long maxSize) setExtSize (long extSize) setSbspace(java.lang.String sbspacename) flag パラメータは、次の『作成フラグの設定』からの定数です。 3. IfxLoAlter() を呼び出して、既存のスマート ラージ オブジェクトに新規記述子 を含めるように変更します。 public int IfxLoAlter(IfxLocator loPtr, IfxLobDescriptor loDesc) throws SQLException public int IfxLoAlter(IfxBblob blob, IfxLobDescriptor loDesc) throws SQLException public int IfxLoAlter(IfxCblob clob, IfxLobDescriptor loDesc) throws SQLException IfxLoAlter() は、更新を続行する前に、スマート ラージ オブジェクト全体に対する 排他ロックをサーバで取得します。このロックは更新が完了するまで保持されま す。 作成フラグの設定: IfxLobDescriptor.setCreateFlags() メソッドを呼び出すことによ り、以下の特性を変更できます。 v ロギング特性 第 4 章 Informix データ型に関する作業 141 定数 LO_LOG または LO_ NOLOG を指定できます。 LO_LOG は、対応するスマート ラージ オブジェクトに対して、現行のデータベ ース ログで使用されているロギング手順にサーバが従うようにします。このオプ ションにより、大量のログ トラフィックが生成され、論理ログがいっぱいになる リスクが高くなる可能性があります。 完全ログ機能の代わりに、最初にスマート ラージ オブジェクトをロードすると きにロギングをオフにし、スマート ラージ オブジェクトがロードされたら再度 ロギングをオンに戻すことができます。NO LOG を使用すると、後でスマート ラージ オブジェクトのメタデータを、構造上の矛盾が存在しない状態に復元でき ます。いずれにしてもほとんどの場合トランザクションの不整合は存在しません が、結果は保証されません。 ロギングの使用方法の詳細については、138 ページの『ロギング』を参照してく ださい。 v 最終アクセス時間特性 定数 LO_ KEEP_LASTACCESS_TIME または LO NOKEEP_LASTACCESS_TIME を指定できます。LO_ KEEP_LASTACCESS_TIME は、対応するスマート ラージ オブジェクトが最後に読み込まれた、または書き込まれたシステム時刻を、スマ ート ラージ オブジェクトのメタデータに記録します。 最終アクセス時間の使用方法の詳細については、140 ページの『最終アクセス時 間』を参照してください。 v ユーザ データ ページをページ ヘッダおよびページ トレイラを使用して作成す ることにより、不完全な書込みとデータ破壊を検出するかどうか 定数 LO_ HIGH_INTEG または LO_moderate_integ を指定できます。LO_ HIGH_INTEG がデフォルトのデータ整合性動作です。 データ整合性の使用方法の詳細については、140 ページの『データ整合性』を参 照してください。 次の例は、複数のフラグを設定します。 loDesc.setCreateFlags (IfxSmartBlob.LO_LOG+IfxSmartBlob.LO_TEMP+...) 並列 getXXX() メソッドにより、ラージ オブジェクトの現行の格納特性を取得でき ます。 public int getCreateFlags() すべての特性の詳細については、「IBM Informix SQL ガイド: 構文」の、CREATE TABLE 文の PUT 節について説明しているセクションを参照してください。 状態特性に関する作業 IfxLoStat クラスは、サイズ、最終アクセス時間、最終修正時間、最終状態変更な ど、スマート ラージ オブジェクトに関するいくつかの統計情報を格納します。図 6 に、取得可能な状態に関する情報を示します。 142 IBM Informix JDBC ドライバ プログラマーズ ガイド 状態に関する情報 説明 最終アクセス時間 スマート ラージ オブジェクトが最後にアクセスされた時間 (秒単位) この値は、スマート ラージ オブジェクトに対して最終アクセス時間属性が有効に なっている場合にのみ使用できます。詳しくは、140 ページの『最終アクセス時 間』を参照してください。 最終変更時間 スマート ラージ オブジェクトの状態が最後に変更された時間 (秒単位) 状態の変更には、メタデータとユーザ データの変更 (データ更新と参照数の変更) が含まれます。このシステム時刻は、1970 年 1 月 1 日からの秒数として格納さ れます。 最終修正時間 スマート ラージ オブジェクトが最後に修正された時間 (秒単位) 修正には、ユーザ データの変更 (データ更新) のみが含まれます。このシステム時 刻は、1970 年 1 月 1 日からの秒数として格納されます。 プラットフォームの中には、最終修正時間に、秒の構成要素とは別に取得できるマ イクロ秒の構成要素が含まれるものもあります。 サイズ スマート ラージ オブジェクトのサイズ (バイト単位) 格納特性 133 ページの『格納特性に関する作業』を参照してください。 図 6. スマート ラージ オブジェクトの状態に関する情報 状態構造への参照を取得するには、IfxSmartBlob クラスにある次のメソッドを呼び 出します。 IfxLoStat IfxLoGetStat(int lofd) 特定のカテゴリの状態情報を取得するには、図 7 に示すメソッドを呼び出します。 状態に関する情報 ifxLoStat クラスのメソッド シグニチャ 最終アクセス時間 int getLastAccessTime() 最終変更時間 int getLastStatusTime() 最終修正時間 int getLastModifyTimeM() - マイクロ秒単位の時間 int getLastModifyTimeS() - 秒単位に四捨五入された時間 サイズ int getSize() 格納特性 ifxLobDescriptor getLobDescriptor() 図 7. 状態に関する情報を取得するためのメソッド ロックに関する作業 スマート ラージ オブジェクト データへの同時アクセスを防ぐために、ユーザがス マート ラージ オブジェクトをオープンすると、データベース サーバはそのデータ に対するロックを取得します。このスマート ラージ オブジェクト ロックは以下の 種類のロックとは異なります。 v 行ロック 第 4 章 Informix データ型に関する作業 143 スマート ラージ オブジェクトに対するロックでは、そのスマート ラージ オブ ジェクトが常駐する行はロックしません。ただし、行からスマート ラージ オブ ジェクトを抽出し、その行が現行のままである場合は、データベース サーバはス マート ラージ オブジェクト ロックだけでなく行ロックも保持する可能性があり ます。多くの列が同一のスマート ラージ オブジェクト データにアクセスしてい る可能性があるため、ロックは行に対してではなく、スマート ラージ オブジェ クトに対して保持されます。 v 表の同一行にある異なるスマート ラージ オブジェクトのロック スマート ラージ オブジェクトに対するロックは、その行にある他のスマート ラ ージ オブジェクトには影響を与えません。 表 7 に、スマート ラージ オブジェクトがサポートするロック モードを示します。 表 7. スマート ラージ オブジェクトのロック モード ロック モード 目的 説明 全体 スマート ラージ オブジェ ロック要求が、スマート ラージ オブジェク クト全体をロック トのすべてのデータに適用されることを示し ます。 バイト範囲 スマート ラージ オブジェ ロック要求が、スマート ラージ オブジェク クトの指定された部分のみ ト データの指定されたバイト数にのみ適用 されることを示します。 をロック サーバは、スマート ラージ オブジェクトをオープンするとき、以下の情報を使用 してスマート ラージ オブジェクトのロック モードを判別します。 v スマート ラージ オブジェクトのアクセス モード データベース サーバは、以下のようにロックを取得します。 – スマート ラージ オブジェクトを読取り用 (読取り専用) にオープンするとき は、共有モード – スマート ラージ オブジェクトを書込み用 (書込み専用、読取り/書込み、書込 み/追加) にオープンするときは、更新モード スマート ラージ オブジェクトに対して書込み操作 (またはその他の更新) が 実際に実行されると、サーバはこのロックを排他ロック にアップグレードし ます。 v 現行トランザクションの排他レベル データベースの表の排他モードが繰返し可能読込みである場合、サーバは、スマ ート ラージ オブジェクトに対して取得したロックを、トランザクションが終了 するまでいずれも解放しません。 デフォルトでは、サーバは全体ロック モードを選択します。 サーバは次のようにロックを保持します。 v サーバは、次のいずれかのイベントが発生するまで、共有モード ロックと更新ロ ック (まだ排他ロックにアップグレードされていないもの) を保持します。 – スマート ラージ オブジェクトのクローズ 144 IBM Informix JDBC ドライバ プログラマーズ ガイド – トランザクションの終了 – 明示的なロック解放要求 (バイト範囲ロックの場合のみ) v ユーザがスマート ラージ オブジェクトをクローズしても、サーバはトランザク ションの終了まで排他ロックを保持します。 前のいずれかの状態が発生すると、サーバはスマート ラージ オブジェクトに対す るロックを解放します。 重要: スマート ラージ オブジェクトがオープンされたままであっても、トランザ クションの終了時にはロックが解除されます。サーバは、スマート ラージ オブジェクトにアクティブなロックがないことを検出すると、そのスマート ラージ オブジェクトに対する最初のアクセスが発生したときに自動的に新規 ロックを取得します。取得されるロックは、スマート ラージ オブジェクト のオリジナルのアクセス モードに基づきます。 現行トランザクションが終了すると、サーバはロックを解放します。ただし、ロッ クを必要とする次の関数が実行されると、サーバは再びロックを取得します。この 動作が望ましくない場合は、サーバ サイド SQL アプリケーションで BEGIN WORK トランザクション ブロックを使用し、ロックを使用する必要がある最後の 文の後に COMMIT WORK 文または ROLLBACK WORK 文を配置します。 バイト範囲ロックの使用 デフォルトでは、データベース サーバは、スマート ラージ オブジェクトをロック する必要がある場合、すべての全体ロックを使用します。全体ロックは「全か無 か」のロックです。つまり、スマート ラージ オブジェクト全体をロックします。 データベース サーバが排他ロックを取得すると、そのロックが保持されている限 り、どのユーザもスマート ラージ オブジェクトのデータにアクセスできません。 このロックがユーザのアプリケーションの同時実行性要件に対して制限的すぎる場 合は、全体ロックの代わりにバイト範囲ロックを使用します。バイト範囲ロックで は、スマート ラージ オブジェクト データのロック対象バイト範囲を指定できま す。他のユーザは、データの他の部分にアクセスする場合に独自にバイト範囲ロッ クを獲得できます。 バイト範囲ロックを指定するには、IfxSmartBlob クラスの IfxLoLock() メソッドを 使用します。 public long IfxLoLock(int lofd, long offset, int whence, long range, int lockmode) throws SQLException オブジェクトのバイト範囲のロックを解除するには、IfxLoUnLock() メソッドを使 用します。 public long IfxLoUnLock( int lofd, long offset, int whence, long range) throws SQLException lofd パラメータは、IfxLoCreate() メソッドまたは IfxLoOpen() メソッドから戻さ れたロケータ ファイル記述子です。 offset パラメータは、開始シーク位置からのオ フセットです。whence パラメータは、開始シーク位置を示します。これらの値につ いては 128 ページの『スマート ラージ オブジェクト内での位置決め』の表で説明 されています。 第 4 章 Informix データ型に関する作業 145 range パラメータは、ロックまたはアンロックするスマート ラージ オブジェクト 内のバイト数を示します。lockmode パラメータは、作成するロックのタイプを示し ます。値は IfxSmartBlob.LO_EXCLUSIVE_MODE または IfxSmartBlob.LO_SHARED_MODE のいずれかです。 ラージ オブジェクトのキャッシュ BLOB 型、CLOB 型、テキスト (TEXT) 型、またはバイト (BYTE) 型のオブジェ クトがデータベース サーバから取り出される場合、そのデータは必ずクライアント のメモリにキャッシュされます。ラージ オブジェクトのサイズが LOBCACHE 環 境変数の値よりも大きい場合、ラージ オブジェクトのデータは一時ファイルに格納 されます。LOBCACHE 変数の詳細については、208 ページの『ラージ オブジェク トのメモリ管理』を参照してください。 スマート ラージ オブジェクトの例 以下のページの例では、このセクションで説明したいくつかのタスクを例示しま す。 スマート ラージ オブジェクトの作成 この例は、121 ページの『スマート ラージ オブジェクトの作成手順』に示された 手順を例示しています。 file = new File("data.dat"); FileInputStream fin = new FileInputStream(file); byte[] buffer = new byte[200];; IfxLobDescriptor loDesc = new IfxLobDescriptor(myConn); IfxLocator loPtr = new IfxLocator(); IfxSmartBlob smb = new IfxSmartBlob(myConn); // Now create the large object in server. Read the data from the file // data.dat and write to the large object. int loFd = smb.IfxLoCreate(loDesc, smb.LO_RDWR, loPtr); System.out.println("A smart-blob is created "); int n = fin.read(buffer); if (n > 0) n = smb.IfxLoWrite(loFd, buffer); System.out.println("Wrote: " + n +" bytes into it"); // Close the large object and release the locator. smb.IfxLoClose(loFd); System.out.println("Smart-blob is closed " ); smb.IfxLoRelease(loPtr); System.out.println("Smart Blob Locator is released "); ファイル data.dat の内容が、スマート ラージ オブジェクトに書き込まれます。 スマート ラージ オブジェクトへのデータの挿入 次のコードはスマート ラージ オブジェクトにデータを挿入します。 String s = "insert into large_tab (col1, col2) values (?,?)"; pstmt = myConn.prepareStatement(s); file = new File("data.dat"); FileInputStream fin = new FileInputStream(file); byte[] buffer = new byte[200];; 146 IBM Informix JDBC ドライバ プログラマーズ ガイド IfxLobDescriptor loDesc = new IfxLobDescriptor(myConn); IfxLocator loPtr = new IfxLocator(); IfxSmartBlob smb = new IfxSmartBlob(myConn); // Create a smart large object in server int loFd = smb.IfxLoCreate(loDesc, smb.LO_RDWR, loPtr); System.out.println("A smart-blob has been created "); int n = fin.read(buffer); if (n > 0) n = smb.IfxLoWrite(loFd, buffer); smb.IfxLoClose(loFd); System.out.println("Wrote: " + n +" bytes into it"); System.out.println("Smart-blob is closed " ); Blob blb = new IfxBblob(loPtr); pstmt.setInt(1, 2); // set the Integer column pstmt.setBlob(2, blb); // set the blob column pstmt.executeUpdate(); System.out.println("Binding of smart large object to table is done"); pstmt.close(); smb.IfxLoRelease(loPtr); System.out.println("Smart Blob Locator is released "); ファイル data.dat の内容が、large_tab 表の BLOB 列に書き込まれます。 スマート ラージ オブジェクトからのデータの抽出 このセクションの例は、126 ページの『スマート ラージ オブジェクトへのアクセ ス手順』に示された手順を例示しています。 次のコード例は、Informix 拡張クラスを使用してスマート ラージ オブジェクト デ ータにアクセスする方法を示しています。 byte[] buffer = new byte[200]; System.out.println("Reading data now ..."); try { int row = 0; Statement stmt = myConn.createStatement(); ResultSet rs = stmt.executeQuery("Select * from demo_14"); while( rs.next() ) { row++; String str = rs.getString(1); InputStream value = rs.getAsciiStream(2); IfxBblob b = (IfxBblob) rs.getBlob(2); IfxLocator loPtr = b.getLocator(); IfxSmartBlob smb = new IfxSmartBlob(myConn); int loFd = smb.IfxLoOpen(loPtr, smb.LO_RDONLY); System.out.println("The Smart Blob is Opened for reading .."); int number = smb.IfxLoRead(loFd, buffer, buffer.length); System.out.println("Read total " + number + " bytes"); smb.IfxLoClose(loFd); System.out.println("Closed the Smart Blob .."); smb.IfxLoRelease(loPtr); System.out.println("Locator is released .."); } rs.close(); } catch(SQLException e) { System.out.println("Select Failed ...¥n" +e.getMessage()); } 第 4 章 Informix データ型に関する作業 147 最初に、ResultSet.getBlob() メソッドが、BLOB 型のオブジェクトを取得します。 戻されたオブジェクトを IfxBblob 型のオブジェクトに変換するために、キャストが 必要です。次に、IfxBblob.getLocator() メソッドが、IfxBblob オブジェクトから IfxLocator オブジェクトを取得します。 IfxLocator オブジェクトが使用可能になっ た後で、IfxSmartBlob オブジェクトをインスタンス化し、IfxLoOpen() メソッドと IfxLoRead() メソッドを使用してスマート ラージ オブジェクト データを読み込む ことができます。CLOB データの取出しも同様ですが、メソッド ResultSet.getClob()、IfxCblob.getLocator() などを使用します。 getBlob() または getClob() を使用して BLOB 型列からデータを取り出す場合は、 前のサンプル コードに示したように Informix 拡張セットを使用して実際の BLOB の内容を抽出する必要はありません。 Java.Blob.getBinaryStream() または Java.Clob.getAsciiStream() を使用するだけで内容を抽出できます。IBM Informix JDBC ドライバが、サンプル コードと基本的に同じ手順を使用して、ユーザに代わ ってデータベース サーバから暗黙的に内容を抽出します。このアプローチは前の例 のアプローチよりも簡単ですが、BLOB 型列の内容を読み込むためのオプションは 少なくなります。 148 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 5 章 不透明 (OPAQUE) 型に関する作業 本章について . . . . . . . . . . . . . . . . . . . . IfmxUDTSQLInput インターフェイスの使用 . . . . . . . . . . データの読込み. . . . . . . . . . . . . . . . . . . データ ストリーム内での位置決め . . . . . . . . . . . . データ属性の設定または取得 . . . . . . . . . . . . . . IfmxUDTSQLOutput インターフェイスの使用 . . . . . . . . . . 不透明 (OPAQUE) 型のマッピング . . . . . . . . . . . . . 型情報のキャッシュ . . . . . . . . . . . . . . . . . . サポートされないメソッド . . . . . . . . . . . . . . . . 不透明 (OPAQUE) 型と UDR の作成 . . . . . . . . . . . . 不透明 (OPAQUE) 型と UDR の作成の概要 . . . . . . . . . 不透明 (OPAQUE) 型と UDR の作成の準備 . . . . . . . . . 不透明 (OPAQUE) 型の作成手順 . . . . . . . . . . . . . UDR の作成手順 . . . . . . . . . . . . . . . . . . Java クラスに対する要件 . . . . . . . . . . . . . . . SQL 名 . . . . . . . . . . . . . . . . . . . . . 不透明 (OPAQUE) 型の特性の指定 . . . . . . . . . . . . フィールド カウントの指定 . . . . . . . . . . . . . 追加のフィールド特性の指定 . . . . . . . . . . . . . 長さの指定 . . . . . . . . . . . . . . . . . . . 位置合せの指定. . . . . . . . . . . . . . . . . . 位置合せの値 . . . . . . . . . . . . . . . . . . SQL 名の指定 . . . . . . . . . . . . . . . . . . Java クラス名の指定 . . . . . . . . . . . . . . . . Java ソース ファイル保存の指定 . . . . . . . . . . . . JAR ファイルとクラス ファイルの作成 . . . . . . . . . . .class ファイルと .java ファイルの作成 . . . . . . . . . . .jar ファイルの作成 . . . . . . . . . . . . . . . . データベース サーバへのクラス定義の送信 . . . . . . . . . 配置記述子の動作の指定. . . . . . . . . . . . . . . JAR ファイル一時パスの指定 . . . . . . . . . . . . . 既存のコードからの不透明 (OPAQUE) 型の作成. . . . . . . . setXXXCast() メソッドの使用 . . . . . . . . . . . . . setSupportUDR() および setUDR() の使用 . . . . . . . . . 不透明 (OPAQUE) 型と JAR ファイルの除去 . . . . . . . . UDR の作成 . . . . . . . . . . . . . . . . . . . . UDR と JAR ファイルの除去 . . . . . . . . . . . . . . オーバーロードされた UDR の除去 . . . . . . . . . . . 不透明 (OPAQUE) 型と UDR に関する情報の取得 . . . . . . . UDTMetaData クラスの getXXX() メソッド . . . . . . . . UDRMetaData クラスの getXXX() メソッド . . . . . . . . トランザクションでの実行 . . . . . . . . . . . . . . . 例 . . . . . . . . . . . . . . . . . . . . . . . . クラス定義 . . . . . . . . . . . . . . . . . . . . データの挿入 . . . . . . . . . . . . . . . . . . . データの抽出 . . . . . . . . . . . . . . . . . . . 不透明 (OPAQUE) 型内のスマート ラージ オブジェクトの使用 . . UDTManager を使用した、既存の Java クラスからの不透明 (OPAQUE) デフォルトのサポート関数を使用した不透明 (OPAQUE) 型の作成. ユーザ指定のサポート関数を使用した不透明 (OPAQUE) 型の作成. © Copyright IBM Corp. 1996, 2008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 型の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 151 151 151 152 152 152 153 153 154 154 155 156 158 159 160 161 161 161 162 162 163 163 163 163 164 164 164 165 165 165 166 167 167 168 168 169 170 170 170 171 172 172 173 174 174 175 177 177 182 149 既存の Java クラスを使用しない不透明 (OPAQUE) 型の作成 . UDRManager を使用した UDR の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 . 187 本章について 不透明 (OPAQUE) 型 は、データベース サーバを拡張するために定義する、最小の データ型です。ユーザが不透明 (OPAQUE) 型について記述したルーチンを作成する まで、データベース サーバには不透明 (OPAQUE) 型に関する情報がありません。 データベース サーバを拡張する場合も、多くの場合、拡張をサポートするためにユ ーザ定義ルーチン (UDR) の作成が必要になります。UDR はユーザが作成するルー チンで、SQL 文、データベース サーバ、または別の UDR から起動できます。 UDR は不透明 (OPAQUE) 型の一部にすることも、別にすることもできます。 JDBC 3.0 標準には、不透明 (OPAQUE) 型にアクセスするために、 java.sql.SQLInput および java.sql.SQLOutput メソッドが規定されています。これ らのインターフェイスの定義は、Informix の固定長バイナリ不透明 (OPAQUE) 型お よび可変バイナリ不透明 (OPAQUE) 型を完全にサポートするように拡張されていま す。 この拡張には以下のインターフェイスが含まれています。 v IfmxUdtSQLInput v IfmxUdtSQLOutput さらに、以下のクラスにより、JDBC クライアント アプリケーションから、データ ベース サーバに Java 不透明 (OPAQUE) 型と UDR を簡単に作成できます。 v UDTManager v UDTMetaData v UDRManager v UDRMetaData UDTManager クラスと UDRManager クラスは、クライアント サイドの Java ク ラスを不透明 (OPAQUE) 型と UDR にマップし、それらのインスタンスをデータ ベースに格納するためのインフラストラクチャを提供します。 この機能は、クライアント サイド JDBC でのみ動作します。サーバ サイド JDBC の機能と制限の詳細については、「J/Foundation 開発者ガイド」を参照してくださ い。 不透明 (OPAQUE) 型および UDR の詳細については、以下の資料を参照してくだ さい。 v 「IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド」では、 このセクションの情報を使用するために必要な、不透明 (OPAQUE) 型と UDR に関する用語と概念について説明しています。内部データ構造、サポート関数、 暗黙的キャストと明示的キャストなどが含まれます。 v 「J/Foundation 開発者ガイド」では、Java での UDR の記述に固有な情報につい て説明しています。 この章には以下のトピックが含まれます。 v IfmxUDTSQLInput インターフェイスの使用 150 IBM Informix JDBC ドライバ プログラマーズ ガイド v IfmxUDTSQLOutput インターフェイスの使用 v 不透明 (OPAQUE) 型のマッピング v 型情報のキャッシュ v 不透明 (OPAQUE) 型と UDR の作成 v 例 IfmxUDTSQLInput インターフェイスの使用 com.informix.jdbc.IfmxUdtSQLInput インターフェイスは、java.sql.SQLInput を、 いくつかのメソッドを追加して拡張しています。これらのメソッドを使用するに は、SQLInput の参照を IfmxUdtSQLInput にキャストする必要があります。これ らのメソッドでは、以下の機能を実行できます。 v データを読み込む。 v データ ストリーム内で位置決めする。 v データの属性を設定または取得する。 データの読込み readString() メソッドは、ストリーム内の次の属性を Java 文字列として読み込みま す。readBytes() メソッドは、ストリーム内の次の属性を Java バイト配列として読 み込みます。どちらのメソッドも、固定長のデータが読み込まれるということを除 いて、SQLInput.readBytes() メソッドと類似しています。 public String readString(int maxlen) throws SQLException; public byte[] readBytes(int maxlen) throws SQLException; どちらのメソッドでも、IBM Informix JDBC ドライバが次の属性を正しく読み込め るように、長さを指定する必要があります。これは、不透明 (OPAQUE) 型の特性を ドライバが認識できないためです。maxlen パラメータは、読み込まれるデータの最 大長を指定します。 データ ストリーム内での位置決め getCurrentPosition() メソッドは、入力ストリーム内での現在位置を取得します。 setCurrentPosition() メソッドは、入力ストリーム内での位置を、position パラメー タで指定された位置に変更します。 public int getCurrentPosition(); public void setCurrentPosition(int position) throws SQLException; public void skipBytes(int len) throws SQLException; position パラメータは正整数である必要があります。skipBytes() メソッドは、現在 位置から len パラメータで指定したバイト数だけ、入力ストリーム内での位置を変 更します。len パラメータは正整数である必要があります。 setCurrentPosition() と skipBytes() の両方について、指定された新しい位置が入力 ストリームの終端より後である場合、IBM Informix JDBC ドライバは SQLException を生成します。 第 5 章 不透明 (OPAQUE) 型に関する作業 151 データ属性の設定または取得 length() メソッドは、データ ストリーム全体の全長を戻します。 getAutoAlignment() メソッドは、自動位置合せ機能の TRUE または FALSE (オン/オ フ) 状態を取得します。setAutoAlignment() メソッドは、状態を TRUE または FALSE に設定します。 public int length(); public boolean getAutoAlignment(); public void setAutoAlignment(boolean value); 重要: 自動位置合せ機能を設定すると、データがすでに位置合せされていない場 合、入力ストリームから何バイトかが廃棄される可能性があります。 JDBC アプリケーションは、位置合せされたデータを提供するか、自動位置合せ機 能を FALSE に設定する必要があります。 IfmxUDTSQLOutput インターフェイスの使用 com.informix.jdbc.IfmxUdtSQLOutput インターフェイスは、以下のメソッドを追加 して java.sql.SQLOutput を拡張しています。 public void writeString(String str, int length) throws SQLException;public void writeBytes(byte[] b, int length) throws SQLException; これらのメソッドを使用するには、SQLOutput の参照を IfmxUdtSQLOutput にキ ャストする必要があります。 次の属性をストリームに Java 文字列として書き込むには、writeString() メソッド を使用します。渡された文字列が指定された長さよりも短い場合、IBM Informix JDBC ドライバは文字列にゼロを埋め込みます。 次の属性をストリームに Java バイト配列として書き込むには、writeBytes() メソッ ドを使用します。 どちらのメソッドも、固定長のデータがストリームに書き込まれるということを除 いて、SQLOutput.writeBytes() メソッドと類似しています。渡された配列または文 字列が指定された長さよりも短い場合、IBM Informix JDBC ドライバは配列または 文字列にゼロを埋め込みます。どちらのメソッドでも、IBM Informix JDBC ドライ バが次の属性を正しく書き込めるように、長さを指定する必要があります。これ は、不透明 (OPAQUE) 型をドライバが認識できないためです。 不透明 (OPAQUE) 型のマッピング Informix 不透明 (OPAQUE) 型は Java オブジェクトにマップされます。これらのオ ブジェクトは java.sql.SQLData インターフェイスを実装する必要があります。これ らの Java オブジェクトは、その不透明 (OPAQUE) 型を構成するすべてのデータ メンバを記述します。これらの Java オブジェクトは強く型付けされています。つま り、Java オブジェクトの readSQL メソッドまたは writeSQL メソッドの各読込み メソッドまたは書込みメソッドが、不透明 (OPAQUE) 型定義の対応するデータ メ ンバに一致する必要があります。型構造を特定できないため、IBM Informix JDBC ドライバは型変換を実行できません。 152 IBM Informix JDBC ドライバ プログラマーズ ガイド また、IBM Informix JDBC ドライバでは、すべての不透明 (OPAQUE) 型データ が、mitypes.h (このファイルはすべての Informix Dynamic Server インストールに 含まれています) で定義されているように、Informix DataBlade® API データ型とし てトランスポートされる必要もあります。 すべての不透明 (OPAQUE) 型データ は、不透明 (OPAQUE) 型で定義されているように、さまざまな DataBlade API デ ータ型から構成される C 構造でデータベース サーバの表に格納されます。 UDT および UDR Manager 機能を使用して不透明 (OPAQUE) 型を作成する場合 は、Java と C との間のマッピングを処理する必要はありません。 詳しくは、154 ページの『不透明 (OPAQUE) 型と UDR の作成』を参照してください。 型情報のキャッシュ あるデータ型のオブジェクトが別のデータ型の列にデータを挿入すると、IBM Informix JDBC ドライバは、SQLData.getSQLTypeName() メソッドを呼び出すこと により、与えられたデータがデータベース サーバが予期するデータに一致すること を確認します。ドライバは、挿入ごとにデータベース サーバに型情報を問い合わせ ます。 これは、以下のような場合に発生します。 v SQLData オブジェクトが不透明 (OPAQUE) 型列にデータを挿入し、 getSQLTypeName() が不透明 (OPAQUE) 型の名前を戻すとき。 v Struct または SQLData オブジェクトが行 (ROW) 型列にデータを挿入し、 getSQLTypeName() が名前付き行の名前を戻すとき。 v SQLData オブジェクトがディスティンクト (DISTINCT) 型列にデータを挿入す るとき。 データベース URL で環境変数 ENABLE_CACHE_TYPE=1 を設定して、型情報が初めて 抽出されたときに、ドライバがその型情報をキャッシュするようにできます。その 後、データベース サーバにデータを要求する前に、ドライバはキャッシュに型情報 を問い合わせます。 サポートされないメソッド SQLInput および SQLOutput インターフェイスの以下のメソッドは、不透明 (OPAQUE) 型に対してはサポートされていません。 v java.sql.SQLInput – readAsciiStream() – readBinaryStream() – readBytes() – readCharacterStream() – readObject() – readRef() – readString() v java.sql.SQLOutput – writeAsciiStream(InputStream x) 第 5 章 不透明 (OPAQUE) 型に関する作業 153 – writeBinaryStream(InputStream x) – writeBytes(byte[] x) – writeCharacterStream(Reader x) – writeObject(Object x) – writeRef(Ref x) – writeString(String x) 不透明 (OPAQUE) 型と UDR の作成 UDTManager と UDRManager クラスを使用して、簡単に不透明 (OPAQUE) 型と ユーザ定義ルーチン (UDR) をデータベース サーバに作成し、配置できます。 このセクションの情報を使用する前に、以下の 2 つの資料も参照してください。 v Java UDR をサポートするようにシステムを構成する方法については、 「J/Foundation 開発者ガイド」を参照してください。 v 不透明 (OPAQUE) 型の作成に関する詳細については、「IBM Informix ユーザ定 義ルーチンおよびデータ タイプ開発者ガイド」を参照してください。 不透明 (OPAQUE) 型と UDR の作成の概要 データベース サーバでは、java.sql.SQLData インターフェイスを実装しており、 Java 仮想マシンからアクセス可能な任意の Java クラスを、不透明 (OPAQUE) 型と して保管できます。 UDTManager および UDRManager クラスは、それらをサポ ートする UDTMetaData および UDRMetaData クラスとともに、この機能をクラ イアント アプリケーションに対して拡張します。Java クライアント アプリケーシ ョンはこれらのクラスを使用して不透明 (OPAQUE) 型とユーザ定義ルーチンを作成 し、クラス定義をデータベース サーバに転送することができます。 この機能を使 用するために、クライアントがデータベース サーバに対してアクセス可能である必 要はありません。 重要: この機能は、Java 不透明 (OPAQUE) 型とユーザ定義ルーチンの作成と使用 に対するサーバ サポートと強く結び付いています。ご使用のデータベース サーバのバージョンにおける Java 不透明 (OPAQUE) 型とユーザ定義ルーチ ンの使用上の制限は、クライアント アプリケーションで作成する Java 不透 明 (OPAQUE) 型とルーチンにも同様に適用されます。 UDTManager および UDTMetaData クラスを使用すると、IBM Informix JDBC ド ライバが以下のすべての操作をアプリケーションに代わって実行します。 1. 指定した JAR ファイルを取得する 2. JAR ファイルを、クライアント ローカル エリアからサーバ ローカル エリアに トランスポートする サーバ ローカル エリアは UDTManager.setJarFileTmpPath() メソッドを使用し てユーザが定義します。デフォルトは、UNIX システムの場合は /tmp、 Windows システムの場合は C:¥temp です。 3. JAR ファイルをサーバにインストールする 4. CREATE OPAQUE TYPE SQL 文 (入力は UDTMetaData クラスから取得) を 使用して、不透明 (OPAQUE) 型をデータベースに登録する 154 IBM Informix JDBC ドライバ プログラマーズ ガイド 5. CREATE FUNCTION 文と CREATE CAST SQL 文を使用して、その不透明 (OPAQUE) 型用に準備したサポート関数とキャストを登録する サポート関数とキャストは、UDTMetaData クラスの setSupportUDR() メソッ ドと setXXXCast() メソッドを使用してユーザが定義します。 不透明 (OPAQUE) 型に対する入出力関数を指定しない場合、ドライバはデフォ ルトの関数を登録します (この機能の制限についてはリリース ノートを参照)。 6. ユーザが指定したその他の非サポート ルーチンまたはキャスト (あれば) を登録 する (入力はアプリケーションの UDTMetaData.setUDR() メソッドおよび UDTMetaData.setXXXCast() メソッド呼出しから取得) 7. SQL 不透明 (OPAQUE) 型と Java オブジェクトとの間のマッピングを作成する (sqlj.setUDTExtName()メソッドを使用) UDRManager および UDRMetaData クラスを使用すると、IBM Informix JDBC ド ライバは以下の操作を実行します。 1. 指定した JAR ファイルを取得する 2. JAR ファイルを、クライアント ローカル エリアからサーバ ローカル エリアに トランスポートする 3. JAR ファイルをサーバにインストールする 4. CREATE FUNCTION SQL 文を使用して (入力はアプリケーションの UDRMetaData.setUDR() メソッド呼出しから取得)、UDR をデータベースに登録 する UDT および UDR Manager 機能のメソッドは、以下の主な関数を実行します。 v サーバが提供するデフォルトの入出力メソッドを使用した、既存の Java クラス を使用しない Java での不透明 (OPAQUE) 型の作成 v クライアント上の既存 Java クラスの、データベース サーバの不透明 (OPAQUE) 型と UDR への変換 v Java 静的メソッドの UDR への変換 不透明 (OPAQUE) 型と UDR の作成の準備 UDT および UDR Manager 機能を使用する前に、以下のセットアップ タスクを実 行します。 v ご使用のデータベース サーバが Java をサポートしていることを確認します。 UDT および UDR Manager 機能は、Java をサポートしていない従来のサーバで は動作しません。 v ifxtools.jar ファイルまたは ifxtools_g.jar ファイルのいずれかを CLASSPATH 設 定に組み込みます。 v データベース サーバに /usr/informix というディレクトリを作成し、所有者とグ ループをユーザ informix に、アクセス権を 777 に設定します。 v データベース サーバの /etc/group ファイルに次のエントリを追加します。 informix::unique-id-number: v ドライバとデータベース サーバのリリース ノートで、このリリースにその他の 制限がないかどうかを調べます。 第 5 章 不透明 (OPAQUE) 型に関する作業 155 不透明 (OPAQUE) 型の作成手順 UDT Manager を使用して、SQLData インターフェイスを実装する既存の Java ク ラスから、Java 不透明 (OPAQUE) 型を作成できます。 Java クラスが準備されてい ない場合に、Java 不透明 (OPAQUE) 型を作成する場合にも、UDT Manager が役立 ちます。ユーザが作成する不透明 (OPAQUE) 型の特性を指定し、UDT Manager 機 能は Java クラスと Java 不透明 (OPAQUE) 型を作成します。 UDTManager クラスを使用するには、このセクションの手順に従います。 既存の Java クラスから不透明 (OPAQUE) 型を作成するには: 1. そのクラスが不透明 (OPAQUE) 型への変換のための要件を満たすことを確認し ます。 要件については、159 ページの『Java クラスに対する要件』を参照してくださ い。 2. サーバが提供するデフォルトの入出力ルーチンを使用しない場合は、入出力用の サポート UDR を記述します。 サポート UDR の記述に関する一般情報については、「IBM Informix ユーザ定 義ルーチンおよびデータ タイプ開発者ガイド」を参照してください。 3. 不透明 (OPAQUE) 型用のコードを含む JAR ファイルを保持するために、デー タベース サーバ上にデフォルトの SB 領域を作成します。 SB 領域の作成については、ご使用のデータベース サーバの「管理者ガイド」、 および「J/Foundation 開発者ガイド」を参照してください。 4. JDBC 接続をオープンします。 データベース オブジェクトが接続オブジェクトと関連付けられていることを確 認してください。データベース オブジェクトを使用しないと、ドライバは不透 明 (OPAQUE) 型を作成できません。データベース オブジェクトとの接続の作成 の詳細については、第 2 章を参照してください。 5. UDTManager オブジェクトと UDTMetaData オブジェクトをインスタンス化し ます。 UDTManager udtmgr = new UDTManager(connection); UDTMetaData mdata = new UDTMetaData(); 6. UDTMetaData オブジェクトのメソッドを呼び出して、不透明 (OPAQUE) 型に 対するプロパティを設定します。 少なくとも、SQL 名、UDT の長さ、および JAR ファイル SQL 名を指定する 必要があります。 SQL 名の説明については、160 ページの『SQL 名』を参照し てください。 また、位置合せ、暗黙的キャストと明示的キャスト、および任意のサポート UDR も指定できます。 mdata.setSQLName("circle2"); mdata.setLength(24); mdata.setAlignment(UDTMetaData.EIGHT_BYTE) mdata.setJarFileSQLName("circle2_jar"); mdata.setUDR(areamethod, "area"); mdata.setSupportUDR(input, "input", UDTMetaData.INPUT) 156 IBM Informix JDBC ドライバ プログラマーズ ガイド mdata.setSupportUDR(output, "output",UDTMetaData.OUTPUT) mdata.SetImplicitCast(com.informix.lang.IfxTypes.IFX_TYPE_ LVARCHAR, "input"); mdata.SetExplicitCast(com.informix.lang.IfxTypes.IFX_TYPE_ LVARCHAR, "output"); 7. 必要な場合、ドライバが JAR ファイルを配置するデータベース サーバ ファイ ルシステムでのパス名を指定します。 String pathname = "/work/srv93/examples"; udtmgr.setJarFileTmpPath(pathname); パスがサーバ ファイルシステムに存在することを確認してください。詳しく は、165 ページの『JAR ファイル一時パスの指定』を参照してください。 8. 不透明 (OPAQUE) 型を作成します。 udtmgr.createUDT(mdata, "Circle2.jar", "Circle2", 0); 既存のコードからの不透明 (OPAQUE) 型の作成の詳細については、166 ページの 『既存のコードからの不透明 (OPAQUE) 型の作成』を参照してください。 前述の不透明 (OPAQUE) 型の作成手順を使用する完全なコード例については、177 ページの『UDTManager を使用した、既存の Java クラスからの不透明 (OPAQUE) 型の作成』を参照してください。 既存の Java クラスを使用せずに不透明 (OPAQUE) 型を作成するには: 1. 不透明 (OPAQUE) 型用のコードを含む JAR ファイルを保持するために、デー タベース サーバ上にデフォルトの SB 領域を作成します。 SB 領域の作成については、ご使用のデータベース サーバの「管理者ガイド」、 および「J/Foundation 開発者ガイド」を参照してください。 2. JDBC 接続をオープンします。 接続オブジェクトにデータベース オブジェクトが関連付けられていることを確 認してください。詳細については、 15 ページの『第 2 章 データベースへの接 続』を参照してください。 3. UDTManager オブジェクトおよび UDTMetaData オブジェクトをインスタンス 化します。 UDTManager udtmgr = new UDTManager(connection); UDTMetaData mdata = new UDTMetaData(); 4. UDTMetaData クラスのメソッドを呼び出して、不透明 (OPAQUE) 型の特性を 指定します。 mdata.setSQLName("acircle"); mdata.setLength(24); mdata.setFieldCount(3); mdata.setFieldName(1, "x"); mdata.setFieldName(2, "y"); mdata.setFieldName(3, "radius"); mdata.setFieldType (1,com.informix.lang.IfxTypes.IFX_TYPE_INT); mdata.setFieldType (2,com.informix.lang.IfxTypes.IFX_TYPE_INT); mdata.setFieldType (3,com.informix.lang.IfxTypes.IFX_TYPE_INT); mdata.setJarFileSQLName("ACircleJar"); 第 5 章 不透明 (OPAQUE) 型に関する作業 157 不透明 (OPAQUE) 型の特性の設定の詳細については、161 ページの『不透明 (OPAQUE) 型の特性の指定』を参照してください。 5. Java ファイル、クラス ファイル、および JAR ファイルを作成します。 mdata.keepJavaFile(true); String classname = udtmgr.createUDTClass(mdata); String jarfilename = udtmgr.createJar(mdata, new String[] {classname + .class"}); 詳しくは、164 ページの『JAR ファイルとクラス ファイルの作成』を参照して ください。 6. 必要な場合、ドライバが JAR ファイルを配置するデータベース サーバ ファイ ルシステムでのパス名を指定します。 String pathname = "/work/srv93/examples"; udtmgr.setJarFileTmpPath(pathname); パスがサーバ ファイルシステムに存在することを確認してください。詳しく は、165 ページの『JAR ファイル一時パスの指定』を参照してください。 7. クラス定義をデータベース サーバに送信します。 udtmgr.createUDT(mdata, jarfilename, classname, 0); 詳細については、165 ページの『データベース サーバへのクラス定義の送信』 を参照してください。 前述の不透明 (OPAQUE) 型の作成手順を使用する完全なコード例については、184 ページの『既存の Java クラスを使用しない不透明 (OPAQUE) 型の作成』を参照し てください。 UDR の作成手順 次のセクションでは、Java クラスから UDR を作成する方法について説明します。 UDR を作成するには: 1. UDR として登録する 1 つ以上の静的メソッドを含む Java クラスを記述しま す。 詳しくは、159 ページの『Java クラスに対する要件』を参照してください。 2. UDR 用のコードを含む JAR ファイルを保持するために、データベース サーバ 上に SB 領域を作成します。 SB 領域の作成については、ご使用のデータベース サーバの「管理者ガイド」、 および「J/Foundation 開発者ガイド」を参照してください。 3. JDBC 接続をオープンします。 接続オブジェクトにデータベース オブジェクトが関連付けられていることを確 認してください。詳細については、第 2 章を参照してください。 4. UDRManager オブジェクトおよび UDRMetaData オブジェクトをインスタンス 化します。 UDRManager udrmgr = new UDRManager(myConn); UDRMetaData mdata = new UDRMetaData(); 158 IBM Informix JDBC ドライバ プログラマーズ ガイド 5. UDR として登録する静的メソッドに対して、java.lang.Reflect.Method オブジェ クトを作成します。次の例で、method1 は Group1 Java クラスの udr1(string, string) メソッドを表すインスタンスであり、method2 は Group1 Java クラスの udr2(Integer, String, String) メソッドを表すインスタンスです。 Class gp1 = Class.forName("Group1"); Method method1 = gp1.getMethod("udr1", new Class[]{String.class, String.class}); Method method2 = gp1.getMethod("udr2", new Class[]{Integer.class, String.class, String.class}); 6. UDR として登録するメソッドを指定します。 2 番目のパラメータは UDR の SQL 名を指定します。 mdata.setUDR(method1, "group1_udr1"); mdata.setUDR(method2, "group1_udr2"); 詳しくは、168 ページの『UDR の作成』を参照してください。 7. JAR ファイル SQL 名を指定します。 mdata.setJarFileSQLName("group1_jar"); 8. 必要な場合、ドライバが JAR ファイルを配置するデータベース サーバ ファイ ルシステムでのパス名を指定します。 String pathname = "/work/srv93/examples"; udrmgr.setJarFileTmpPath(pathname); パスがデータベース サーバのファイルシステムに存在することを確認してくだ さい。詳しくは、165 ページの『JAR ファイル一時パスの指定』を参照してくだ さい。 9. UDR をデータベース サーバにインストールします。 udrmgr.createUDRs(mdata, "Group1.jar", "Group1", 0); 詳細については、168 ページの『UDR の作成』を参照してください。 UDR 作成の完全なコード例については、187 ページの『UDRManager を使用した UDR の作成』を参照してください。 Java クラスに対する要件 不透明 (OPAQUE) 型に変換可能であるためには、Java クラスは以下の条件を満た す必要があります。 v クラスは java.sql.SQLData インターフェイスを実装している必要があります。例 については、172 ページの『例』を参照してください。 v クラスに別の不透明 (OPAQUE) 型が含まれる場合は、同様の方法で追加の不透 明 (OPAQUE) 型を実装し、追加の .class ファイルを既存の不透明 (OPAQUE) 型 と同じ JAR ファイルの一部としてパッケージする必要があります。 v クラスにディスティンクト (DISTINCT) 型が含まれる場合、クラスはディスティ ンクト (DISTINCT) 型に対する SQLData インターフェイスを実装するか、また はドライバによりディスティンクト (DISTINCT) 型を基本型にマップさせること ができます。詳しくは、90 ページの『ディスティンクト (DISTINCT) 型』を参 照してください。 v このクラスに複合データ型を含めることはできません。 第 5 章 不透明 (OPAQUE) 型に関する作業 159 v 既存の Java クラスから不透明 (OPAQUE) 型を作成しており、データベース サ ーバのデフォルトのサポート関数を使用している場合は、SQLData.readSQL() と SQLData.writeSQL() の SQLInput ストリームと SQLOutput ストリームを、 IfmxUDTSQLInput と IfmxUDTSQLOutput にキャストする必要があります。 この方法を示すコード例については、177 ページの『デフォルトのサポート関数 を使用した不透明 (OPAQUE) 型の作成』を参照してください。 v 不透明 (OPAQUE) 型用のすべての Java メソッドは、その不透明 (OPAQUE) 型 を定義するクラスと同じ .java ファイルにある必要があります。 以下に UDR に対するその他の制約事項を示します。 v UDR として登録するクラス メソッドは、すべて静的である必要があります。 v メソッドの引数型と戻り型は有効な Java データ型である必要があります。 v メソッドでは、java.util、java.io、java.net、java.rmi、java.sql など、JDK に含ま れるすべての基本非グラフィカル Java パッケージを使用できます。 v メソッドの引数のデータ型と戻り型は、248 ページの『UDT Manager と UDR Manager に対するデータ型マッピング』に示すデータ型マッピング表に準拠して いる必要があります。 v 以下の SQL 引数または戻り型はサポートされていません。 – 金額 (MONEY) 型 – hour to second または year to fraction(5) 以外の修飾子を持つ日時 (DATETIME) 型 – year to month または day to fraction(5) 以外の修飾子を持つ時間隔 (INTERVAL) 型 – メソッドの引数と戻り型のマッピング表に示されていない任意のデータ型。こ の表については、248 ページの『UDT Manager と UDR Manager に対するデ ータ型マッピング』を参照してください。 SQL 名 UDTMetaData クラスにあるメソッドの中には、不透明 (OPAQUE) 型、または不透 明 (OPAQUE) 型か UDR コードを含む JAR ファイルに対する SQL 名 を設定す るものがあります。SQL 名は、SQL 文で参照されるオブジェクトの名前です。例え ば、アプリケーションで次の呼出しを行うとします。 mdata.setSQLName("circle2"); SQL 文で使用される名前は、次のようになります。 CREATE TABLE tab (c circle2); 同様に、アプリケーションで JAR ファイル名を次のように設定するとします。 mdata.setJarFileSQLname("circle2_jar"); SQL で参照される JAR ファイル名は、次のようになります。 CREATE FUNCTION circle2_output (...) RETURNS circle2 EXTERNAL NAME 160 IBM Informix JDBC ドライバ プログラマーズ ガイド ’circle2_jar: circle2.fromString (...)’ LANGUAGE JAVA NOT VARIANT END FUNCTION; 重要: SQL 名にはデフォルト値はありません。setSQLname() または setJarFileSQLName() メソッドを使用して名前を指定してください。そうしな いと、SQL 例外が呼び出されます。 不透明 (OPAQUE) 型の特性の指定 以下のセクションでは、既存の Java クラスを使用しない不透明 (OPAQUE) 型の作 成に関する追加情報を示します。 既存の Java クラスを使用した不透明 (OPAQUE) 型の作成に関する詳細は、166 ページの『既存のコードからの不透明 (OPAQUE) 型 の作成』以降を参照してください。 UDTMetaData クラスのメソッドを使用して、新規不透明 (OPAQUE) 型に対する特 性を指定できます。指定可能な特性については、以降のページで説明します。これ らの設定は新規不透明 (OPAQUE) 型に対して適用されます。既存のファイルから作 成される不透明 (OPAQUE) 型の場合は、166 ページの『既存のコードからの不透明 (OPAQUE) 型の作成』を参照してください。 以下の特性を設定できます。 v 不透明 (OPAQUE) 型を定義する内部データ構造のフィールド数 v 不透明 (OPAQUE) 型を定義する内部構造の各フィールドの、データ型、名前、 スケールなどの追加特性 v 不透明 (OPAQUE) 型の長さ v 不透明 (OPAQUE) 型の位置合せ v 不透明 (OPAQUE) 型と JAR ファイルの SQL 名 v 生成される Java クラスの名前 v 生成された .java ファイルを保持するかどうか フィールド カウントの指定 setFieldCount() メソッドは、不透明 (OPAQUE) 型を定義する内部データ構造のフ ィールド数を指定します。 public void setFieldCount(int fieldCount) throws SQLException 追加のフィールド特性の指定 以下のメソッドは、内部データ構造のフィールドに対する追加特性を設定します。 public public public public void void void void setFieldName (int field, String name) throws SQLException setFieldType (int field, int ifxtype) throws SQLException setFieldTypeName(int field, String sqltypename) throws SQLException setFieldLength(int field, int length) throws SQLException field パラメータは、ドライバが特性を設定または取得するフィールドを示します。 最初のフィールドは 1、2 番目のフィールドは 2、などです。 setFieldName() を使用して指定する名前は Java クラス ファイルに表示されます。 次の例は、最初のフィールド名を IMAGE に設定します。 mdata.setFieldName(1, "IMAGE"); 第 5 章 不透明 (OPAQUE) 型に関する作業 161 setFieldType() メソッドは、ファイル com.informix.lang.IfxTypes からの定数を使用 して、フィールドのデータ型を設定します。詳しくは、250 ページの『フィールド 型に対するマッピング』を参照してください。次の例は、3 番目のフィールドの値 に対して文字 (CHAR) 型を指定します。 mdata.setFieldType(3, com.informix.lang.IfxTypes.IFX_TYPE_CHAR); setFieldTypeName() メソッドは、SQL データ型名を使用して、フィールドのデータ 型を設定します。 mdata.setFieldTypeName(1, "IMAGE_UDT"); このメソッドは不透明 (OPAQUE) 型およびディスティンクト (DISTINCT) 型に対 してのみ有効です。その他のデータ型の場合、ドライバはその情報を無視します。 length パラメータの意味は、フィールドのデータ型に応じて以下のようになりま す。 文字型 文字単位での最大長 日時 (DATETIME) 型 符号化された長さ 時間隔 (INTERVAL) 型 符号化された長さ その他のデータ型、 またはデータ型未指定 ドライバはこの情報を無視 符号化された長さに対する可能値は、JDBC 2.20 仕様で指定されている値、つまり hour to second、year to second、year to fraction(1)、および year to fraction(2) から year to fraction(5) までです。 次の例は、不透明 (OPAQUE) 型の 3 番目の (可変長文字 (VARCHAR) 型) フィー ルドが 24 文字までしか格納できないことを指定します。 mdata.setFieldLength(3, 24); 長さの指定 setLength() メソッドは、不透明 (OPAQUE) 型の全長を指定します。 public void setLength(int length) throws SQLException 既存の Java クラスから不透明 (OPAQUE) 型を作成しており、長さを指定しない場 合は、ドライバは可変長の不透明 (OPAQUE) 型を作成します。既存の Java クラス を使用せずに不透明 (OPAQUE) 型を作成している場合は、長さを指定する必要があ ります。この場合、UDT Manager は固定長の不透明 (OPAQUE) 型しか作成しませ ん。 位置合せの指定 setAlignment() メソッドは、不透明 (OPAQUE) 型の位置合せを指定します。 public void setAlignment(int alignment) alignment パラメータは、次のセクションで示される位置合せの値の 1 つです。位 置合せを指定しない場合、データベース サーバは 4 バイト境界で不透明 (OPAQUE) 型を位置合せします。 162 IBM Informix JDBC ドライバ プログラマーズ ガイド 位置合せの値 次の表に位置合せの値を示します。 値 定数 構造の開始 位置合せに 使用する境界 1 SINGLE_BYTE 1 バイト量 1 バイト 2 TWO_BYTE 2 バイト量 (小桁整数 (SMALLINT) 型など) 2 バイト 4 FOUR_BYTE 4 バイト量 (実数 (FLOAT) 型、符号なし整数 (UNSIGNED INT) 型など) 4 バイト 8 EIGHT_BYTE 8 バイト量 8 バイト SQL 名の指定 setSQLName() メソッドおよび setJarFileSQLName() メソッドを使用して SQL 名 を指定します。 public void setSQLName(String name) throws SQLException public void setJarFileSQLName(String name) throws SQLException デフォルトでは、ドライバは、setSQLName() メソッドを使用して設定した名前 を、UDTManager.createUDTClass() メソッドおよび UDTManager.createJar() メソ ッドを呼び出したときに生成される Java クラスと JAR ファイルのファイル名とし て使用します。例えば、setSQLName("circle") を呼び出し、次に createUDTCclass() と createJar() を呼び出した場合、生成されるクラス ファイル 名は circle.class になり、JAR ファイル名は circle.jar になります。 setClassName() メソッドを呼び出すことにより、デフォルト以外の Java クラス フ ァイル名を指定できます。 JAR ファイル SQL 名は、ドライバが UDR の登録に使用する SQL CREATE FUNCTION 文で参照される名前です。 重要: JAR ファイル SQL 名は SQL 文での JAR ファイルの名前です。その JAR ファイルの内容には関係ありません。 Java クラス名の指定 Java クラス名を指定するには、setClassName() を使用します。 public void setClassName(String name)throws SQLException setClassName() を使用してクラス名を設定しない場合、ドライバは、不透明 (OPAQUE) 型の SQL 名 (setSQLName() を使用して設定) を、createUDTCclass() メソッドで生成される Java クラスの名前と .class ファイルのファイル名として使 用します。 Java ソース ファイル保存の指定 keepJavaFile() を使用して、.java ソース ファイルを保存するかどうかを指定しま す。 public void keepJavaFile(boolean value) 第 5 章 不透明 (OPAQUE) 型に関する作業 163 value パラメータは、createUDTClass() メソッドが、新規不透明 (OPAQUE) 型に対 する Java クラス ファイルを作成するときに生成する .java ファイルを保存するか どうかを示します。デフォルトではファイルを削除します。次の例は、.java ファイ ルの保持を指定しています。 mdata.keepJavaFile(true); JAR ファイルとクラス ファイルの作成 UDTMetaData メソッドを使用して不透明 (OPAQUE) 型の特性を指定したら、 UDTManager クラスのメソッドを使用して、不透明 (OPAQUE) 型、およびそのク ラス ファイルと JAR ファイルを、次のような順序で作成できます。 1. UDTManager オブジェクトをインスタンス化します。 コンストラクタは次のように定義されます。 public UDTManager(Connection conn) throws SQLException 2. createUDTClass() メソッドを使用して、.class ファイルと .java ファイルを作成 します。 3. createJar() メソッドを使用して .jar ファイルを作成します。 4. createUDT() メソッドを使用して不透明 (OPAQUE) 型を作成します。 .class ファイルと .java ファイルの作成 createUDTClass() メソッドのシグニチャは、次のとおりです。 public String createUDTClass(UDTMetaData mdata) throws SQLException createUDTClass() メソッドを使用すると、ドライバがアプリケーションに代わって 以下のすべての操作を実行します。 1. UDTMetaData.setClassName() メソッドで指定した名前で Java クラスを作成し ます。 クラス名が指定されなかった場合、ドライバは UDTMetaData.setSQLName() メ ソッドで指定した名前を使用します。 2. Java クラス コードを .java ファイルに書き込んでから、そのファイルを .class ファイルにコンパイルします。 3. 新規に作成されたクラスの名前をアプリケーションに戻します。 UDTMetaData.keepJavaFile() メソッドを呼び出して TRUE を指定した場合、ドライ バは生成された .java ファイルを保存します。デフォルトでは .java ファイルは削 除されます。 アプリケーションが createUDTClass() メソッドを呼び出すのは、既存のファイルか ら不透明 (OPAQUE) 型を生成するためではなく、新規 .class ファイルおよび .java ファイルを作成して不透明 (OPAQUE) 型を定義するためのみに制限する必要があり ます。 .jar ファイルの作成 createJar() メソッドは、classnames リストで指定するクラス ファイルをコンパイル します。リスト内のファイルには .class 拡張子が付いている必要があります。 164 IBM Informix JDBC ドライバ プログラマーズ ガイド public String createJar(UDTMetaData mdata, String[] classnames) throws SQLException; ドライバは、sqlname.jar (sqlname は UDTMetaData.setSQLName() を呼び出して指 定した名前) という名前の JAR ファイルを作成し、そのファイル名をアプリケーシ ョンに戻します。 データベース サーバへのクラス定義の送信 JAR ファイルの作成後、UDTManager.createUDT()メソッドを使用して、データベ ース サーバにクラス定義を送信することにより不透明 (OPAQUE) 型を作成しま す。 public void createUDT(UDTMetaData mdata, String jarfile, String classname, int deploy) throws SQLException; jarfile パラメータは、不透明 (OPAQUE) 型のクラス定義を含む JAR (.jar) ファイ ルのパス名です。デフォルトでは、java.io パッケージ内のクラスは、相対パス名を システム プロパティ user.dir で指定された現行ユーザ ディレクトリを基準にして 解決します。このディレクトリは、通常 Java 仮想マシンが起動されたディレクトリ です。 絶対パス名を使用する場合は、CLASSPATH 設定にファイル名が含まれてい る必要があります。 classname パラメータは、不透明 (OPAQUE) 型を実装するクラスの名前です。 アプリケーションが setClassName() を呼び出さない場合、不透明 (OPAQUE) 型の SQL 名はデフォルトでクラス名になります。 UDTMetaData.setSQLName() メソッ ドを呼び出すことにより SQL 名を指定できます。 重要: アプリケーションがトランザクション内で createUDT() を呼び出す場合、ま たはデータベースが ANSI かロギング可能になっている場合は、追加のガイ ドラインが適用されます。詳しくは、172 ページの『トランザクションでの 実行』を参照してください。 配置記述子の動作の指定 UDTManager および UDRManager メソッドでは、deploy パラメータは、JAR フ ァイルに配置記述子がある場合に install_actions を実行するかどうかを示します。 undeploy パラメータは、remove_actions を実行するかどうかを示します。 0 install_actions または remove_actions を実行する。 非ゼロ install_actions も remove_actions も実行しない。 配置記述子には、JAR ファイル内の UDR の作成と削除を行う SQL 文を組み込む ことができます。配置記述子の詳細については、「J/Foundation 開発者ガイド」お よび SQLJ 仕様を参照してください。 JAR ファイル一時パスの指定 ドライバは不透明 (OPAQUE) 型または UDR に対する JAR ファイルを送信すると き、そのファイルをデフォルトで /tmp (UNIX の場合) または c:¥temp (Windows の場合) に配置します。 UDTManager または UDRManager のいずれかのクラス で setJarTmpPath() メソッドを呼び出すことにより、別のパス名を指定できます。 public void setJarTmpPath(String path) throws SQLException 第 5 章 不透明 (OPAQUE) 型に関する作業 165 UDTManager または UDRManager のオブジェクトである createUDT() または createUDR() を呼び出す前の任意の時点で、このメソッドを呼び出すことができま す。 path パラメータは絶対パス名である必要があり、そのパスがサーバ ファイル システム上に存在することを確認する必要があります。 既存のコードからの不透明 (OPAQUE) 型の作成 前のページでは、既存の Java クラスを使用せずに新規不透明 (OPAQUE) 型を作成 するために使用するメソッドについて説明しています。 既存の Java コードから不 透明 (OPAQUE) 型を作成するときは、SQL 名、JAR ファイル SQL 名、その不透 明 (OPAQUE) 型に含まれるサポート UDR (あれば) と追加の非サポート UDR を 指定します。 (SQL 名の説明については、160 ページの『SQL 名』を参照してくだ さい。) 長さ、位置合せ、および暗黙的キャストと明示的キャストも指定できま す。 既存のコードから不透明 (OPAQUE) 型を作成するには、以下のメソッドを使用しま す。 v UDTMetaData.setSQLName() を使用して、SQL 文で参照される不透明 (OPAQUE) 型の SQL 名を指定 v UDTMetaData.setSupportUDR() を、不透明 (OPAQUE) 型の各サポート UDR に 対して使用 サポート UDR は、入出力、送受信などです。 v UDTMetaData.setUDR() を、不透明 (OPAQUE) 型の各非サポート UDR に対し て使用 v UDTMetaData.setJarFileSQLName() を使用して、JAR ファイルに対する SQL 名 を指定 v UDTMetaData.setImplicitCast() または UDTMetaData.setExplicitCast() を使用し て、それぞれのキャストを指定 v 不透明 (OPAQUE) 型が固定長 (ドライバのデフォルトは可変長) である場合は、 UDTMetaData.setLength() を使用 v UDTMetaData.setAlignment() を使用して、不透明 (OPAQUE) 型が位置合せされ るバイト境界を指定 (データベース サーバのデフォルトである 4 バイト境界を 使用しない場合にのみ必要) v UDTManager.createJar() を使用して、まだ JAR (.jar) ファイルがない場合にそ れを作成 v UDTManager.createUDT() を使用して、不透明 (OPAQUE) 型を作成 さらに、setXXXCast()、setSupportUDR()、および setUDR() の各メソッドは、既存 のコードから不透明 (OPAQUE) 型を作成する場合にのみ使用します。 public void setImplicitCast(int ifxtype, String methodsqlname) throws SQLException public void setExplicitCast(int ifxtype, String methodsqlname) throws SQLException public void setSupportUDR(Method method, String sqlname, int type) throws SQLException public void setUDR(Method method, String sqlname) throws SQLException 166 IBM Informix JDBC ドライバ プログラマーズ ガイド setXXXCast() メソッドの使用 setXXXCast() メソッドは、不透明 (OPAQUE) 型から指定されたデータ型にデータ を変換する暗黙的キャストまたは明示的キャストを指定します。 ifxtype パラメータは、クラス com.informix.lang.IfxTypes からの型コードです。デ ータベース サーバにおける ifxtype パラメータと SQL データ型との間のデータ型 マッピングは、249 ページの『キャストに対するマッピング』で詳細に説明されて います。methodsqlname パラメータは、キャストを実装する Java メソッドの SQL 名です。 次の例では、SQL 名が circle2_input の Java メソッドにより実装された暗黙的キャ ストを設定しています。 setImplicitCast(com.informix.lang.IfxTypes.IFX_TYPE_LVARCHAR, "circle2_input"); 次の例では、SQL 名が circle_output の Java メソッドにより実装された明示的キ ャストを設定しています。 setExplicitCast(com.informix.lang.IfxTypes.IFX_TYPE_LVARCHAR, "circle2_output"); 次の例では、circle2 不透明 (OPAQUE) 型の整数への変換のための明示的キャスト を設定しています。 setExplicitCast(com.informix.lang.IfxTypes.IFX_TYPE_INT, "circle2_to_int"); setSupportUDR() および setUDR() の使用 setSupportUDR() メソッドは、不透明 (OPAQUE) 型に対するサポート UDR とし て登録される、既存 Java クラス内の Java メソッドを指定します。 method パラメータは、不透明 (OPAQUE) 型に対する Java サポート UDR として データベース サーバに登録される、java.lang.reflect.Method のオブジェクトを指定 します。 サポート UDR は、入力、出力、送信、受信などです (詳細は、「IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド」を参照)。 sqlname パラメータは、メソッドの SQL 名を指定します。詳細については、160 ペ ージの『SQL 名』を参照してください。 type パラメータは、次のようなサポート UDR の種類を指定します。 UDTMetaData.INPUT UDTMetaData.OUTPUT UDTMetaData.SEND UDTMetaData.RECEIVE UDTMetaData.IMPORT UDTMetaData.EXPORT UDTMetaData.BINARYIMPORT UDTMetaData.BINARYEXPORT 既存のコードから不透明 (OPAQUE) 型を作成する場合の段階的な情報については、 156 ページの 説明を参照してください。 ヒント: SQLData インターフェイス内のメソッドを登録する必要はありません。例 えば、SQLData.getSQLTypeName()、SQLData.readSQL()、または SQLData.writeSQL() を登録する必要はありません。 第 5 章 不透明 (OPAQUE) 型に関する作業 167 他の UDR を指定するには、168 ページの『UDR の作成』で説明されているよう に、setUDR() を使用します。 不透明 (OPAQUE) 型と JAR ファイルの除去 以下のメソッドを使用して、不透明 (OPAQUE) 型とその JAR ファイルを除去でき ます。 public static void removeUDT(String sqlname) throws SQLException public static void removeJar(String jarfilesqlname, int undeploy) throws SQLException removeUDT() メソッドは、不透明 (OPAQUE) 型を、そのすべてのキャストと UDR とともに、データベース サーバから除去します。他の不透明 (OPAQUE) 型や UDR が同じ JAR ファイルを使用している可能性があるため、このメソッド自体は JAR ファイルを除去しません。 重要: アプリケーションがトランザクション内で removeUDT() を呼び出す場合、ま たはデータベースが ANSI かロギング可能になっている場合は、追加のガイ ドラインが適用されます。詳しくは、172 ページの『トランザクションでの 実行』を参照してください。 removeJar() メソッドは、システム カタログから JAR ファイルを削除します。 jarfilesqlname パラメータは、setJarFileSQLName() メソッドで指定した名前です。 undeploy パラメータについては、165 ページの『配置記述子の動作の指定』を参照 してください。 重要: removeJar() を呼び出す前に、まず、その JAR ファイルに依存するすべての 関数とプロシジャを除去する必要があります。そうしないと、データベース サーバはファイルを削除できません。 UDR の作成 UDR Manager を使用したデータベース サーバでの UDR の作成には、次のような 作業が含まれます。 v UDR のコーディングと、コードの JAR ファイルへのパッケージ化 UDR のコーディングの詳細については、「J/Foundation 開発者ガイド」を参照し てください。 v UDR のコードを含む JAR ファイルを保持するために、データベース サーバ上 にデフォルト SB 領域を作成 SB 領域の作成については、ご使用のデータベース サーバの「管理者ガイド」、 および「J/Foundation 開発者ガイド」を参照してください。 v UDRMetaData クラスのメソッドを呼び出して、IBM Informix JDBC ドライバが UDR をデータベース サーバに登録するために必要な情報を指定 v 必要な場合、ドライバが JAR ファイルを配置するデータベース サーバ ファイ ルシステム内のパス名の指定 v UDR のサーバへのインストール 168 IBM Informix JDBC ドライバ プログラマーズ ガイド C 言語不透明 (OPAQUE) 型の UDR の作成はサポートされていません。不透明 (OPAQUE) 型は Java で記述される必要があります。 ドライバが登録する UDR を指定するには、UDRMetaData の次のメソッドを使用 します。 public void setUDR(Method method, String sqlname) throws SQLException method パラメータは、データベース サーバに Java UDR として登録される java.lang.Reflect.Method のオブジェクトを指定します。 sqlname パラメータは、 SQL 文で使用されるメソッドの名前です。 登録する UDR を指定したら、UDRMetaData.setJarFileSQLName() を使用して JAR ファイルの SQL 名を設定し、次のように UDRManager.createUDRs() メソッ ドを使用して UDR をデータベース サーバにインストールできます。 public void createUDRs(UDRMetaData mdata, String jarfile, String classname, int deploy) throws SQLException jarfile パラメータは、Java メソッド定義を含むクライアント サイドの JAR ファイ ルの絶対パス名または相対パス名です。 絶対パス名を使用する場合は、その JAR ファイル名が CLASSPATH 設定に含まれている必要があります。 classname パラメータは、データベース サーバに UDR として登録するメソッドを 含む Java クラスの名前です。 Java メソッドを準備するための要件については、 158 ページで説明されています。 deploy パラメータについては、165 ページの『配置記述子の動作の指定』を参照し てください。 createUDRs() メソッドを使用すると、ドライバがアプリケーションに代わって以下 のすべての手順を実行します。 1. 最初のパラメータで指定された JAR ファイルを取得する。 2. JAR ファイルを、クライアント ローカル エリアからサーバ ローカル エリアに トランスポートする。 3. UDRMetaData オブジェクトで指定された UDR を登録する (UDRMetaData.setUDR() への 1 回以上の呼出しにより設定)。 4. JAR ファイルをインストールし、サーバに UDR を作成する。 createUDRs() の実行後、アプリケーションは SQL 文でそれらの UDR を使用でき ます。 重要: アプリケーションがトランザクション内で createUDRs() を呼び出す場合、ま たはデータベースが ANSI かロギング可能になっている場合は、追加のガイ ドラインが適用されます。詳しくは、172 ページの『トランザクションでの 実行』を参照してください。 UDR と JAR ファイルの除去 次のメソッドを使用して UDR を除去できます。 public void removeUDR(String sqlname) throws SQLException public void removeJar(String jarfilesqlname, int undeploy) throws SQLException 第 5 章 不透明 (OPAQUE) 型に関する作業 169 ヒント: removeUDR() メソッドはサーバから UDR を除去しますが、他の不透明 (OPAQUE) 型や UDR が同じ JAR ファイルを使用している可能性がある ため、JAR ファイルは除去しません。 removeJar() メソッドについては、168 ページの『不透明 (OPAQUE) 型と JAR フ ァイルの除去』で説明されています。 オーバーロードされた UDR の除去 オーバーロードされた UDR を除去するには、追加のパラメータを指定して removeUDR() メソッドを使用します。 public void removeUDR(String sqlname, Class[] methodparams) throws SQLException methodparams パラメータは、UDR の各パラメータのデータ型を指定します。パラ メータがないことを示すには、NULL を指定します。例えば、print() という UDR が、2 つの追加メソッド シグニチャでオーバーロードされている場合を想定しま す。 Java メソッド シグニチャ 対応する SQL 名 void print() print1 void print (String x, String y, int r) print2 void print(int a, int b) print3 3 つの UDR すべてを除去するコードは、次のとおりです。 udrmgr.removeUDR("print1", null ); udrmgr.removeUDR("print2", new Class[] {String.class, String.class, int.class} ); udrmgr.removeUDR("print3", new Class[] {int.class, int.class} ); 不透明 (OPAQUE) 型と UDR に関する情報の取得 UDTMetaData および UDRMetaData クラスの setXXX() メソッドの多くには、既 存の不透明 (OPAQUE) 型と UDR の特性を取得するための、並列した getXXX() メソッドがあります。 UDTMetaData クラスの getXXX() メソッド 次の表に、UDTMetaData クラスで使用可能な getXXX() メソッドを要約します。 field パラメータに対して、1 は内部データ構造の最初のフィールドを、2 は 2 番目 のフィールドを指定します。他の値についても同様です。SQL 名の詳細について は、160 ページの『SQL 名』を参照してください。 取得される情報 メソッド シグニチャ 注 内部データ構造内のフィール public int getFieldCount() ドの数 フィールドが存在しない場合は 0 を戻し ます。 内部データ構造内のフィール public String getFieldName ドの名前 int field) throws SQLException 名前が存在しない場合は NULL を戻しま す。 170 IBM Informix JDBC ドライバ プログラマーズ ガイド 取得される情報 メソッド シグニチャ 注 内部データ構造内のフィール public int getFieldType ドのデータ型コード (int field) throws SQLException データ型コードは、クラス com.informix.lang.IfxTypes から取得され ます。データ型が存在しない場合は -1 を戻します。 内部データ構造内のフィール public String getFieldTypeName ドのデータ型名 (int field) throws SQLException 名前が存在しない場合は NULL を戻しま す。 文字 (CHARACTER) 型の場 public int getFieldLength 合: フィールド内の最大文字 (int field) throws SQLException 数 日時 (DATETIME) 型または 時間隔 (INTERVAL) 型の場 合: 符号化された修飾子 長さが設定されていない場合は -1を戻し ます。 不透明 (OPAQUE) 型の SQL 名 public String getSQLName() 名前が設定されていない場合は NULL を 戻します。 JAR ファイルの SQL 名 public String getJarFileSQLName() 名前が設定されていない場合は NULL を 戻します。 不透明 (OPAQUE) 型に対す public String getClassName() る Java クラスの名前 setClassName() を使用してクラス名が設 定されていない場合は、sqlname が戻さ れます (これがデフォルトです)。 setSQLName() を使用して SQL 名が設定 されていない場合は、NULL を戻しま す。 固定長の不透明 (OPAQUE) 型の長さ 長さが設定されていない場合は -1を戻し ます。 public int getLength() 不透明 (OPAQUE) 型の位置 public int getAlignment() 合せ 位置合せが設定されていない場合は、-1 を戻します。 位置合せコードについては、163 ページ の『位置合せの値』を参照してくださ い。 setSupportUDR() を使用して public Method[] getSupportUDRs() サポート UDR として指定 された Method オブジェク トの配列 サポート UDR の詳細については、166 ページの『既存のコードからの不透明 (OPAQUE) 型の作成』の setSupportUDR() の説明を参照してくださ い。サポート UDR が指定されていない 場合は、NULL を戻します。 setSupportUDR() を使用して public String getSupportUDRSQLName (Method method) サポート UDR として指定 throws SQLException された Java メソッドの SQL 名 名前が設定されていない場合は NULL を 戻します。 UDRMetaData クラスの getXXX() メソッド UDR に関する情報を取得するには、次の表にあるメソッドを使用します。 第 5 章 不透明 (OPAQUE) 型に関する作業 171 取得される情報 メソッド シグニチャ 注 不透明 (OPAQUE) 型に対する public Method[] getUDRs() UDR として指定された java.lang.Method.Reflect メソ ッドの配列 不透明 (OPAQUE) 型に対する UDR を指 定するには、UDTMetaData.setUDR() メソ ッドを呼び出します。 UDR が指定されて いない場合は、NULL を戻します。 Java メソッドの SQL 名 UDR Method オブジェクトに対する SQL 名が指定されていない場合は、NULL を戻 します。 public String getUDRSQLName(Method method) throws SQLException トランザクションでの実行 データベースが ANSI 標準準拠であるか、またはロギングが有効になっている場 合、アプリケーションがまだトランザクションに入っていなければ、ドライバは、 サーバ上に不透明 (OPAQUE) 型と UDR を作成するための SQL 文を、単一トラン ザクション内で実行します。これは、すべてのステップが成功するか、すべてのス テップが失敗するかのいずれかであることを意味します。いずれかの時点で不透明 (OPAQUE) 型または UDR の作成が失敗した場合、ドライバはトランザクションを ロールバックし、SQLException を呼び出します。 UDTManager.createUDT() または UDRManager.createUDRs() メソッドが呼び出さ れたときにアプリケーションがすでにトランザクションに入っている場合、SQL 文 は既存のトランザクション内で実行されます。これは、不透明 (OPAQUE) 型または UDR の作成中にドライバがアプリケーションに SQLException を戻した場合は、デ ータベースの整合性を確保するために、アプリケーションがトランザクションをロ ールバックする必要があることを意味します。そうしないと、不透明 (OPAQUE) 型、そのキャストの一部、または UDR が、データベースに残されてしまう可能性 があります。 例 この章の残りの部分には、不透明 (OPAQUE) 型と UDR の作成例と使用例が記載 されています。以下の例が含まれています。 v 173 ページの『クラス定義』 v 174 ページの『データの挿入』 v 174 ページの『データの抽出』 v 175 ページの『不透明 (OPAQUE) 型内のスマート ラージ オブジェクトの使 用』 v 177 ページの『UDTManager を使用した、既存の Java クラスからの不透明 (OPAQUE) 型の作成』 v 187 ページの『UDRManager を使用した UDR の作成』 最初の 4 つの例は、JDBC ドライバ ソフトウェアとともに demo/udt-distinct ディ レクトリにリリースされています。後の 2 つは demo/tools/udtudrmgr ディレクト リにあります。ファイルの説明については、各ディレクトリにある README ファ イルを参照してください。 172 IBM Informix JDBC ドライバ プログラマーズ ガイド クラス定義 C 不透明 (OPAQUE) 型に対するクラス (次の例の charattrUDT) は、SQLData イ ンターフェイスを実装する必要があります。 import java.sql.*; import com.informix.jdbc.*; /* * C struct of charattr_udt: * * typedef struct charattr_type * { * char chr1[4+1]; * mi_boolean bold; // mi_boolean (1 byte) * mi_smallint fontsize; // mi_smallint (2 bytes) * } * charattr; * * typedef charattr charattr_udt; * */ public class charattrUDT implements SQLData { private String sql_type = "charattr_udt"; // an ASCII character/a multibyte character, and is null-terminated. public String chr1; // Is the character in boldface? public boolean bold; // font size of the character public short fontsize; public charattrUDT() { } public charattrUDT(String chr1, boolean bold, short fontsize) { this.chr1 = chr1; this.bold = bold; this.fontsize = fontsize; } public String getSQLTypeName() { return sql_type; } // reads a stream of data values and builds a Java object public void readSQL(SQLInput stream, String type) throws SQLException { sql_type = type; chr1 = ((IfmxUDTSQLInput)stream).readString(5); bold = stream.readBoolean(); fontsize = stream.readShort(); } // writes a sequence of values from a Java object to a stream public void writeSQL(SQLOutput stream) throws SQLException { ((IfmxUDTSQLOutput)stream).writeString(chr1, 5); stream.writeBoolean(bold); stream.writeShort(fontsize); } // overides Object.equals() public boolean equals(Object b) { return (chr1.equals(((charattrUDT)b).chr1) && bold == ((charattrUDT)b).bold && fontsize == ((charattrUDT)b).fontsize); } public String toString() 第 5 章 不透明 (OPAQUE) 型に関する作業 173 { return "chr1=" + chr1 + " bold=" + bold + " fontsize=" + fontsize; } } JDBC アプリケーション内では、カスタム型マップにより SQL データ型名 charattr_udt を charattrUDT クラスにマップする必要があります。 java.util.Map customtypemap = conn.getTypeMap(); if (customtypemap == null) { System.out.println("¥n***ERROR: typemap is null!"); return; } customtypemap.put("charattr_udt", Class.forName("charattrUDT")); データの挿入 不透明 (OPAQUE) 型を、オリジナルの型またはキャスト型のいずれかとして挿入で きます。次の例は、オリジナルの型を使用して不透明 (OPAQUE) 型データを挿入す る方法を示しています。 String s = "insert into charattr_tab (int_col, charattr_col) values (?, ?)"; System.out.println(s); pstmt = conn.prepareStatement(s); ... charattrUDT charattr = new charattrUDT(); charattr.chr1 = "a"; charattr.bold = true; charattr.fontsize = (short)1; pstmt.setInt(1, 1); System.out.println("setInt...ok"); pstmt.setObject(2, charattr); System.out.println("setObject(charattrUDT)...ok"); pstmt.executeUpdate(); キャスト関数が定義されており、オリジナルの型ではなくキャスト型としてデータ を挿入する場合は、そのキャスト型に対応する setXXX() メソッドを呼び出す必要 があります。例えば、文字 (CHAR) 型またはラージ可変長文字 (LVARCHAR) 型を charattrUDT 列にキャストする関数を定義した場合、次のように setString() メソッ ドを使用してデータを挿入できます。 // Insert into UDT column using setString(int,String) and Java String object. String s = "insert into charattr_tab " + "(decimal_col, date_col, charattr_col, float_col) " + "values (?,?,?,?)"; writeOutputFile(s); PreparedStatement pstmt = myConn.prepareStatement(s); ... String strObj = "(A, f, 18)"; pstmt.setString(3, strObj); ... データの抽出 Informix 不透明 (OPAQUE) 型を抽出するには、ResultSet.getObject() を使用する必 要があります。 IBM Informix JDBC ドライバは、ユーザが指定するカスタム型マ 174 IBM Informix JDBC ドライバ プログラマーズ ガイド ップに応じてデータを Java オブジェクトに変換します。 前の charattrUDT デー タ型の例を使用して、次の例のように不透明 (OPAQUE) 型のデータを取り出すこと ができます。 String s = "select int_col, charattr_col from charattr_tab order by 1"; System.out.println(s); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); System.out.println("execute...ok"); System.out.println("Fetching data ..."); int curRow = 0; while (rs.next()) { curRow++; System.out.println("currentrow=" + curRow + " : "); int intret = rs.getInt("int_col"); System.out.println(" int_col " + intret); charattrUDT charattrret = (charattrUDT)rs.getObject("charattr_col"); System.out.print(" charattr_col "); if (curRow == 2 || curRow == 6) { if (rs.wasNull()) System.out.println("<null>"); else System.out.println("***ERROR: " + charattrret); } else System.out.println(charattrret+""); } //while System.out.println("total rows expected: " + curRow); stmt.close(); 不透明 (OPAQUE) 型内のスマート ラージ オブジェクトの使用 ラージ オブジェクトは、通常 Informix の拡張クラスを使用して、データベース サ ーバ上の不透明 (OPAQUE) 型のコンテキスト外に作成しますが、スマート ラージ オブジェクトを不透明 (OPAQUE) 型内のデータ メンバにすることもできます。 ス マート ラージ オブジェクトの詳細については、118 ページの『スマート ラージ オブジェクト データ型』を参照してください。 ラージ オブジェクトは不透明 (OPAQUE) 型内の IfxLocator オブジェクトとして 格納されます。不透明 (OPAQUE) 型を内部的に定義する C 言語の構造内では、ラ ージ オブジェクトは MI_LO_HANDLE という型のロケータ ポインタを介して参照 されます。オブジェクトは IfxSmartBlob クラスが提供するメソッドを使用して作 成され、これらのメソッドから取得されたラージ オブジェクト ハンドルが、不透 明 (OPAQUE) 型内のデータ メンバになります。次の例に示すように、BLOB 型と CLOB 型のオブジェクトは両方とも同じラージ オブジェクト ハンドルを使用しま す。 import java.sql.*; import com.informix.jdbc.*; /* * C struct of large_bin_udt: * * typedef struct LARGE_BIN_TYPE * { * MI_LO_HANDLE lb_handle; // handle to large object (72 bytes) 第 5 章 不透明 (OPAQUE) 型に関する作業 175 * } * large_bin_udt; * */ public class largebinUDT implements SQLData { private String sql_type = "large_bin_udt"; public Clob lb_handle; public largebinUDT() { } public largebinUDT(Clob clob) { lb_handle = clob; } public String getSQLTypeName() { return sql_type; } // reads a stream of data values and builds a Java object public void readSQL(SQLInput stream, String type) throws SQLException { sql_type = type; lb_handle = stream.readClob(); } // writes a sequence of values from a Java object to a stream public void writeSQL(SQLOutput stream) throws SQLException { stream.writeClob(lb_handle); } } JDBC アプリケーションでは、IfxSmartBlob クラスが提供するメソッドを使用して MI_LO_HANDLE オブジェクトを作成します。 String s = "insert into largebin_tab (int_col, largebin_col, lvc_col) " + "values (?,?,?)"; System.out.println(s); pstmt = conn.prepareStatement(s); ... // create a large object using IfxSmartBlob’s methods String filename = "lbin_in1.dat"; File file = new File(filename); int fileLength = (int) file.length(); FileInputStream fin = new FileInputStream(file); IfxLobDescriptor loDesc = new IfxLobDescriptor(conn); System.out.println("create large object descriptor...ok"); IfxLocator loPtr = new IfxLocator(); IfxSmartBlob smb = new IfxSmartBlob((IfxConnection)conn); int loFd = smb.IfxLoCreate(loDesc, 8, loPtr); System.out.println("create large object...ok"); int n = smb.IfxLoWrite(loFd, fin, fileLength); System.out.println("write file content into large object...ok"); pstmt.setInt(1, 1); System.out.println("setInt...ok"); // initialize largebin object using the large object created // above, before doing setObject for the large_bin_udt column. largebinUDT largebinObj = new largebinUDT(); largebinObj.lb_handle = new IfxCblob(loPtr); pstmt.setObject(2, largebinObj); 176 IBM Informix JDBC ドライバ プログラマーズ ガイド System.out.println("setObject(largebinUDT)...ok"); pstmt.setString(3, "Hong Kong"); System.out.println("setString...ok"); pstmt.executeUpdate(); System.out.println("execute...ok"); // close/release large object smb.IfxLoClose(loFd); System.out.println("close large object...ok"); smb.IfxLoRelease(loPtr); System.out.println("release large object...ok"); 詳細については、118 ページの『スマート ラージ オブジェクト データ型』を参照 してください。 UDTManager を使用した、既存の Java クラスからの不透明 (OPAQUE) 型の作成 次の例は、アプリケーションで UDTManager クラスと UDTMetaData クラスを使 用して、クライアント (データベース サーバからアクセス不能) 上の既存の Java クラスを、データベース サーバの SQL 不透明 (OPAQUE) 型に変換する方法を示 しています。 デフォルトのサポート関数を使用した不透明 (OPAQUE) 型の作成 次の例は、既存の Java クラスと、データベース サーバが提供するデフォルトのサ ポート関数を使用して、Circle という不透明 (OPAQUE) 型を作成します。 */ import java.sql.*; import com.informix.jdbc.IfmxUDTSQLInput; import com.informix.jdbc.IfmxUDTSQLOutput; public class Circle implements SQLData { private static double PI = 3.14159; double x; double y; double radius; // x coordinate // y coordinate private String type = "circle"; public String getSQLTypeName() { return type; } public void readSQL(SQLInput stream, String typeName) throws SQLException { // To be able to use the DEFAULT support functions supplied // by the server, you must cast the stream to IfmxUDTSQLInput. // (Server requirement) IfmxUDTSQLInput in = (IfmxUDTSQLInput) stream; x = in.readDouble(); y = in.readDouble(); radius = in.readDouble(); } public void writeSQL(SQLOutput stream) throws SQLException { 第 5 章 不透明 (OPAQUE) 型に関する作業 177 // To be able to use the DEFAULT support functions supplied // by the server, have to cast the stream to IfmxUDTSQLOutput. // (Server requirement) IfmxUDTSQLOutput out = (IfmxUDTSQLOutput) stream; out.writeDouble(x); out.writeDouble(y); out.writeDouble(radius); } public static double area(Circle c) { return PI * c.radius * c.radius; } } 不透明 (OPAQUE) 型の使用: 次の JDBC クライアント アプリケーションは、ク ラス Circle (Circle.jar にパッケージ) をシステム カタログの不透明 (OPAQUE) 型 としてインストールします。その後、アプリケーションは不透明 (OPAQUE) 型 Circle を SQL 文でデータ型として使用できます。 import java.sql.*; import java.lang.reflect.*; public class PlayWithCircle { String dbname = "test"; String url = null; Connection conn = null; public static void main (String args[]) { new PlayWithCircle(args); } PlayWithCircle(String args[]) { System.out.println("----------------"); System.out.println("- Start - Demo 1"); System.out.println("----------------"); // // // if ----------Getting URL ----------(args.length == 0) { System.out.println("¥n***ERROR: connection URL must be provided " + "in order to run the demo!"); return; } url = args[0]; // -------------// Loading driver // -------------try { System.out.print("Loading JDBC driver..."); Class.forName("com.informix.jdbc.IfxDriver"); System.out.println("ok"); } catch (java.lang.ClassNotFoundException e) { System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } 178 IBM Informix JDBC ドライバ プログラマーズ ガイド // -----------------// Getting connection // -----------------try { System.out.print("Getting connection..."); conn = DriverManager.getConnection(url); System.out.println("ok"); } catch (SQLException e) { System.out.println("URL = ’" + url + "’"); System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } System.out.println(); // ------------------// Setup UDT meta data // ------------------Method areamethod = null; try { Class c = Class.forName("Circle"); areamethod = c.getMethod("area", new Class[] {c}); } catch (ClassNotFoundException e) { System.out.println("Cannot get Class: " + e.toString()); return; } catch (NoSuchMethodException e) { System.out.println("Cannot get Method: " + e.toString()); return; } UDTMetaData mdata = null; try { System.out.print("Setting mdata..."); mdata = new UDTMetaData(); mdata.setSQLName("circle"); mdata.setLength(24); mdata.setAlignment(UDTMetaData.EIGHT_BYTE); mdata.setUDR(areamethod, "area"); mdata.setJarFileSQLName("circle_jar"); System.out.println("ok"); } catch (SQLException e) { System.out.println("¥n***ERROR: " + e.getMessage()); return; } // ------------------------------// Install the UDT in the database // ------------------------------UDTManager udtmgr = null; try { udtmgr = new UDTManager(conn); System.out.println("¥ncreateJar()"); String jarfilename = udtmgr.createJar(mdata, new String[] {"Circle.class"}); // jarfilename = circle.jar System.out.println(" jarfilename = " + jarfilename); System.out.println("¥nsetJarTmpPath()"); udtmgr.setJarTmpPath("/tmp"); 第 5 章 不透明 (OPAQUE) 型に関する作業 179 System.out.print("¥ncreateUDT()..."); udtmgr.createUDT(mdata, "/vobs/jdbc/demo/tools/udtudrmgr/" + jarfilename, "Circle", 0); System.out.println("ok"); } catch (SQLException e) { System.out.println("¥n***ERROR: " + e.getMessage()); return; } System.out.println(); // --------------// Now use the UDT // --------------try { String s = "drop table tab"; System.out.print(s + "..."); Statement stmt = conn.createStatement(); int count = stmt.executeUpdate(s); stmt.close(); System.out.println("ok"); } catch ( SQLException e) { // -206 The specified table (%s) is not in the database. if (e.getErrorCode() != -206) { System.out.println("¥n***ERROR: " + e.getMessage()); return; } System.out.println("ok"); } executeUpdate("create table tab (c circle)"); // test DEFAULT Input function executeUpdate("insert into tab values (’10 10 10’)"); // test DEFAULT Output function try { String s = "select c::lvarchar from tab"; System.out.println(s); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); if (rs.next()) { String c = rs.getString(1); System.out.println(" circle = ’" + c + "’"); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println("***ERROR: " + e.getMessage()); } System.out.println(); // test DEFAULT Send function try { // setup type map before using getObject() for UDT data. java.util.Map customtypemap = conn.getTypeMap(); System.out.println("getTypeMap...ok"); if (customtypemap == null) { System.out.println("***ERROR: map is null!"); return; 180 IBM Informix JDBC ドライバ プログラマーズ ガイド } customtypemap.put("circle", Class.forName("Circle")); System.out.println("put...ok"); String s = "select c from tab"; System.out.println(s); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); if (rs.next()) { Circle c = (Circle)rs.getObject(1, customtypemap); System.out.println(" c.x = " + c.x); System.out.println(" c.y = " + c.y); System.out.println(" c.radius = " + c.radius); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println("***ERROR: " + e.getMessage()); } catch (ClassNotFoundException e) { System.out.println("***ERROR: " + e.getMessage()); } System.out.println(); // test user’s non-support UDR try { String s = "select area(c) from tab"; System.out.println(s); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); if (rs.next()) { double a = rs.getDouble(1); System.out.println(" area = " + a); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println("***ERROR: " + e.getMessage()); } System.out.println(); executeUpdate("drop table tab"); // -----------------// Closing connection // -----------------try { System.out.print("Closing connection..."); conn.close(); System.out.println("ok"); } catch (SQLException e) { System.out.println("¥n***ERROR: " + e.getMessage()); } } 第 5 章 不透明 (OPAQUE) 型に関する作業 181 ユーザ指定のサポート関数を使用した不透明 (OPAQUE) 型の作成 この例では、クライアント上の Java クラス Circle2 が、circle2 という SQL 不透 明 (OPAQUE) 型にマップされます。 circle2 不透明 (OPAQUE) 型は、プログラマ が指定するサポート関数を使用します。 import import import import java.sql.*; java.text.*; com.informix.jdbc.IfmxUDTSQLInput; com.informix.jdbc.IfmxUDTSQLOutput; public class Circle2 implements SQLData { private static double PI = 3.14159; double x; double y; double radius; // x coordinate // y coordinate private String type = "circle2"; public String getSQLTypeName() { return type; } /* * * * * * public void readSQL(SQLInput stream, String typeName) throws SQLException { commented out - because the first release of the UDT/UDR Manager feature does not support mixing user-supplied support functions with server DEFAULT support functions. However, once the mix is supported, this code needs to be used to replace the existing code. // To be able to use the DEFAULT support functions (other than // Input/Output) supplied by the server, you must cast the stream // to IfmxUDTSQLInput. IfmxUDTSQLInput in = (IfmxUDTSQLInput) stream; x = in.readDouble(); y = in.readDouble(); radius = in.readDouble(); */ x = stream.readDouble(); y = stream.readDouble(); radius = stream.readDouble(); } /* * * * * * public void writeSQL(SQLOutput stream) throws SQLException { commented out - because the 1st release of UDT/UDR Manager feature doesn’t support the mixing of user support functions with server DEFAULT support functions. However, once the mix is supported, this code needs to be used to replace the existing code. // To be able to use the DEFAULT support functions (other than // Input/Output) supplied by the server, you must cast the stream // to IfmxUDTSQLOutput. IfmxUDTSQLOutput out = (IfmxUDTSQLOutput) stream; out.writeDouble(x); out.writeDouble(y); out.writeDouble(radius); */ stream.writeDouble(x); stream.writeDouble(y); stream.writeDouble(radius); } /** 182 IBM Informix JDBC ドライバ プログラマーズ ガイド * Input function - return the object from the String representation * ’x y radius’. */ public static Circle2 fromString(String text) { Number a = null; Number b = null; Number r = null; try { ParsePosition ps = new ParsePosition(0); a = NumberFormat.getInstance().parse(text, ps); ps.setIndex(ps.getIndex() + 1); b = NumberFormat.getInstance().parse(text, ps); ps.setIndex(ps.getIndex() + 1); r = NumberFormat.getInstance().parse(text, ps); } catch (Exception e) { System.out.println("In exception : " + e.getMessage()); } Circle2 c = new Circle2(); c.x = a.doubleValue(); c.y = b.doubleValue(); c.radius = r.doubleValue(); return c; } /** * Output function - return the string of the form ’x y radius’. */ public static String makeString(Circle2 c) { StringBuffer sbuff = new StringBuffer(); FieldPosition fp = new FieldPosition(NumberFormat.INTEGER_FIELD); NumberFormat.getInstance().format(c.x, sbuff, fp); sbuff.append(" "); NumberFormat.getInstance().format(c.y, sbuff, fp); sbuff.append(" "); NumberFormat.getInstance().format(c.radius, sbuff, fp); return sbuff.toString(); } /** * user function - get the area of a circle. */ public static double area(Circle2 c) { return PI * c.radius * c.radius; } } 不透明 (OPAQUE) 型の使用: 次の JDBC クライアント アプリケーションは、ク ラス Circle2 (Circle2.jar にパッケージ) をシステム カタログの不透明 (OPAQUE) 型としてインストールします。その後、アプリケーションは不透明 (OPAQUE) 型 Circle2 を SQL 文でデータ型として使用できます。 import java.sql.*; import java.lang.reflect.*; public class PlayWithCircle2 { String dbname = "test"; String url = null; 第 5 章 不透明 (OPAQUE) 型に関する作業 183 Connection conn = null; public static void main (String args[]) { new PlayWithCircle2(args); } PlayWithCircle2(String args[]) { // // // if ----------Getting URL ----------(args.length == 0) { System.out.println("¥n***ERROR: connection URL must be provided " + "in order to run the demo!"); return; } url = args[0]; // -------------// Loading driver // -------------try { System.out.print("Loading JDBC driver..."); Class.forName("com.informix.jdbc.IfxDriver"); } catch (java.lang.ClassNotFoundException e) { System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } try { conn = DriverManager.getConnection(url); } catch (SQLException e) { System.out.println("URL = ’" + url + "’"); System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } System.out.println(); 既存の Java クラスを使用しない不透明 (OPAQUE) 型の作成 この例では、クライアント上の Java クラス MyCircle を使用して、データベース サーバに ACircle という固定長の不透明 (OPAQUE) 型を作成します。 ACircle 不 透明 (OPAQUE) 型は、データベース サーバが提供するデフォルトのサポート関数 を使用します。 import java.sql.*; public class MyCircle { String dbname = "test"; String url = null; Connection conn = null; public static void main (String args[]) { new MyCircle(args); } 184 IBM Informix JDBC ドライバ プログラマーズ ガイド MyCircle(String args[]) { System.out.println("----------------"); System.out.println("- Start - Demo 3"); System.out.println("----------------"); // // // if ----------Getting URL ----------(args.length == 0) { System.out.println("¥n***ERROR: connection URL must be provided " + "in order to run the demo!"); return; } url = args[0]; // -------------// Loading driver // -------------try { System.out.print("Loading JDBC driver..."); Class.forName("com.informix.jdbc.IfxDriver"); System.out.println("ok"); } catch (java.lang.ClassNotFoundException e) { System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } // -----------------// Getting connection // -----------------try { System.out.print("Getting connection..."); conn = DriverManager.getConnection(url); System.out.println("ok"); } catch (SQLException e) { System.out.println("URL = ’" + url + "’"); System.out.println("¥n***ERROR: " + e.getMessage()); e.printStackTrace(); return; } // ------------------// Setup UDT meta data // ------------------UDTMetaData mdata = null; try { mdata = new UDTMetaData(); System.out.print("Setting fields in mdata..."); mdata.setSQLName("acircle"); mdata.setLength(24); mdata.setFieldCount(3); mdata.setFieldName(1, "x"); mdata.setFieldName(2, "y"); mdata.setFieldName(3, "radius"); mdata.setFieldType(1, com.informix.lang.IfxTypes.IFX_TYPE_INT); mdata.setFieldType(2, com.informix.lang.IfxTypes.IFX_TYPE_INT); mdata.setFieldType(3, com.informix.lang.IfxTypes.IFX_TYPE_INT); // set class name if don’t want to use the default name // <udtsqlname>.class mdata.setClassName("ACircle"); mdata.setJarFileSQLName("ACircleJar"); mdata.keepJavaFile(true); 第 5 章 不透明 (OPAQUE) 型に関する作業 185 System.out.println("ok"); } catch (SQLException e) { System.out.println("***ERROR: " + e.getMessage()); return; } // -------------------------------------------------------// create java file for UDT and install UDT in the database // -------------------------------------------------------UDTManager udtmgr = null; try { udtmgr = new UDTManager(conn); System.out.println("Creating .class/.java files - " + "createUDTClass()"); String classname = udtmgr.createUDTClass(mdata); // generated //java file is kept System.out.println(" classname = " + classname); System.out.println("¥nCreating .jar file - createJar()"); String jarfilename = udtmgr.createJar(mdata, new String[]{"ACircle.class"}); // jarfilename is // <udtsqlname>.jar // ie. acircle.jar System.out.println("¥nsetJarTmpPath()"); udtmgr.setJarTmpPath("/tmp"); System.out.print("¥ncreateUDT()..."); udtmgr.createUDT(mdata, "/vobs/jdbc/demo/tools/udtudrmgr/" + jarfilename, "ACircle", 0); System.out.println("ok"); } catch (SQLException e) { System.out.println("¥n***ERROR: " + e.getMessage()); return; } System.out.println(); // --------------// Now use the UDT // --------------try { String s = "drop table tab"; System.out.print(s + "..."); Statement stmt = conn.createStatement(); int count = stmt.executeUpdate(s); stmt.close(); System.out.println("ok"); } catch ( SQLException e) { // -206 The specified table (%s) is not in the database. if (e.getErrorCode() != -206) { System.out.println("¥n***ERROR: " + e.getMessage()); return; } System.out.println("ok"); } executeUpdate("create table tab (c acircle)"); // test DEFAULT Input function executeUpdate("insert into tab values (’10 10 10’)"); 186 IBM Informix JDBC ドライバ プログラマーズ ガイド // test DEFAULT Output function try { String s = "select c::lvarchar from tab"; System.out.println(s); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(s); if (rs.next()) { String c = rs.getString(1); System.out.println(" acircle = ’" + c + "’"); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println("***ERROR: " + e.getMessage()); } System.out.println(); executeUpdate("drop table tab"); // -----------------// Closing connection // -----------------try { System.out.print("Closing connection..."); conn.close(); System.out.println("ok"); } catch (SQLException e) { System.out.println("¥n***ERROR: " + e.getMessage()); } System.out.println("------------------"); System.out.println("- End - UDT Demo 3"); System.out.println("------------------"); } UDRManager を使用した UDR の作成 次のコードは、アプリケーションで UDRManager クラスと UDRMetaData クラス を使用して、クライアント (データベース サーバからアクセス不能) 上の Java ク ラスのメソッドを、データベース サーバの Java UDR に変換する方法を示してい ます。その後、アプリケーションはそれらの UDR を SQL 文で参照できます。こ の例では、クライアント上の Java クラスの名前は Group1 です。このクラスに は、udr1 と udr2 という 2 つのルーチンがあります。 次のコードは、Group1 クラスに、データベース サーバに UDR として登録するメ ソッドを作成します。 import java.sql.*; public class Group1 { public static String udr1 (String s1, String s2) throws SQLException { return s1 + s2; } // Return a formatted string with all inputs public static String udr2 (Integer i, String s1, String s2) throws SQLException 第 5 章 不透明 (OPAQUE) 型に関する作業 187 { return "{" + i + "," + s1 + "," + s2 +"}"; } } 次のコードは、Java メソッド udr1 および udr2 を、UDR group1_udr1 および group1_udr2 としてデータベース サーバに作成してから、それらの UDR を使用し ます。 import java.sql.*; import java.lang.reflect.*; public class PlayWithGroup1 { // Open a connection... url = "jdbc:informix-sqli://hostname:portnum:db/: informixserver=servname;user=scott;password=tiger; myConn = DriverManager.getConnection(url); //Install the routines in the database. UDRManager udtmgr = new UDRManager(myConn); UDRMetaData mdata = new UDRMetaData(); Class gp1 = Class.forName("Group1"); Method method1 = gp1.getMethod("udr1", new Class[]{String.class, String.class}); Method method2 = gp1.getMethod("udr2", new Class[]{Integer.class, String.class, String.class}); mdata.setUDR(method1, "group1_udr1"); mdata.setUDR(method2, "group1_udr2"); mdata.setJarFileSQLName("group1_jar"); udtmgr.createUDRs(mdata, "Group1.jar", "Group1", 0); // Use the UDRs in SQL statements: Statement stmt = myConn.createStatement(); stmt.executeUpdate("create table tab (c1 varchar(10), c2 char(20)", c3 int); stmt.close(); Statement stmt = myConn.createStatement(); stmt.executeUpdate("insert into tab values (’hello’, ’world’, 222)"); stmt.close(); Statement stmt = myConn.createStatement(); ResultSet r = stmt.executeQuery("select c3, group1_udr2(c3, c1, c2) from tab where group1_udr1(c1, c2) = ’hello world’"); ... } 188 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 6 章 国際化対応と日付書式 本章について . . . . . . . . . . . . . . . . . . JDK と国際化のサポート . . . . . . . . . . . . . . IBM Informix GLS 変数のサポート . . . . . . . . . . . 日付 (DATE) 型エンド ユーザ フォーマットのサポート . . . . GL_DATE 変数. . . . . . . . . . . . . . . . . DBDATE 変数 . . . . . . . . . . . . . . . . . DBCENTURY 変数 . . . . . . . . . . . . . . . エンド ユーザ フォーマットの優先順位ルール . . . . . . . コード セット変換のサポート . . . . . . . . . . . . . Unicode からデータベース コード セットへ . . . . . . . Unicode からクライアント コード セットへ . . . . . . . 非 ASCII 文字を含むデータベースへの接続 . . . . . . . テキスト (TEXT) 型および CLOB 型に対するコード セット変換 IFX_CODESETLOB 環境変数を使用した変換 . . . . . . JDK メソッドを使用した変換 . . . . . . . . . . . BLOB 型およびバイト (BYTE) 型に対するコード セット変換 . ユーザ定義のロケール . . . . . . . . . . . . . . . NEWLOCALE および NEWCODESET 環境変数を使用した接続 NEWNLSMAP 環境変数を使用した接続 . . . . . . . . ローカライズされたエラー メッセージのサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 190 191 192 192 194 196 197 198 198 200 200 201 201 202 203 204 204 204 205 本章について この章では、IBM Informix JDBC ドライバが、さまざまなロケールとコード セッ トに基づく Informix データベースへのアクセスを提供することにより、JDK の国 際化機能をどのように拡張しているかについて説明します。 この章には以下のセク ションが含まれています。 v JDK と国際化のサポート v IBM Informix GLS 変数のサポート v 日付 (DATE) 型エンド ユーザ フォーマットのサポート v エンド ユーザ フォーマットの優先順位ルール v コード セット変換のサポート v ユーザ定義のロケール v ローカライズされたエラー メッセージのサポート 国際化対応により、ユーザの国や言語と関係なくソフトウェアを開発し、ソフトウ ェアを複数の国または地域用にローカライズすることができます。 広域言語サポート (GLS) の設定に関する一般情報については、「IBM Informix GLS ユーザーズ ガイド」を参照してください。 © Copyright IBM Corp. 1996, 2008 189 JDK と国際化のサポート JDK は、グローバルなアプリケーションを開発するための豊富な API を提供して います。これらの国際化 API は Unicode 2.0 コード セットに基づいており、テキ スト、数値、日付、通貨、およびユーザ定義オブジェクトを、任意の国の慣習に適 合させることができます。 国際化 API は 3 つのパッケージにまとめられています。 v java.text パッケージには、ロケールに依存した方法でテキストを処理するための クラスとインターフェイスが含まれています。 v java.io パッケージには、非 Unicode 文字データのインポートおよびエクスポー トを行うための新規クラスが含まれています。 v java.util パッケージには、Locale クラス、ローカライゼーション サポート クラ ス、および日時を処理するための新規クラスが含まれています。 JDK の国際化サポートの詳細については、Sun Microsystems の資料を参照してくだ さい。 警告: JDK ロケールと JDK コード セットの間に関連付けはありません。これらが 一致するように保持する必要があります。例えば、日本語ロケール ja_JP を 選択した場合、SJIS コード セットが最適であることを示す Java メソッドは ありません。 190 IBM Informix JDBC ドライバ プログラマーズ ガイド IBM Informix GLS 変数のサポート 国際化により、IBM Informix JDBC ドライバにいくつかの環境変数が追加されてい ます。これらの変数について、次の表に要約します。 サポートされている Informix 環境変数 説明 CLIENT_LOCALE データベースにアクセスするクライアントのロケールを指定し ます。GL_DATE フォーマットなどのユーザ定義フォーマット についてのデフォルトを提供します。ユーザ定義データ型で は、コード セット変換においてこの指定を使用できます。デー タベース サーバは、DB_LOCALE 変数とともにこの変数を使 用して、サーバ プロセス ロケールを設定します。 DB_LOCALE と CLIENT_LOCALE の値が同じであるか、ま たはそれらのコード セットが変換可能である必要があります。 DBCENTURY 1 桁の年または 2 桁の年の日付 (DATE) 型の値に対する適切な 拡張を指定できるようにします。 DBDATE 日付 (DATE) 型列の値のエンド ユーザ フォーマットを指定し ます。 GL_DATE の方が推奨されます。 DB_LOCALE データベースのロケールを指定します。IBM Informix JDBC ド ライバは、この変数を使用して Unicode とデータベース ロケー ルとの間のコード セット変換を実行します。 データベース サ ーバは、CLIENT_LOCALE 変数とともにこの変数を使用し て、サーバ プロセス ロケールを設定します。 DB_LOCALE と CLIENT_LOCALE の値が同じであるか、またはそれらのコ ード セットが変換可能である必要があります。 GL_DATE 日付 (DATE) 型列の値のエンド ユーザ フォーマットを指定し ます。この変数は、Informix データベース サーバ バージョン 7.2x 以降でサポートされています。 NEWCODESET IBM Informix JDBC ドライバのリリース間で新規コード セット を定義できるようにします。 NEWLOCALE IBM Informix JDBC ドライバのリリース間で新規ロケールを定 義できるようにします。 IBM Informix JDBC ドライバでは、CLIENT_LOCALE 設定が有効である場合であ っても 10 進形式が変更されません。ローカライゼーションは、 Java アプリケーシ ョン内で DecimalFormat クラスを使用して実行する必要があります。このクラスの 詳細については、Sun Microsystems の資料を参照してください。 重要: DB_LOCALE 変数、CLIENT_LOCALE 変数、および GL_DATE 変数は、 データベース サーバが IBM Informix GLS 機能をサポートしている場合にの みサポートされます。これらの環境変数が設定されている場合に、アプリケ ーションが GLS 非対応サーバ (7.2 より前のサーバ バージョン) に接続する と、接続例外が発生します。GLS 非対応サーバに接続し、これらの変数を設 定しない場合、動作は IBM Informix JDBC ドライバの以前のバージョンと同 じになります。 第 6 章 国際化対応と日付書式 191 日付 (DATE) 型エンド ユーザ フォーマットのサポート エンド ユーザ フォーマットは、文字列変数に日付 (DATE) 型の値が表示されるフ ォーマットです。このセクションでは、日付 (DATE) 型のエンド ユーザ フォーマ ットを指定する GL_DATE、DBDATE、および DBCENTURY の各変数について説 明します。これらの変数はオプションです。 重要: IBM Informix JDBC ドライバは、DBDATE または GL_DATE 環境変数に対 して、ALS 6.0、5.0、または 4.0 フォーマットをサポートしていません。 GL_DATE の詳細については、「IBM Informix GLS ユーザーズ ガイド」を参照し てください。 GL_DATE 変数 GL_DATE 環境変数は、日付 (DATE) 型列の値のエンド ユーザ フォーマットを指 定します。この変数は、Informix データベース サーバ バージョン 7.2x 以降でサ ポートされています。GL_DATE フォーマット文字列は以下の文字を含むことがで きます。 v 1 つ以上の空白文字 v 通常の文字 (% 記号または空白文字以外) v % 記号と、それに続く 1 つか 2 つの変換文字 (必要な置換を指定) から構成さ れるフォーマット ディレクティブ 次の表に、日付フォーマット ディレクティブの定義を示します。 ディレクティブ 置き換える対象 %a ロケールで定義されている曜日の省略名 %A ロケールで定義されている曜日の完全名 %b ロケールで定義されている月の省略名 %B ロケールで定義されている月の完全名 %C 10 進数値 (00 から 99) で表す世紀の数値 (年を 100 で除算し、整 数に切り捨て) %d 10 進数値 (01 から 31) で表す日付 1 桁の数値の前にはゼロ (0) を付けます。 %D %m/%d/%y フォーマットと同じ %e 10 進数値 (1 から 31) で表す日付 1 桁の数値の前には空白を付けます。 %h %b フォーマット ディレクティブと同じ %iy 2 桁の年 (00 から 99) で表す年 %y に対する Informix 固有のフォーマット ディレクティブです。 %iY 4 桁の年 (0000 から 9999) で表す年 %Y に対する Informix 固有のフォーマット ディレクティブです。 192 IBM Informix JDBC ドライバ プログラマーズ ガイド %m 10 進数値 (01 から 12) で表す月 %n 復帰改行文字 %t タブ文字 %w 10 進数値 (0 から 6) で表す曜日 0 は ロケールの日曜日に相当する値を表します。 %x ロケールが定義する特殊な日付表現 %y 2 桁の年 (00 から 99) で表す年 %Y 4 桁の年 (0000 から 9999) で表す年 %% % (フォーマット文字列で % を使用できるようにするため) 重要: フィールド指定に対する GL_DATE オプション日付書式修飾子はサポートさ れていません。 例えば、%4m を使用して、最大フィールド幅 4 の 10 進数値で月を表示す ることは、サポートされていません。 代替日付書式に対して代替桁数を使用することを示す GL_DATE 変換修飾子 O はサポートされていません。 空白またはその他の英数字以外の文字は、2 つのフォーマット ディレクティブの間 で使用される必要があります。GL_DATE 変数のフォーマットが、有効ないずれの フォーマット ディレクティブとも一致しない場合、データベース サーバが日付を フォーマットしようとしたときにエラーになる可能性があります。 例えば、米国英語 (U.S. English) ロケールの場合、09/29/1998 に対する内部日付 (DATE) 型値を次の書式設定を使用してフォーマットできます。 * Sep 29, 1998 this day is:(Tuesday), a fine day * このフォーマットを作成するには、GL_DATE 環境変数を次の値に設定します。 * %b %d, %Y this day is:(%A), a fine day * この日付値を日付 (DATE) 型列を持つデータベース表に挿入するには、以下のタイ プの挿入を実行できます。 v SQL 文が変更されずにデータベース サーバに送信される、非ネイティブ SQL GL_DATE 設定で予期されているとおりに、日付値を入力します。 v エスケープ構文が Informix 固有のフォーマットに変換される、ネイティブ SQL 日付値を JDBC エスケープ フォーマット yyyy-mm-dd で入力します。値は自動 的に GL_DATE フォーマットに変換されます。 次の例は両方のタイプの挿入を示しています。 データベースからフォーマットされた GL_DATE DATE 値を抽出するには、 ResultSet クラスの getString() メソッドを呼び出します。 日付を表す文字列を、文字 (CHAR) 型、可変長文字 (VARCHAR) 型、またはラー ジ可変長文字 (LVARCHAR) 型のデータベース表列に入力するために、その日付ス 第 6 章 国際化対応と日付書式 193 トリング値を表す日付オブジェクトを作成することもできます。日付ストリング値 は、GL_DATE フォーマットに従っている必要があります。 次の例は、日付 (DATE) 型値を選択する両方の方法を示しています。 PreparedStatement pstmt = conn.prepareStatement("Select * from tablename " + "where col2 like ?;"); pstmt.setString(1, "%Tue%"); ResultSet r = pstmt.executeQuery(); while(r.next()) { String s = r.getString(1); java.sql.Date d = r.getDate(2); System.out.println("Select: column col1 (GL_DATE format) = <" + s + ">"); System.out.println("Select: column col2 (JDBC Escape format) = <" + d + ">"); } r.close(); pstmt.close(); DBDATE 変数 DBDATE 環境変数のサポートにより、7.2x、8.x、または 9.x より前の Informix デ ータベース サーバ バージョンに基づくクライアント アプリケーションに対する下 位方向の互換性が提供されます。新規アプリケーションに対しては、GL_DATE 環 境変数を使用してください。 DBDATE 環境変数は、日付 (DATE) 型列の値のエンド ユーザ フォーマットを指 定します。エンド ユーザ フォーマットは、以下のような方法で使用されます。 v 日付 (DATE) 型値を入力するときに、IBM Informix 製品は DBDATE 環境変数 を使用して入力を解釈します。例えば、INSERT 文でリテラル日付 (DATE) 型値 を指定する場合、Informix データベース サーバは、このリテラル値が DBDATE 変数で指定されたフォーマットと互換性を持っていることを要求します。 v 日付 (DATE) 型値を表示する場合、IBM Informix 製品は DBDATE 環境変数を 使用して出力をフォーマットします。 標準形式では、以下の属性を指定できます。 v 日付での、月、日、年の順序 v 年が、2 桁 (Y2) または 4 桁 (Y4) のどちらで出力されるか v 月、日、年の間の分離文字 フォーマット文字列には以下の文字を含めることができます。 v ハイフン (-)、ピリオド (.)、およびスラッシュ (/) は、日付書式での分離文字で す。分離文字はフォーマット文字列の最後に指定します (Y4MD- など)。 v 0 は、分離文字が表示されないことを示します。 v D および M は、日および月を表す文字です。 v Y2 および Y4 は、年と、年の桁数を表す文字列です。 以下のフォーマット文字列は、有効な標準 DBDATE フォーマットです。 v DMY2 v DMY4 194 IBM Informix JDBC ドライバ プログラマーズ ガイド v MDY4 v MDY2 v Y4MD v Y4DM v Y2MD v Y2DM 分離文字は、常にフォーマット文字列の最後に指定します (DMY2/ など)。分離文字 または無効な文字が指定されていない場合、スラッシュ (/) 文字がデフォルトで す。 米国 ASCII 英語 (U.S. ASCII English) ロケールの場合、DBDATE に対するデフォ ルトの設定は、Y4MD- です。Y4 は 4 桁の年、M は月、D は日を表し、ハイフン (-) は分離文字です (例えば、1998-10-08)。 日付値を日付 (DATE) 型列を持つデータベース表に挿入するには、以下のタイプの 挿入を実行できます。 v 非ネイティブ SQL。SQL 文は、変更されずにデータベース サーバに送信されま す。DBDATE 設定で予期されているとおりに、日付値を入力します。 v ネイティブ SQL。エスケープ構文は、Informix 固有のフォーマットに変換されま す。日付値を JDBC エスケープ フォーマット yyyy-mm-dd で入力します。値は 自動的に DBDATE フォーマットに変換されます。 次の例は、両方のタイプの挿入を示しています (DBDATE 値は MDY2-)。 stmt = conn.createStatement(); cmd = "create table tablename (col1 date, col2 varchar(20));"; rc = stmt.executeUpdate(cmd);.. .String[] dateVals = {"’08-10-98’", "{d ’1998-08-11’}" }; String[] charVals = {"’08-10-98’", "’08-11-98’" }; int numRows = dateVals.length; for (int i = 0; i < numRows; i++) { cmd = "insert into tablename values(" + dateVals[i] + ", " + charVals[i] + ")"; rc = stmt.executeUpdate(cmd); System.out.println("Insert: column col1 (date) = " + dateVals[i]); System.out.println("Insert: column col2 (varchar) = " + charVals[i]); } データベースからフォーマット済みの DBDATE DATE 値を抽出するには、 ResultSet クラスの getString メソッドを呼び出します。 日付を表す文字列を、文字 (CHAR) 型、可変長文字 (VARCHAR) 型、またはラー ジ可変長文字 (LVARCHAR) 型のデータベース表列に入力するために、その日付ス トリング値を表す日付オブジェクトを作成できます。日付ストリング値は、 DBDATE フォーマットに従っている必要があります。 次の例は、日付 (DATE) 型値を選択する両方の方法を示しています。 PreparedStatement pstmt = conn.prepareStatement("Select * from tablename " + "where col1 = ?;"); GregorianCalendar gc = new GregorianCalendar(1998, 7, 10); java.sql.Date dateObj = new java.sql.Date(gc.getTime().getTime()); pstmt.setDate(1, dateObj); ResultSet r = pstmt.executeQuery(); while(r.next()) 第 6 章 国際化対応と日付書式 195 { String s = r.getString(1); java.sql.Date d = r.getDate(2); System.out.println("Select: column col1 (DBDATE format) = <" + s + ">"); System.out.println("Select: column col2 (JDBC Escape format) = <" + d + ">"); } r.close(); pstmt.close(); DBCENTURY 変数 String 値が、3 桁より小さい年桁数の日付 (DATE) 型値を表し、DBCENTURY が 設定されている場合、IBM Informix JDBC ドライバは String 値を日付 (DATE) 型 値に変換し、DBCENTURY プロパティを使用して年の正しい 4 桁拡張を決定しま す。 影響を受けるメソッドと、影響を受ける条件を次の表に要約します。 メソッド 条件 PreparedStatement.setString(int, String) ターゲット列が日付 (DATE) 型。 PreparedStatement.setObject(int, String) ターゲット列が日付 (DATE) 型。 IfxPreparedStatement.IfxSetObject(String) ターゲット列が日付 (DATE) 型。 ResultSet.getDate(int)ResultSet.getDate(int,Calendar) ResultSet.getDate(String) ResultSet.getDate(String, Calendar) ソース列が文字列 (string) 型。 ResultSet.getTimestamp(int) ResultSet.getTimestamp(int, Calendar) ResultSet.getTimestamp(String) ResultSet.getTimestamp(String, Calendar) ソース列が文字列 (string) 型。 ResultSet.updateString(int,String) ResultSet.updateString(String,String) ターゲット列が日付 (DATE) 型。 ResultSet.updateObject(int,String) ResultSet.updateObject(int,String,int) ResultSet.updateObject(String, String) ResultSet.updateObject(String,String,int) ターゲット列が日付 (DATE) 型。 次の表は、DBCENTURY 環境変数に対する 4 つの可能な設定値について説明して います。 設定 意味 説明 P 過去 過去と現在の世紀を使用して年の値を拡張します。 F 未来 現在と次の世紀を使用して年の値を拡張します。 C 近似 過去、現在、および次の世紀を使用して年の値を拡張します。 R 現在 現在の世紀を使用して年の値を拡張します。 各設定で使用されるアルゴリズムの説明、および各設定の例については、「IBM Informix SQL ガイド: リファレンス」の『環境変数』のセクションを参照してくだ さい。 196 IBM Informix JDBC ドライバ プログラマーズ ガイド DBCENTURY の値を設定する URL の例を、次に示します。 jdbc:informix-sqli://myhost:1533:informixserver=myserver; user=myname;password=mypasswd;DBCENTURY=F; URL には改行があってはなりません。 IBM Informix JDBC ドライバは、java.sql.Date および java.sql.Timestamp の値を サーバに送信するとき、常に 4 桁の年を組み込みます。同様に、サーバは、 Informix 日付 (DATE) 型値を IBM Informix JDBC ドライバに送信するとき、常に 4 桁の年を組み込みます。 IBM Informix JDBC ドライバで DBCENTURY を使用する方法の例については、 DBCENTURYSelect.java、DBCENTURYSelect2.java、DBCENTURYSelect3.java、 DBCENTURYSelect4.java、および DBCENTURYSelect5.java の各サンプル プログ ラムを参照してください。 エンド ユーザ フォーマットの優先順位ルール 内部日付 (DATE) 型値のエンド ユーザ フォーマットの決定方法を定義する優先順 位ルールを、以下にリストします。 v DBDATE フォーマットが指定されている場合、このフォーマットが使用されま す。 v GL_DATE フォーマットが指定されている場合、ロケールを判別する必要があり ます。 – CLIENT_LOCALE 値が指定されている場合、日付 (DATE) 型値の表示に、そ の値が GL_DATE フォーマット文字列とともに使用されます。 – DB_LOCALE 値が指定されているが CLIENT_LOCALE 値が指定されていな い場合は、DB_LOCALE 値が有効であることを確認するために、 DB_LOCALE 値がデータベース ロケール (ユーザ データベースの systables 表から読み取られる) と比較されます。DB_LOCALE 値が有効な場合は、日付 (DATE) 型値の表示に、その値が GL_DATE フォーマット文字列とともに使 用されます。DB_LOCALE 値が有効でない場合は、データベース ロケールが GL_DATE フォーマット文字列とともに使用されます。 – CLIENT_LOCALE 値も DB_LOCALE 値も指定されていない場合は、日付 (DATE) 型値の表示に、データベース ロケールが GL_DATE フォーマット文 字列とともに使用されます。 v CLIENT_LOCALE 値が指定されている場合、日付 (DATE) 型のフォーマット は、このロケールに関連付けられているデフォルトのフォーマットに従います。 v DB_LOCALE 値が指定されているが CLIENT_LOCALE 値が指定されていない 場合は、DB_LOCALE 値が有効なことを確認するために、DB_LOCALE 値がデ ータベース ロケールと比較されます。 DB_LOCALE 値が有効な場合は、DB_LOCALE デフォルト フォーマットが使 用されます。DB_LOCALE 値が有効でない場合は、データベース ロケールに関 連付けられている日付に対するデフォルトのフォーマットが使用されます。 v CLIENT_LOCALE 値も DB_LOCALE 値も指定されていない場合、すべての日 付 (DATE) 型値は米国英語 (U.S. English) フォーマット (Y4MD-) でフォーマット されます。 第 6 章 国際化対応と日付書式 197 コード セット変換のサポート コード セット変換は、文字データを 1 つのコード セットから別のコード セット に変換します。クライアント/サーバ環境では、クライアント コンピュータとデータ ベース サーバ コンピュータが異なるコード セットを使用して同じ文字を表現して いる場合、文字データを 1 つのコード セットから別のコード セットへ変換する必 要がある可能性があります。コード セット変換の詳細については、「IBM Informix GLS ユーザーズ ガイド」を参照してください。 以下のようなタイプの文字データに対してコード セット変換を指定する必要があり ます。 v SQL データ型 (文字 (CHAR) 型、可変長文字 (VARCHAR) 型、各国語文字 (NCHAR) 型、各国語可変長文字 (NVARCHAR) 型) v SQL 文 v データベース名、列名、表名、文識別子名、カーソル名などの、データベース オ ブジェクト v ストアド プロシジャ テキスト v コマンド テキスト v 環境変数 IBM Informix JDBC ドライバは、文字データがクライアントとデータベース サー バとの間で送信されるときにそのデータを変換します。変換に使用されるコード セ ット (エンコード) は、オープンされているデータベースの systables カタログで指 定されています。接続プロパティまたはデータベース URL で、DB_LOCALE 値と CLIENT_LOCALE 値を設定します。 Unicode からデータベース コード セットへ Java は Unicode に基づいているため、IBM Informix JDBC ドライバは Unicode と Informix データベースのコード セットとの間でデータを変換します。 コード セッ ト変換値は、接続時に指定する DB_LOCALE 値から抽出されます。DB_LOCALE の値が正しくない場合は、データベース ロケール情報の不一致エラーが発生しま す。 DB_LOCALE 値は、次の互換性を示す表内の有効な Informix コード セット名また は番号を持つ、有効な Informix ロケールである必要があります。 次の表は、サポ ートされている JDK 1.4 エンコードと対応する Informix コード セットを示しま す。 198 IBM Informix JDBC ドライバ プログラマーズ ガイド Informix コード セット名 Informix コード セット番号 JDK コード セット 8859-1 819 8859_1 8859-2 912 8859_2 8859-3 57346 8859_3 8859-4 57347 8859_4 8859-5 915 8859_5 8859-6 1089 8859_6 8859-7 813 8859_7 8859-8 916 8859_8 8859-9 920 8859_9 ASCII 364 ASCII sjis-s 932 SJIS sjis 57350 SJIS utf8 57372 UTF8 big5 57352 Big5 CP1250 1250 Cp1250 CP1251 1251 Cp1251 CP1252 1252 Cp1252 CP1253 1253 Cp1253 CP1254 1254 Cp1254 CP1255 1255 Cp1255 CP1256 1256 Cp1256 CP1257 1257 Cp1257 cp949 57356 Cp949 KS5601 57356 Cp949 ksc 57356 Cp949 ujis 57351 EUC_JP gb 57357 ISO2022CN_GB GB2312-80 57357 ISO2022CN_GB cp936 57357 ISO2022CN_GB JDK がサポートするエンコードと対応するコード セットを持たない Informix ロケ ールは使用できません。 誤って使用すると、「エンコードまたはコード セットが サポートされていません」というエラー メッセージが表示されます。 第 6 章 国際化対応と日付書式 199 次の表に、サポートされているロケールを示します。 サポートされているロケール ar_ae ar_sa de_at en_ca es_ar es_ec es_pe fi_fi hr_hr iw_il nl_nl ro_ro th_th ar_bh bg_bg de_ch en_gb es_bo es_es es_py fr_be hu_hu ja_jp no_no ru_ru tr_tr ar_kw ca_es de_de en_ie es_cl es_gt es_sv fr_ca is_is ko_kr pl_pl sh_yu uk_ua ar_om cs_cz el_gr en_nz es_co es_mx es_uy fr_ch it_ch mk_mk pt_br sk_sk zh_cn ar_qa da_dk en_au en_us es_cr es_pa es_ve fr_fr it_it nl_be pt_pt sv_se zh_tw Unicode からクライアント コード セットへ Unicode コード セットには既存のコード セットがすべて含まれているため、Java 仮想マシン (JVM) はプラットフォームのローカル コード セットを使用して文字を 表示する必要があります。 Java プログラム内では、常に Unicode 文字を使用する 必要があります。 そのプラットフォーム上の JVM が、入出力を Unicode とロー カル コード セットとの間で変換します。 例えば、ユーザがボタンのラベルを Unicode で指定すると、JVM はラベルが正し く表示されるようにテキストを変換します。同様に、getText() メソッドがテキスト ボックスからのユーザ入力を受け取ると、ユーザの入力方法に関係なく、クライア ント プログラムはその文字列を Unicode で受け取ります。 テキスト ファイルを一度に 1 バイトずつ読み込まないでください。常に InputStreamReader() メソッドまたは OutputStreamWriter() メソッドを使用してテ キスト ファイルを操作してください。デフォルトで、これらのメソッドはローカル エンコードを使用しますが、次のようにクラスのコンストラクタでエンコードを指 定できます。 InputStreamReader = new InputStreamReader (in, "SJIS"); 外部入力を正しい Java Unicode 文字列で取得するのは、ユーザと JVM です。 そ の後、データベース ロケール エンコードを使用して、データベース サーバへの、 またデータベース サーバからのデータの送信が行われます。 非 ASCII 文字を含むデータベースへの接続 接続時にデータベース名を指定しない場合は、指定したデータベースに対して正し い DB_LOCALE 値を使用して接続をオープンする必要があります。 CLOSE DATABASE 文および DATABASE dbname 文が実行されると、その接続で は、データベース名を解釈するために引き続きオリジナルの DB_LOCALE 値が使 用されます。新規データベースの DB_LOCALE 値が一致しない場合は、エラーが 200 IBM Informix JDBC ドライバ プログラマーズ ガイド 戻されます。この場合、クライアント プログラムは接続をクローズし、新規データ ベースに対する正しい DB_LOCALE 値を使用して再オープンする必要がありま す。 接続時にデータベース名を指定する場合は、DB_LOCALE 値を正しいデータベース ロケールに設定する必要があります。 NLS データベースへ接続するには、NEWCODESET および NEWLOCALE 接続プ ロパティを使用してロケールを定義します。そのフォーマットについては、 『NEWLOCALE および NEWCODESET 環境変数を使用した接続』を参照してくだ さい。 テキスト (TEXT) 型および CLOB 型に対するコード セット変換 IBM Informix JDBC ドライバは、テキスト (TEXT) 型、バイト (BYTE) 型、CLOB 型、および BLOB 型に対するコード セット間の変換は、自動的には行いません。 テキスト (TEXT) 型および CLOB 型に対するコード セット間の変換を、以下のい ずれかの方法で行うことができます。 v IFX_CODESETLOB 環境変数を使用することにより、クライアント ロケールとデ ータベース ロケール間で、テキスト (TEXT) 型または CLOB 型のデータに対す るコード セット変換を自動化できます。 v getBytes()、getString()、InputStreamReader()、および OutputStreamWriter() の 各メソッドを使用することにより、テキスト (TEXT) 型のデータに対するコード セット間での変換を実行できます。 IFX_CODESETLOB 環境変数を使用した変換 テキスト (TEXT) 型および CLOB 型に対して、以下のペアのコード セット変換を 自動化できます。 v データがデータベース サーバに送信される前に、クライアント ロケールからデ ータベース ロケールに変換する。 v データがクライアントにより抽出される前に、データベース ロケールからクライ アント ロケールに変換する。 テキスト (TEXT) 型および CLOB 型に対するコード セット変換を自動化するに は、接続 URL で IFX_CODESETLOB 環境変数を設定します。例: IFX_CODESETLOB = 4096。以下の IfxDataSource クラスのメソッドを使用して、IFX_CODESETLOB 値の設定と取得を行うこともできます。 public void setIfxIFX_CODESETLOB(int codesetlobFlag); public int getIfxIFX_CODESETLOB(); IFX_CODESETLOB は、次の表にリストされた値を取ることができます。 値 結果 なし デフォルト 自動コード セット変換は有効になりません。 0 自動コード セット変換は、内部一時ファイルで行われます。 第 6 章 国際化対応と日付書式 201 > 0 自動コード セット変換は、クライアント コンピュータのメモリ内 で行われます。値は変換のために割り当てられるバイト数を示しま す。 割り当てられたバイト数がラージ オブジェクトのサイズよりも小さ い場合は、エラーが戻されます。 メモリ内で変換を実行するには、クライアント マシンのメモリ制限よりも小さく、 変換されるどのラージ オブジェクトのサイズよりも大きい量を指定する必要があり ます。 以下の java.sql.Clob インターフェイスのメソッドのいずれか、または Clob インタ ーフェイスの Informix 拡張セットを使用している場合は、IFX_CODESETLOB 環境 変数が設定されていても、コード セット変換は実行されません。 これらのメソッ ドには次のようなものが含まれます。 IfxCblob::setAsciiStream(long) Clob::setAsciiStream(long position, InputStream fin, int length) IFX_CODESETLOB は、java.sql.PreparedStatement インターフェイスのメソッドに 対してのみ有効です。 ただし、以下の java.sql.Clob インターフェイスのメソッドのいずれか、または Clob インターフェイスの Informix 拡張セットを使用している場合は、Unicode 文字は常 にデータベース ロケールのコード セットに自動的に変換されます。 これらのメソ ッドのリストを次に示します。 Clob::setCharacterStream(long) throws SQLException Clob::setString(long, String) throws SQLException Clob:: setString(long pos, String str, int offset, int len) IfxCblob::setSubString(long position, String str, int length) JDK メソッドを使用した変換 getBytes()、getString()、InputStreamReader()、および OutputStreamWriter() の各 メソッドは、Unicode から指定されたコード セットに、または指定されたコード セットから Unicode に変換するコード セット パラメータを取ります。これらのメ ソッドについては、Sun の JDK のマニュアルに詳細に記載されています。 以下は、ファイルをクライアント コード セットから Unicode に変換し、その後、 Unicode からデータベース コード セットに変換する方法を示すサンプル コードで す。 File infile = new File("data_jpn.dat"); File outfile = new File ("data_conv.dat");.. .pstmt = conn.prepareStatement("insert into t_text values (?)");.. .// Convert data from client encoding to database encoding System.out.println("Converting data ...¥n"); try { String from = "SJIS"; String to = "8859_1"; convert(infile, outfile, from, to); } catch (Exception e) { System.out.println("Failed to convert file"); } System.out.println("Inserting data ...¥n"); 202 IBM Informix JDBC ドライバ プログラマーズ ガイド try { int fileLength = (int) outfile.length(); fin = new FileInputStream(outfile); pstmt.setAsciiStream(1 , fin, fileLength); pstmt.executeUpdate(); } catch (Exception e) { System.out.println("Failed to setAsciiStream"); }.. .public static void convert(File infile, File outfile, String from, String to) throws IOException { InputStream in = new FileInputStream(infile); OutputStream out = new FileOutputStream(outfile); Reader r = new BufferedReader( new InputStreamReader( in, from)); Writer w = new BufferedWriter( new OutputStreamWriter( out, to)); //Copy characters from input to output. The InputStreamReader converts // from the input encoding to Unicode, and the OutputStreamWriter // converts from Unicode to the output encoding. Characters that can // not be represented in the output encoding are output as ’?’ char[] buffer = new char[4096]; int len; while ((len = r.read(buffer)) != -1) w.write(buffer, 0, len); r.close(); w.flush(); w.close(); } データベースからデータを抽出するときは、同じアプローチを使用して、データベ ース コード セットからクライアント コード セットにデータを変換できます。 BLOB 型およびバイト (BYTE) 型に対するコード セット変換 java.sql.PreparedStatement::setCharacterStream() を使用して CLOB 列に挿入するとき には、Java Unicode 文字がデータベース ロケール コード セットに自動的に変換さ れます。 環境変数 IFX_CODESETLOB が設定される場合、その値によって、一時 ファイルを使用してコード セット変換が実行されるか、またはメモリでコード セ ット変換が実行されるかが決定されます。IFX_CODESETLOB が設定されない場 合、LOBCACHE 環境変数によって、コード セット変換が一時ファイルで行われる か、メモリで行われるかが決定されます。 ただし、java.sql.PreparedStatement::setCharacterStream() を使用して BLOB 型または バイト (BYTE) 型列を挿入することはお勧めしません。JDBC ドライバは Java 文 字をデータベースに挿入できないため、文字のコード セット変換を試行します。 java.sql.PreparedStatement::setBinaryStream() を使用する方法は、BLOB 型またはバイ ト (BYTE) 型列を挿入する際に推奨される方法です。 第 6 章 国際化対応と日付書式 203 ユーザ定義のロケール IBM Informix JDBC ドライバは、JDK 国際化 API を使用して各国対応データを操 作します。この API のクラスとメソッドはパラメータとして JDK のロケールまた はエンコードを取りますが、Informix の DB_LOCALE および CLIENT_LOCALE プロパティは Informix 名に基づいてロケールとコード セットを指定するため、こ れらの Informix 名は JDK 名にマップされます。これらのマッピングは内部表に保 持され、定期的に更新されます。 例えば、ASCII コード セットに対する Informix 名と JDK 名は、それぞれ 8859-1 と 8859_1 です。 IBM Informix JDBC ドライバは内部表で 8859-1 を 8859_1 にマ ップし、JDK のクラスとメソッドで適切な JDK 名を使用します。 NEWLOCALE および NEWCODESET 環境変数を使用した接続 これらの表の更新の間に新規ロケールが作成される可能性があるため、2 つの接続 プロパティ、NEWLOCALE および NEWCODESET によって、表に指定されてい ないロケールまたはコード セットを指定できます。 これらのプロパティを使用す る URL の例を次に示します。 jdbc:informix-sqli://myhost:1533:informixserver=myserver; user=myname; password=mypasswd;NEWLOCALE=en_us,en_us; NEWCODESET=8859_1,8859-1,819; URL は単一の行に記述される必要があります。 NEWLOCALE および NEWCODESET プロパティのフォーマットは次のとおりで す。 NEWLOCALE=JDK-locale,Ifx-locale:JDK-locale,Ifx-locale... NEWCODESET=JDK-encoding,Ifx-codeset,Ifx-codeset-number:JDKencoding, Ifx-codeset,Ifx-codeset-number... 指定可能なロケールまたはコード セットのマッピングの数に制限はありません。 NLS データベースへ接続するには、NEWCODESET および NEWLOCALE 接続プ ロパティを使用してロケールを定義します。 誤った数のパラメータまたは値を指定すると、「ロケールがサポートされていませ ん」または「エンコードまたはコード セットがサポートされていません」というメ ッセージを受け取ります。 URL または DataSource オブジェクトでこれらのプロパティが設定されると、 NEWLOCALE および NEWCODESET の新規値が JDBC 内部表の値を上書きしま す。例えば、JDBC が内部的に 8859-1 を 8859_1 にマップする場合に、ユーザが代 わりに NEWCODESET=8888,8859-1,819 を指定した場合、その新規値 8888 がコード セット変換に使用されます。 NEWNLSMAP 環境変数を使用した接続 NLS データベースへの接続をサポートするため、IBM informix JDBC ドライバは、 NLS ロケールを対応する JDK ロケールおよび JDK コード セットにマップする表 を管理します。 より多くのロケールとコード セットに対する JDK サポートが利 用できるようになり、以前サポートされていなかった NLS ロケールが、新しい 204 IBM Informix JDBC ドライバ プログラマーズ ガイド JDK ではサポートされるようになる場合があります。IBM Informix JDBC ドライバ は、表に指定されていない NLS ロケールに対するマッピングを指定する接続プロ パティ、NEWNLSMAP をサポートしています。 NEWNLSMAP プロパティのフォーマットは次のとおりです。 NEWNLSMAP=NLS-locale,JDK-locale,JDK-codeset:NLS-locale,JDK-locale, JDK-codeset,.... これらのプロパティを使用する URL の例を次に示します。 jdbc:informix-sqli://myhost:1533:informixserver=myserver; user=myname;password=mypasswd;NEWNLSMAP=rumanian,ro_RO,ISO8859_2; 指定可能なマッピングの数に制限はありません。誤った数のパラメータまたは値を 指定すると、「ロケールがサポートされていません」または「エンコードまたはコ ード セットがサポートされていません」というメッセージを受け取ります。 ローカライズされたエラー メッセージのサポート メッセージ テキストは、通常 SQLException オブジェクトのテキストですが、 SQLWarn オブジェクトや、ドライバからのその他の任意のテキスト出力である場 合もあります。 ローカライズされたメッセージ テキスト出力を有効にするには、次の 2 つの要件 があります。 v ifxlang.jar ファイルの絶対パスを、$CLASSPATH (UNIX) または %CLASSPATH% (Windows) 環境変数に追加する必要があります。この JAR フ ァイルには、IBM Informix JDBC ドライバでサポートされるすべてのメッセージ テキストのローカライズされたバージョンが含まれます。サポートされている言 語は、英語、ドイツ語、フランス語、スペイン語、ロシア語、ポーランド語、チ ェコ語、スロバキア語、中国語 (簡体字および繁体字)、韓国語、および日本語で す。 v デフォルト以外のロケールを使用している場合は、接続時に CLIENT_LOCALE 環境変数値をプロパティ リストを通して接続オブジェクトに渡す必要がありま す。 CLIENT_LOCALE および GLS 機能全般の詳細については、191 ページの 『IBM Informix GLS 変数のサポート』を参照してください。 いくつかのパブリック クラスには、CLIENT_LOCALE 値にアクセスするために、 現行接続オブジェクトをパラメータとして取るコンストラクタがあります。英語以 外のエラー メッセージにアクセスする場合は、接続オブジェクトを組み込んだコン ストラクタを使用する必要があります。そうしないと、それらのクラスからのエラ ー メッセージ テキストは英語のみになります。影響を受けるパブリック クラス は、Interval、IntervalYM、IntervalDF、および IfxLocator です。これらのクラスに使 用するコンストラクタの詳細については、 89 ページの『第 4 章 Informix データ型 に関する作業』を参照してください。 ローカライズされたエラー メッセージのサポート機能を使用する方法の例について は、IBM Informix JDBC ドライバに含まれている locmsg.java プログラムを参照し てください。 第 6 章 国際化対応と日付書式 205 206 IBM Informix JDBC ドライバ プログラマーズ ガイド 第 7 章 調整およびトラブルシューティング 本章について . . . . . . . . . . . . . . . . . JDBC API プログラムのデバッグ. . . . . . . . . . . パフォーマンスの管理 . . . . . . . . . . . . . . FET_BUF_SIZE および BIG_FET_BUF_SIZE 環境変数. . . ラージ オブジェクトのメモリ管理 . . . . . . . . . ネットワーク トラフィックの削減 . . . . . . . . . バルク挿入の使用 . . . . . . . . . . . . . . . 接続プールの使用 . . . . . . . . . . . . . . . ConnectionPoolDataSource オブジェクトの配置 . . . . Connection Pool Manager の調整 . . . . . . . . . 高可用性データ レプリケーションの接続プールとの併用 . プールされた接続のクリーニング. . . . . . . . . 接続の管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 207 207 208 208 210 211 211 211 212 214 215 215 本章について この章では、IBM Informix JDBC ドライバの調整とトラブルシューティングに関す る情報を提供します。以下のトピックを扱います。 v JDBC API プログラムのデバッグ v パフォーマンスの管理 JDBC API プログラムのデバッグ SQLIDEBUG 接続プロパティを設定すると、バイナリ プロトコル トレースを生成 できます。接続プロパティ SQLIDEBUG を使用してファイルを指定します。次に例 を示します。 SQLIDEBUG=C:¥¥tmp¥¥ifxjdbctrace 接続ごとに、タイムスタンプの接尾辞が付加された、新規トレース ファイルが生成 されます。IfxDataSource インターフェイスを使用している場合は、 IfxDataSource.setIfxSQLIDEBUG (String fname) メソッドを使用できます。 JDBC JAR ファイルのデバッグ バージョンは、 IBM Informix JDBC ドライバ バージョ ン 3.00.JC1 以降には含まれていません。 重要: バイナリ SQLI プロトコル トレース機能 (SQLIDEBUG) は、IBM テクニカ ル サポート エンジニアにより指示された場合にのみ使用してください。 パフォーマンスの管理 このセクションでは、問合せのパフォーマンスに影響する可能性がある問題につい て説明します。 v FET_BUF_SIZE および BIG_FET_BUF_SIZE 環境変数 v ラージ オブジェクトのメモリ管理 v ネットワーク トラフィックの削減 © Copyright IBM Corp. 1996, 2008 207 v バルク挿入の使用 v 接続プールの調整 FET_BUF_SIZE および BIG_FET_BUF_SIZE 環境変数 SELECT 文が Java プログラムから Informix データベースに送信されると、戻され た行 (またはタプル) は IBM Informix JDBC ドライバのタプル バッファに格納さ れます。 タプル バッファのデフォルトのサイズは、戻されたタプルのサイズと 4096 バイトのどちらか大きい方です。 Informix FET_BUF_SIZE 環境変数を使用して、タプル バッファのデフォルトのサ イズを上書きできます。 FET_BUF_SIZE は、32,767 以下の任意の正整数に設定で きます。FET_BUF_SIZE 環境変数が設定されており、その値がデフォルトのタプル バッファ サイズよりも大きい場合、タプル バッファ サイズは FET_BUF_SIZE の 値に設定されます。 Extended Parallel Server IBM Informix Extended Parallel Server バージョン 8.4 では、BIG_FET_BUF_SIZE 接続プロパティを使用して、タプル バッファのデフォルトのサイズを上書きできま す。XPS サーバでは、フェッチ バッファ サイズを 2 GB まで増やすことができま す。 BIG_FET_BUF_SIZE は、2 GB 以下の任意の正整数に設定できます。 BIG_FET_BUF_SIZE 環境変数が設定されており、その値がデフォルトのタプル バ ッファ サイズよりも大きい場合、タプル バッファ サイズは BIG_FET_BUF_SIZE の値に設定されます。 IBM Informix Extended Parallel Server バージョン 8.4 で は、これが、複数のコサーバにフラグメント化された表に対する挿入カーソルのパ フォーマンスの向上に役立つ場合があります。 Extended Parallel Server の終り タプル バッファのサイズを増加させると Java プログラムとデータベースとの間の ネットワーク トラフィックが削減される可能性があり、多くの場合問合せのパフォ ーマンスが向上します。 ただし、タプル バッファのサイズを増加させると、実際 には問合せのパフォーマンスが低下する場合もあります。これは、Java プログラム にデータベースへのアクティブな接続が多数ある場合、またはコンピュータ上のス ワップ領域が制限されている場合に起こる可能性があります。 これがご使用の Java プログラムまたはコンピュータに該当する場合は、FET_BUF_SIZE または BIG_FET_BUF_SIZE 環境変数を使用してタプル バッファのサイズを増加させない でください。 Informix 環境変数の設定の詳細については、 15 ページの『第 2 章 データベースへ の接続』を参照してください。 フェッチ バッファ サイズの増加の詳細について は、「IBM Informix SQL ガイド: リファレンス」を参照してください。 ラージ オブジェクトのメモリ管理 ラージ オブジェクト (バイト (BYTE) 型、テキスト (TEXT) 型、BLOB 型、また は CLOB 型) がデータベース サーバから取り出されるときは必ず、そのデータは メモリにキャッシュされるか、一時ファイルに保管されます (メモリ バッファを超 208 IBM Informix JDBC ドライバ プログラマーズ ガイド える場合)。JDBC アプレットは、ローカル コンピュータ上に一時ファイルを作成し ようとする場合、セキュリティ違反を引き起こす可能性があります。この場合は、 ラージ オブジェクト全体をメモリに格納する必要があります。 環境変数 LOBCACHE を使用して、ラージ オブジェクト データの保管方法を指定 できます。この環境変数は、次のように接続プロパティ リストに組み込みます。 v データを保持するためにメモリ内に割り当てる最大バイト数を設定するには、 LOBCACHE 値をそのバイト数に設定します。 データ サイズが LOBCACHE 値を超える場合、データは一時ファイルに格納さ れます。このファイルの作成中にセキュリティ違反が発生した場合は、データは メモリ内に格納されます。 v データを常にファイルに格納するには、LOBCACHE の値を 0 に設定します。 この場合、セキュリティ違反が発生しても、IBM Informix JDBC ドライバはデー タをメモリ内に格納しようとしません。この設定は未署名のアプレットに対して はサポートされていません。詳しくは、11 ページの『アプレットでのドライバの 使用』を参照してください。 v データを常にメモリに格納するには、LOBCACHE の値を負の数値に設定しま す。 必要なメモリ量を使用できない場合、IBM Informix JDBC ドライバは SQLException メッセージ「メモリ不足です」を呼び出します。 LOBCACHE のサイズが無効、または定義されていない場合、デフォルトのサイズ は 4096 です。 LOBCACHE 値は、次のようにデータベース URL を使用して設定できます。 URL = jdbc:informix-sqli://158.58.9.37:7110/test:user=guest; password=iamaguest;informixserver=oltapshm; lobcache=4096"; この例は、サイズが 4096 バイト以下の場合にラージ オブジェクトをメモリに格納 します。ラージ オブジェクトが 4096 バイトを超える場合、IBM Informix JDBC ドライバは一時ファイルの作成を試みます。セキュリティ違反が発生した場合は、 ラージ オブジェクト全体に対してメモリが割り当てられます。それが失敗すると、 ドライバは SQLException メッセージを呼び出します。 次に別の例を示します。 URL = "jdbc:informix-sqli://icarus:7110/testdb: user=guest:passwd=whoknows;informixserver=olserv01;lobcache=0"; この例は、一時ファイルを使用して取り出されたラージ オブジェクトを格納しま す。 次に 3 つ目の例を示します。 URL = "jdbc:informix-sqli://icarus:7110/testdb:user=guest: passwd=whoknows;informixserver=olserv01;lobcache=-1"; この例は、常にメモリを使用して取り出されたラージ オブジェクトを格納します。 第 7 章 調整およびトラブルシューティング 209 Java プログラムでのテキスト (TEXT) 型とバイト (BYTE) 型の使用方法に関するプ ログラミング情報については、93 ページの『バイト (BYTE) 型とテキスト (TEXT) 型』を参照してください。 Java プログラムでの BLOB 型と CLOB 型の使用方法 に関するプログラミング情報については、118 ページの『スマート ラージ オブジ ェクト データ型』を参照してください。 ネットワーク トラフィックの削減 2 つの環境変数 OPTOFC および IFX_AUTOFREE を使用して、Statement オブジ ェクトおよび ResultSet オブジェクトをクローズするときのネットワーク トラフィ ックを削減できます。 対象となるすべての行がすでにクライアントのタプル バッファに抽出されている場 合に、ResultSet.close() メソッドがネットワーク ラウンド トリップを必要としない ことを指定するには、OPTOFC を 1 に設定します。データベース サーバは、すべ ての行が抽出された後で、自動的にカーソルをクローズします。 次の ResultSet.next() メソッドが呼び出される前に、IBM Informix JDBC ドライバ がクライアントのタプル バッファに追加の行を持っている場合も、持っていない場 合もあります。したがって、IBM Informix JDBC ドライバがデータベース サーバ からすべての行を受信した場合を除き、OPTOFC が 1 に設定されていても ResultSet.close() メソッドがネットワーク ラウンド トリップを必要とする可能性が あります。 カーソルがすでにデータベース サーバでクローズされている場合に、 Statement.close() メソッドが、データベース サーバのカーソル リソースを解放す るためにネットワーク ラウンド トリップを必要としないことを指定するには、 IFX_AUTOFREE を 1 に設定します。 また、setAutoFree(boolean flag) メソッドおよび getAutoFree() メソッドを使用し てデータベース サーバのカーソル リソースを解放することもできます。詳しく は、79 ページの『自動解放機能の使用』を参照してください。 ResultSet.close() メソッドで明示的に、または OPTOFC 環境変数により暗黙的にカ ーソルがクローズされた後、データベース サーバが自動的にカーソル リソースを 解放します。 カーソル リソースが解放されると、もうそのカーソルを参照することはできませ ん。 OPTOFC および IFX_AUTOFREE 環境変数の使用例については、 217 ページの 『付録 A. サンプル コード ファイル』に記述されているデモンストレーション 例、autofree.java および optofc.java を参照してください。これらの例では、 Properties.put() メソッドを使用して変数が設定されます。 Informix 環境変数の設定の詳細については、26 ページの『IBM Informix JDBC ド ライバ での Informix 環境変数の使用』を参照してください。 210 IBM Informix JDBC ドライバ プログラマーズ ガイド バルク挿入の使用 バルク挿入機能は、複数回、複数の値設定で実行される、単一の INSERT 文のパフ ォーマンスを向上させます。詳しくは、59 ページの『バルク挿入の実行』を参照し てください。 接続プールの使用 アプリケーションのパフォーマンスとスケーラビリティを向上させるために、 ConnectionPoolDataSource オブジェクトを参照する DataSource オブジェクトを介 してデータベース サーバへの接続を取得できます。IBM Informix JDBC ドライバ は、ConnectionPoolDataSource オブジェクトの透過的なコンポーネントとして、 Connection Pool Manager を提供しています。 Connection Pool Manager は、クロー ズ時に接続をデータベース サーバに戻すのではなく、クローズされた接続をプール に保持します。ユーザが新規接続を要求すると必ず、Connection Pool Manager は接 続をプールから取得し、サーバが接続をクローズして再オープンするというオーバ ーヘッドを回避します。 ConnectionPoolDataSource オブジェクトを使用すると、アプリケーションが頻繁で 定期的な接続要求を受信するような場合には、パフォーマンスが大幅に向上する可 能性があります。 DataSource または ConnectionPoolDataSource オブジェクトの使用方法および使用 理由の詳細については、Sun Microsystems が提供する JDBC 3.0 API を参照してく ださい (Web サイト http://java.sun.com. で入手可能)。 重要: この機能は、接続プールがトランザクション マネージャによって処理される ことを前提に動作する IfxXAConnectionPoolDataSource には影響しません。 以下のセクションでは、IBM Informix JDBC ドライバで接続プールを使用する方法 について説明します。 v 次の、『ConnectionPoolDataSource オブジェクトの配置』 v 212 ページの『Connection Pool Manager の調整』 v 214 ページの『高可用性データ レプリケーションの接続プールとの併用』 v 215 ページの『プールされた接続のクリーニング』 ConnectionPoolDataSource オブジェクトの配置 以下の手順では、次のようになっています。 v 変数 cpds は、ConnectionPoolDataSource オブジェクトを指します。 v ConnectionPoolDataSource オブジェクトに対する JNDI 論理名は、myCPDS で す。 v 変数 ds は、DataSource オブジェクトを指します。 v DataSource オブジェクトに対する論理名は、DS_Pool です。 ConnectionPoolDataSource オブジェクトを配置するには: 1. IfxConnectionPoolDataSource オブジェクトをインスタンス化します。 2. オブジェクトに対して必要な調整プロパティを設定します。 第 7 章 調整およびトラブルシューティング 211 cpds.setIfxCPMInitPoolSize(15); cpds.setIfxCPMMinPoolSize(2); cpds.setIfxCPMMaxPoolSize(20); cpds.setIfxCPMServiceInterval(30); 3. JNDI を使用して ConnectionPoolDataSource オブジェクトを登録し、論理名を オブジェクトにマップします。 Context ctx = new InitialContext(); ctx.bind("myCPDS",cpds); 4. IfxDataSource オブジェクトをインスタンス化します。 5. DataSource オブジェクトを、ConnectionPoolDataSource オブジェクトに対して 登録した論理名と関連付けます。 ds.setDataSourceName("myCPDS",ds); 6. JNDI を使用して DataSource オブジェクトを登録します。 Context ctx = new InitialContext(); ctx.bind("DS_Pool",ds); Connection Pool Manager の調整 配置フェーズで、ユーザまたはデータベース管理者は、Connection Pool Manager の 以下のようなプロパティ値を設定することにより、アプリケーションにおける接続 プールの機能を制御できます。 v IFMX_CPM_INIT_POOLSIZE により、ConnectionPoolDataSource オブジェクトが 初めてインスタンス化され、プールが初期化されたときに、プールに割り当てる 初期接続数を指定できます。デフォルトは 0 です。 ConnectionPoolDataSource オブジェクトが初めてインスタンス化されたときにア プリケーションが多くの接続を必要とする場合は、このプロパティを設定しま す。 値を取得するには、getIfxCPMInitPoolSize() を呼び出します。 値を設定するには、setIfxCPMInitPoolSize (int init) を呼び出します。 v IFMX_CPM_MAX_CONNECTIONS により、DataSource オブジェクトとサーバと の間に確立できる最大同時物理接続数を指定できます。 値 -1 は、数が無制限であることを指定します。デフォルトは -1 です。 値を取得するには、getIfxCPMMaxConnections() を呼び出します。 値を設定するには、setIfxCPMMaxConnections(int limit) を呼び出します。 v IFMX_CPM_MIN_POOLSIZE により、プールで保持する最小接続数を指定できま す。プールに保持されているこの最小接続数が経過時間制限を超えたときに行う べき処理については、IFMX_CPM_MIN_AGELIMIT パラメータを参照してくださ い。デフォルトは 0 です。 値を取得するには、getIfxCPMMinPoolSize() を呼び出します。 値を設定するには、setIfxCPMMinPoolSize(int min) を呼び出します。 v IFMX_CPM_MAX_POOLSIZE により、プールで保持する最大接続数を指定できま す。プールがこのサイズに達すると、すべての接続がサーバに戻されます。デフ ォルトは 50 です。 212 IBM Informix JDBC ドライバ プログラマーズ ガイド 値を取得するには、getIfxCPMMaxPoolSize() を呼び出します。 値を設定するには、setIfxCPMMaxPoolSize(int max) を呼び出します。 v IFMX_CPM_AGELIMIT により、空き接続が空き接続プール内に保持される時間 を、秒単位で指定できます。 デフォルトは -1 で、クライアントが終了するまで空き接続が保持されることを 意味します。 値を取得するには、getIfxCPMAgeLimit() を呼び出します。 値を設定するには、setIfxCPMAgeLimit(long limit) を呼び出します。 v IFMX_CPM_MIN_AGELIMIT により、接続要求が受信されないときに空き接続プ ール内の接続が保持される追加時間を、秒単位で指定できます。 この設定を使用して、接続要求が行われない期間があると予期されるときにプー ルに保持されるリソースを削減します。値 0 は、最小プールにある接続に追加の 時間が与えられないことを示します。IFMX_CPM_AGELIMIT を超えると接続は 必ずサーバに解放されます。 デフォルトは -1 で、クライアントが終了するまで最小数の空き接続が保持され ることを意味します。 値を取得するには、getIfxCPMMinAgeLimit() を呼び出します。 値を設定するには、setIfxCPMAgeMinLimit(long limit) を呼び出します。 v IFMX_CPM_SERVICE_INTERVAL により、プール サービスの頻度を、ミリ秒単 位で指定できます。 プール サービスの動作には、空き接続の追加 (空き接続数が最小値を下回った場 合) および空き接続の除去が含まれます。デフォルトは 50 です。 値を取得するには、getIfxCPMServiceInterval() を呼び出します。 値を設定するには、setIfxCPMServiceInterval (long interval) を呼び出します。 v IFMX_CPM_ENABLE_SWITCH_HDRPOOL により、HDR データベース サーバ ペアの主接続プールと副接続プール間の自動切替えを許可するかどうかを指定で きます。 アプリケーションが接続プールを使用した高可用性データ レプリケーションに依 存している場合は、このプロパティを設定します。デフォルトは false です。 値を取得するには、getIfxCPMSwitchHDRPool() を呼び出します。 値を設定するには、setIfxCPMSwitchHDRPool(boolean flag) を呼び出します。 JDBC ドライバのインストール場所の demo ディレクトリ内の connection-pool デ ィレクトリに、デモンストレーション プログラムがあります。HDR での接続プー ルの使用については、demo ディレクトリ内の hdr ディレクトリに、デモンストレ ーション プログラムがあります。これらのファイルの詳細については、付録 A を 参照してください。 第 7 章 調整およびトラブルシューティング 213 これらのプロパティの中には、Sun JDBC 3.0 のプロパティと重複するものもありま す。次の表に、Sun JDBC 3.0 のプロパティと、それらに相当する Informix のプロ パティをリストします。 Sun JDBC プロパティ名 Informix プロパティ名 initialPoolSize IFMX_CPM_INIT_POOLSIZE maxPoolSize IFMX_CPM_MAX_POOLSIZE minPoolSize IFMX_CPM_MIN_POOLSIZE maxIdleTime IFMX_CPM_AGELIMIT 注 maxPoolSize の場合、0 は最大 サイズがないことを示します。 IFMX_CPM_MAX_ POOLSIZE の場合、値を指定す る必要があります。 maxIdleTime の場合、0 は時間 制限がないことを示します。 IFMX_CPM_ AGELIMIT の場合、-1 は時間 制限がないことを示します。 以下の Sun JDBC 3.0 プロパティはサポートされていません。 v maxStatements v propertyCycle 高可用性データ レプリケーションの接続プールとの併用 接続プールの IBM Informix JDBC ドライバ インプリメンテーションでは、HDR ペアのデータベース サーバとの接続をプールできます。 v 主プールには HDR ペアの主サーバへの接続が含まれます。 v 副プールには HDR ペアの副サーバへの接続が含まれます。 HDR と接続プールを併用するためにアプリケーション コードを変更する必要はあ りません。2 つのプール間の切替えを有効にするには、 IFMX_CPM_ENABLE_SWITCH_HDRPOOL プロパティを true に設定します。切替 えが有効である場合、Connection Pool Manager は適切な接続プールの妥当性を検査 してアクティブにします。 主サーバに障害が発生した場合、Connection Pool Manager は副プールをアクティブ にします。副プールがアクティブである場合、Connection Pool Manager は、主サー バが稼働しているかどうかを確認するためにプールの状態を検証します。主サーバ が稼働している場合、Connection Pool Manager は新規接続を主サーバに切り替え、 アクティブ プールを主プールに設定します。 IFMX_CPM_ENABLE_SWITCH_HDRPOOL が false に設定されている場合、 activateHDRPool_Primary() メソッドまたは activateHDRPool_Secondary() メソッ ドを呼び出すことにより、強制的に他の接続プールに切り替えることができます。 public void activateHDRPool_Primary(void) throws SQLException public void activateHDRPool_Secondary(void) throws SQLException 214 IBM Informix JDBC ドライバ プログラマーズ ガイド activateHDRPool_Primary() メソッドは、主接続プールがアクティブな接続プールに なるように切り替えます。activateHDRPool_Secondary() メソッドは、副接続プール がアクティブな接続プールになるように切り替えます。 isReadOnly()、isHDREnabled()、および getHDRtype() の各メソッドを接続プールと ともに使用できます (38 ページの『読取り専用状態の検査』を参照)。 IBM Informix JDBC ドライバのインストール場所の demo ディレクトリ内の hdr ディレクトリに、デモンストレーション プログラムがあります。これらのファイル の詳細については、付録 A を参照してください。 プールされた接続のクリーニング AUTOCOMMIT や TRANSACTION ISOLATION などのデータベース プロパティを 設定することにより、接続をオリジナルのデフォルト プロパティから変更できま す。接続がクローズされると、これらのプロパティはデフォルト値に戻されます。 ただし、プールされた 接続は、プールに戻されたときに自動的にはデフォルト プ ロパティに戻されません。 IBM Informix JDBC ドライバでは、scrubConnection() メソッドを呼び出して、以 下を行うことができます。 v データベース プロパティと接続レベル プロパティをデフォルト値にリセットす る。 v オープンされているカーソルとトランザクションをクローズする。 v すべての文を保存する。 これで、アプリケーション サーバが文をキャッシュすることが可能になり、アプリ ケーションやセッション間でそれを使用してエンド ユーザ アプリケーションによ り良いパフォーマンスを提供することができます。 scrubConnection() メソッドのシグニチャは次のとおりです。 public void scrubConnection() throws SQLException 次の例は、scrubConnection() を呼び出す方法を示しています。 try { IfmxConnection conn = (IfmxConnection)myConn; conn.scrubConnection(); } catch (SQLException e) { e.printStackTrace(); } 次のメソッドは、scrubConnection() の呼出しがすべての文を解放したかどうかを検 査します。 public boolean scrubConnectionReleasesAllStatements() 接続の管理 次の表は、connection.close() メソッドと scrubConnection() メソッドの異なるイン プリメンテーションを、接続プールがセットアップされている場合とセットアップ されていない場合とで対比しています。 第 7 章 調整およびトラブルシューティング 215 connection.close() メソッド の動作 scrubconnection() メソッド の動作 接続プールがセットアップされ ていない データベース接続、すべての 関連した文オブジェクト、お よびそれらの結果セットをク ローズします。接続は無効に なります。 接続をデフォルトの状態に戻 し、オープンされている文を 保持しますが、結果セットは クローズします。接続はまだ 有効です。結果セットに関連 付けられたリソースのみを解 放します。 Informix インプリメンテーショ ンでの接続プール データベースへの接続をクロ ーズしてから再オープンし、 接続オブジェクトに関連付け られたすべての文をクローズ して接続を元の状態にリセッ トします。その後接続オブジ ェクトは接続プールに戻さ れ、新規アプリケーション接 続により要求されたときに使 用できます。 接続をデフォルトの状態に戻 し、オープンされているすべ ての文を保持しますが、すべ ての結果セットはクローズし ます。ここでこのメソッドを 呼び出すことは推奨されませ ん。 AppServer インプリメンテーシ ョンでの接続プール ユーザの接続プール インプ 接続をデフォルトの状態に戻 リメンテーションにより定義 し、オープンされている文を 保持しますが、結果セットは されます。 クローズします。 接続プールの状態 216 IBM Informix JDBC ドライバ プログラマーズ ガイド 付録 A. サンプル コード ファイル この付録には、IBM Informix JDBC ドライバのクライアント サイド バージョンで 提供されているコード例をリストし、簡単に説明している表が含まれています。 これらの例のほとんどは、接続 URL の構文を変更することにより、サーバ サイド JDBC で動作するようにできます。詳しくは、21 ページの『データベース URL の フォーマット』を参照してください。 tools/udtudrmgr ディレクトリおよび demo/xml ディレクトリ内の例は、2.2 リリー スではクライアント サイド JDBC のみを対象にしています。 使用可能な例の概要 例は、2 つのディレクトリ内に提供されています。 v IBM Informix JDBC ドライバ ソフトウェアをインストールした demo ディレク トリ v demo ディレクトリ下の tools ディレクトリ demo ディレクトリ内の例 各例にはそれぞれのサブディレクトリがあります。ほとんどのディレクトリには、 その例と実行方法について説明する README ファイルが含まれています。 ディレクトリ 例のタイプ basic 一般的なデータベース操作を示す例 clob-blob スマート ラージ オブジェクトを使用する例 udt-distinct 不透明 (OPAQUE) 型とディスティンクト (DISTINCT) 型を使用する例 (225 ページの 『udtudrmgr ディレクトリ内の例』に、不透明 (OPAQUE) 型を使用する追加例があります。) complex-types 行 (ROW) 型とコレクション (COLLECTION) 型を 使用する例 rmi リモート メソッド起動を使用する例 stores7 stores7 デモンストレーション データベース pickaseat DataSource オブジェクトを使用する例 connection-pool 接続プールの使用方法を示す例 proxy HTTP プロキシ サーバの使用方法を示す例 xml XML 文書の格納方法と抽出方法を示す例 hdr 高可用性データ レプリケーションの使用方法を示 す例 © Copyright IBM Corp. 1996, 2008 217 basic ディレクトリ内の例 次の表に basic ディレクトリ内のファイルをリストします。 デモ プログラム名 説明 autofree.java IFX_AUTOFREE 環境変数の使用方法を示します。 BatchUpdate.java バッチの更新をサーバに送信する方法を示します。 ByteType.java バイト (BYTE) 型の列を含む表への挿入方法とその 表からの選択方法を示します。 CallOut1.java CallableStatement メソッドを使用して、OUT パラ メータを持つ C 関数を実行します。 CallOut2.java CallableStatement メソッドを使用して、OUT パラ メータを持つ SPL 関数を実行します。 CallOut3.java IfmxCallableStatement.IfxRegisterOut Parameter() メソッドを使用して、ブール (BOOLEAN) 型の OUT パラメータを持つ C 関数 を実行します。 CallOut4.java CLOB 型の OUT パラメータを持つ C 関数を実行 し、 IfmxCallableStatement.hasOutParameter() メ ソッドを使用します。 CreateDB.java testDB というデータベースを作成します。 DBCENTURYSelect.java getString() メソッドを使用して、4 桁の年の拡張が DBCENTURY プロパティ値に基づく日付ストリン グ表現を抽出します。 DBCENTURYSelect2.java 文字列からバイナリへの変換を使用して、4 桁の年 の拡張が DBCENTURY プロパティ値に基づく日付 ストリング表現を抽出します。 getDate() メソッドを使用して、日付ストリング表 現が基づく java.sql.Date オブジェクトを作成しま す。 DBCENTURYSelect3.java 文字列からバイナリへの変換を使用して、4 桁の年 の拡張が DBCENTURY プロパティ値に基づく日付 ストリング表現を抽出します。 getTimestamp() メソッドを使用して、日付ストリン グ表現が基づく java.sql.Timestamp オブジェクトを 作成します。 DBCENTURYSelect4.java バイナリから文字列への変換を使用して、4 桁の年 の拡張が DBCENTURY プロパティ値に基づく日付 ストリング表現を抽出します。 getDate() メソッドを使用して、日付ストリング表 現が基づく java.sql.Date オブジェクトを作成しま す。 DBCENTURYSelect5.java 218 IBM Informix JDBC ドライバ プログラマーズ ガイド バイナリから文字列への変換を使用して、4 桁の年 の拡張が DBCENTURY プロパティ値に基づく日付 ストリング表現を抽出します。 getTimestamp() メソッドを使用して、日付ストリン グ表現が基づく java.sql.Timestamp オブジェクトを 作成します。 DBConnection.java データベースとデータベース サーバの両方に接続 します。 DBDATESelect.java URL 文字列の DBDATE プロパティ値に基づい て、日付オブジェクトおよび日付ストリング表現を データベースから抽出する方法を示します。 DBMetaData.java DatabaseMetaData インターフェイスを使用してデ ータベースに関する情報を抽出する方法を示しま す。 DropDB.java testDB というデータベースを削除します。 ErrorHandling.java RSAM エラー メッセージの抽出方法を示します。 GLDATESelect.java URL 文字列の GL_DATE プロパティ値に基づい て、日付オブジェクトおよび日付ストリング表現を データベースから抽出する方法を示します。 Intervaldemo.java Informix 時間隔 (INTERVAL) 型データの挿入方法 と選択方法を示します。 LOCALESelect.java URL 文字列の CLIENT_LOCALE プロパティ値に 基づいて、日付オブジェクトおよび日付ストリング 表現をデータベースから抽出する方法を示します。 locmsg.java ローカライズされたエラー メッセージをサポート する Informix の拡張メソッドを使用する方法を示 します。 MultiRowCall.java ストアド プロシジャ呼出しで複数の行を戻す方法 を示します。 OptimizedSelect.java FET_BUF_SIZE 環境変数を使用して IBM Informix JDBC ドライバのタプル バッファ サイズを調整す る方法を示します。 optofc.java OPTOFC 環境変数の使用方法を示します。 PropertyConnection.java プロパティ リストを使用して接続環境変数を指定 する方法を示します。 RSMetaData.java ResultSetMetaData インターフェイスを使用して結 果セットに関する情報を抽出する方法を示します。 ScrollCursor.java スクロール カーソルを使用して結果セットを抽出 する方法を示します。 Serial.java Informix シリアル (SERIAL) 型および SERIAL8 型 のデータの挿入方法と選択方法を示します。 SimpleCall.java ストアド プロシジャを呼び出す方法を示します。 付録 A. サンプル コード ファイル 219 SimpleConnection.java データベースまたはデータベース サーバへの接続 方法を示します。 SimpleSelect.java データベース サーバに単純な SELECT 問合せを送 信する方法を示します。 TextConv.java ファイルをクライアント コード セットから Unicode に変換し、その後、Unicode からデータベ ース コード セットに変換する方法を示します。 TextType.java テキスト (TEXT) 型の列を含む表への挿入方法とそ の表からの選択方法を示します。 UpdateCursor1.java 問合せで ROWID 列を使用して更新可能なスクロー ル カーソルを作成する方法を示します。 UpdateCursor2.java 問合せでシリアル (SERIAL) 型列を使用して更新可 能なスクロール カーソルを作成する方法を示しま す。 UpdateCursor3.java 問合せで主キー列を使用して更新可能なスクロール カーソルを作成する方法を示します。 clob-blob ディレクトリ内の例 次の表に clob-blob ディレクトリ内のファイルをリストします。 220 デモ プログラム名 説明 demo1.java BLOB 型列と CLOB 型列を使用する 2 つの表を作 成し、データを比較する方法を示します。 demo2.java バイト (BYTE) 型列とテキスト (TEXT) 型列を使 用する 1 つ目の表と、BLOB 型列と CLOB 型列を 使用する 2 つ目の表を作成し、データを比較する 方法を示します。 demo3.java BLOB 型列と CLOB 型列を使用する 1 つ目の表 と、バイト (BYTE) 型列とテキスト (TEXT) 型列 を使用する 2 つ目の表を作成し、データを比較す る方法を示します。 demo4.java バイト (BYTE) 型列とテキスト (TEXT) 型列を使 用する 2 つの表を作成し、データを比較する方法 を示します。 demo5.java ファイルから BLOB 型の表列にデータを格納する 方法を示します。 demo6.java スマート ラージ オブジェクト データの一部を読 み込む方法を示します。 demo_11.java データをファイルからバッファに読み込み、バッフ ァの内容をスマート ラージ オブジェクトに書き込 む方法を示します。 demo_13.java データをスマート ラージ オブジェクトに書き込ん でから、そのスマート ラージ オブジェクトを表に 挿入する方法を示します。 IBM Informix JDBC ドライバ プログラマーズ ガイド demo_14.java スマート ラージ オブジェクト データを表から取 り出す方法を示します。 udt-distinct ディレクトリ内の例 次の表に udt-distinct ディレクトリ内のファイルをリストします。(225 ページの 『udtudrmgr ディレクトリ内の例』に、不透明 (OPAQUE) 型を使用する追加例があ ります。) デモ プログラム名 説明 charattrUDT.java SQLData を使用して固定長の不透明 (OPAQUE) 型 を実装する方法を示します。 createDB.java 他の udt-distinct デモンストレーション ファイル が使用するデータベースを作成します。 createTypes.java データベースに不透明 (OPAQUE) 型とディスティ ンクト (DISTINCT) 型を作成する方法を示します。 distinct_d1.java SQLData を使用せずにディスティンクト (DISTINCT) 型を作成する方法を示します。 distinct_d2.java SQLData を使用せずに 2 つ目のディスティンクト (DISTINCT) 型を作成する方法を示します。 dropDB.java 他の udt-distinct デモンストレーション ファイル が使用するデータベースを削除します。 largebinUDT.java SQLData を使用して不透明 (OPAQUE) 型 (スマー ト ラージ オブジェクト埋込み) を実装する方法を 示します。 manualUDT.java 入力ストリーム内での位置を変更できるようにする 不透明 (OPAQUE) 型を実装する方法を示します。 myMoney.java SQLData を使用してディスティンクト (DISTINCT) 型を実装する方法を示します。 udt_d1.java 固定長の不透明 (OPAQUE) 型を作成する方法を示 します。 udt_d2.java スマート ラージ オブジェクトが埋め込まれている 不透明 (OPAQUE) 型を作成する方法を示します。 udt_d3.java 入力ストリーム内での位置を変更できるようにする 不透明 (OPAQUE) 型を作成する方法を示します。 complex-types ディレクトリ内の例 次の表に complex-types ディレクトリ内のファイルをリストします。 デモ プログラム名 説明 createDB.java 名前付き行を持つデータベースを作成します。 list1.java java.sql.Array および java.util.Collection の両方の クラスを使用して、単純なコレクションの挿入と選 択を行います。 付録 A. サンプル コード ファイル 221 list2.java ネストされた行要素を持つコレクションの挿入と選 択を行います。 コレクションに対しては java.sql.Array と java.util.Collection の両方のクラス、ネストされた 行に対しては SQLData と Struct の両方のインタ ーフェイスを使用します。 r1_t.java 名前付き行 r1_t に対して SQLData クラスを定義 します。 r2_t.java 名前付き行 r2_t に対して SQLData クラスを定義 します。 GenericStruct.java 名前付き行または名前なし行に挿入するための java.sql.Struct オブジェクトをインスタンス化しま す。 row1.java SQLData と Struct の両方のインターフェイスを使 用して、単純な名前付き行を挿入および選択しま す。 row2.java SQLData と Struct の両方のインターフェイスを使 用して、入れ子コレクションを持つ名前付き行を挿 入および選択します。 SQLData インターフェイスは、Informix の IfmxComplexSQLOutput.writeObject() および IfmxComplexSQLOutput.readObject() 拡張メソッド を使用して、入れ子コレクションの書込みと読込み を行います。 row3.java 入れ子コレクションを持つ名前なし行の挿入と選択 を行います。 fullname.java 名前付き行 fullname_t に対する SQLData クラス を含みます。 ファイル demo1.java および demo2.java で使用さ れます。 222 person.java 名前付き行 person_t に対する SQLData クラスを 含みます。ファイル demo1.java および demo2.java で使用されます。 demo1.java 名前付き行を SQLData オブジェクトに取り出しま す。 demo2.java SQLData オブジェクトを名前付き行の列に挿入し ます。 demo3.java 名前なし行の列を Struct オブジェクトに取り出し ます。 demo4.java Struct オブジェクトを名前付き行の列に挿入しま す。 IBM Informix JDBC ドライバ プログラマーズ ガイド demo5.java Informix セット (SET) 型の列を java.util.HashSet オブジェクトに取り出します。 demo6.java Informix セット (SET) 型の列を java.util.TreeSet オブジェクトに取り出します。 デフォルトを上書きするためにカスタマイズされた 型マッピングが用意されています。 demo7.java java.util.HashSet オブジェクトを Informix セット (SET) 型の列に挿入します。 demo8.java Informix セット (SET) 型の列を java.sql.Array オ ブジェクトに取り出します。 dropDB.java データベースを削除します。 proxy ディレクトリ内の例 次の表に proxy ディレクトリ内のファイルをリストします。ディレクトリ内の README ファイルにセットアップ情報が含まれています。 デモ プログラム名 説明 ProxySelect.java (アプリケーション) サンプル データベースを作成 し、次の 4 つのシナリオを使用してそのデータベ ースに接続します。 v プロキシ サーバを使用し、LDAP サーバを使用 しない接続 v LDAP サーバを使用し、プロキシ サーバを使用 しない接続 v sqlhosts ファイルを使用した接続 v proxy.sh 直接接続 (プロキシ サーブレット、sqlhosts フ ァイル、または LDAP サーバを使用しない) (シェル スクリプト) ProxySelect.java を起動しま す。スクリプト (およびデモ) を実行するには、次 のように入力します。 proxy.sh -d ProxySelect -s 2 proxy.java (アプレット) アプレットから、ProxySelect.java と 同じ操作を実行します。アプレットを実行するに は、次のように入力します。 appletviewer proxy.html proxy.html proxy.java 用の HTML ファイル ifmx.conf サンプル LDAP 構成ファイル ifmx.ldif サンプル LDAP ldif ファイル connection-pool ディレクトリ内の例 次の表に connection-pool ディレクトリ内のファイルをリストします。ディレクトリ 内の README ファイルにセットアップ情報が含まれています。 デモ プログラム名 説明 付録 A. サンプル コード ファイル 223 AppSimulator.java DataSource 接続を行う複数のクライアント スレッ ドをシミュレートします。 SetupDB.java サンプル データベースを構築します。サンプル実 行コマンドについては、コードの先頭にあるコメン トを参照してください。 DS_Pool.prop 接続プール アプリケーション用のプロパティをリ ストします。 myCPDS.prop 接続プール アプリケーション用のプロパティを、 オプションの調整パラメータも含めてリストしま す。 DS_no_Pool.prop 接続プールを使用しないアプリケーション用のプロ パティをリストします。 Register.java DataSource オブジェクトを JNDI ネーム レジスト リに登録します。 サンプル実行コマンドは次のとおりです。 java Register DS_no_Pool /tmp runDemo (シェル スクリプト) サンプル データベースを構築 します。データ ソース DS_no_Pool および DS_Pool を登録します。アプリケーションを実行し て、サンプル データベースに接続する複数クライ アント スレッドをシミュレートします。 xml ディレクトリ内の例 次の表に xml ディレクトリ内のファイルをリストします。 デモ プログラム名 説明 CreateDB.java サンプル データベースを作成します。 makefile 例をコンパイルします。 myHandler.java SAX パーサ用のコールバック ルーチンのサンプル クラス sample1.xml 単純な XML スライド sample2.xml XML スライドのサンプル セット sample2.dtd sample1.xml に対する文書タイプ定義 xmldemo1.java XMLtoString()、getInputSource()、および myHandler.java を使用して sample1.xml の XML を InputSource オブジェクトに変換し、その後 SAX パーサを使用して構文解析します。 hdr ディレクトリ内の例 次の表に hdr ディレクトリ内のファイルをリストします。ディレクトリ内の README ファイルにセットアップ情報が含まれています。 224 デモ プログラム名 説明 SetupDB.java サンプル データベースと表を作成します。 IBM Informix JDBC ドライバ プログラマーズ ガイド Register.java DS_no_Pool および DS_Pool DataSource オブジェ クトを JNDI ネーム レジストリに登録します。サ ンプル実行コマンドは次のとおりです。 java Register DS_no_Pool /tmp AppSimulator.java DataSource.getConnection() メソッドで作成された 接続 (プールされた接続とプールされていない接続) に対して高可用性データ レプリケーションのリダ イレクトをシミュレートします。 HdrSimpleConnect.java DriverManager.getConnection() メソッドを使用して HDR リダイレクトを実装する方法を示します。 tools ディレクトリ内の例 tools ディレクトリには以下のサブディレクトリが含まれています。 v udtudrmgr ディレクトリには、UDT と UDR Manager を使用して、不透明 (OPAQUE) 型と UDR を作成する例が含まれています。 v classgenerator ディレクトリには、ClassGenerator ユーティリティのサンプル出 力ファイルが含まれています。 udtudrmgr ディレクトリ内の例 次の表に udtudrmgr ディレクトリ内のファイルをリストします。ディレクトリ内の README ファイルにセットアップ情報が含まれています。 デモ プログラム名 説明 createDB.java サンプル データベースを作成します。 dropDB.java サンプル データベースを削除します。 Circle.java (デモ アプリケーション 1) デフォルトの Input お よび Output 関数を使用して、Java 不透明 (OPAQUE) 型に変換する Java クラスを実装しま す。 PlayWithCircle.java (デモ アプリケーション 1) クライアント アプリケ ーションで Circle 不透明 (OPAQUE) 型を使用しま す。 Circle2.java (デモ アプリケーション 2) ユーザ指定の Input お よび Output 関数を使用して、Java 不透明 (OPAQUE) 型に変換する Java クラスを実装しま す。 PlayWithCircle2.java (デモ アプリケーション 2) クライアント アプリケ ーションで Circle2 不透明 (OPAQUE) 型を使用し ます。 MyCircle.java (デモ アプリケーション 3) 既存の Java クラスを 使用せずに固定長の不透明 (OPAQUE) 型を作成し ます。 Group1.java (デモ アプリケーション 4) 既存の Java クラスの メソッドを Java UDR にマップします。 付録 A. サンプル コード ファイル 225 PlayWithGroup1.java 226 IBM Informix JDBC ドライバ プログラマーズ ガイド (デモ アプリケーション 4) Group1.java の UDR をクライアント アプリケーションで使用します。 付録 B. DataSource 拡張機能 この付録には、標準 JDBC クラスに対する Informix 拡張セットがリストされてい ます。 v DataSource インターフェイスを実装する IfxDataSource クラス v ConnectionPoolDataSource インターフェイスを実装する IfxConnectionPoolDataSource クラス DataSource または ConnectionPoolDataSource オブジェクトの使用方法および使用 理由については、Sun Microsystems により提供される JDBC 3.0 API を参照してく ださい。この API は Web サイト (http://java.sun.com) で入手できます。 IBM Informix JDBC ドライバは、次の目的のための拡張機能を提供しています。 v プロパティの読取りと書込み v 標準プロパティの取得と設定 v Informix 接続プロパティの取得と設定 v 接続プール DataSource プロパティの取得と設定 プロパティの読取りと書込み プロパティの読取りと書込みを行うために、拡張された DataSource インターフェ イスには以下のメソッドが定義されています。これらのメソッドにより、既存の DataSource オブジェクトのプロパティ リストを編集して新規 DataSource オブジ ェクトを定義できます。 public Properties getDsProperties(); DataSource オブジェクトに含まれている Property オブジェクトを戻します。 public void addProp(String key, Object value); プロパティ リストにプロパティを追加します。 key パラメータは、追加するプロパティを指定します。 value パラメータは、プロパティの値です。 public Object getProp(String key); プロパティ リストからプロパティの値を取得します。 key パラメータは、取得するプロパティを指定します。 public void removeProperty(String key); プロパティ リストからプロパティを除去します。 key パラメータは、除去するプロパティを指定します。 public void readProperties(InputStream in) throws IOException; © Copyright IBM Corp. 1996, 2008 227 InputStream オブジェクトから DataSource オブジェクトにプロパティを読み込み ます。 in パラメータは、プロパティの読取り元の InputStream オブジェクトです。 入力ストリームからの読込み中に入出力 (I/O) エラーが検出されると、例外が発生 します。 public void writeProperties(OutputStream out) throws IOException; DataSource オブジェクトのプロパティを OutputStream オブジェクトに書き込みま す。 out パラメータは、プロパティの書込み先の OutputStream オブジェクトです。 出力ストリームへの書込み中に入出力 (I/O) エラーが検出されると、例外が発生し ます。 標準プロパティの取得と設定 Sun Microsystems の JDBC 3.0 API で定義されているプロパティの取得と設定を行 うために、拡張された DataSource インターフェイスには以下のメソッドが定義さ れています。 プロパティ getXXX() および setXXX() メソッド シグニチャ portNumber public int getPortNumber(); public void setPortNumber(int value); databaseName public String getDatabaseName(); public void setDatabaseName(String value); serverName public String getServerName(); public void setServerName(String value); user public String getUser(); public void setUser(String value); password public String getPassword(); public void setPassword(String value); description public String getDescription(); public void setDescription(String value); dataSourceName public String getDataSourceName(); public void setDataSourceName(String value); networkProtocol および roleName プロパティは、IBM Informix JDBC ドライバで はサポートされていません。 228 IBM Informix JDBC ドライバ プログラマーズ ガイド Informix 接続プロパティの取得と設定 Informix 環境変数の値の取得と設定を行うために、拡張された DataSource インタ ーフェイスには以下のメソッドが定義されています。 環境変数 getIfxXXX() および setIfxXXX() メソッド シグニチャ CLIENT_LOCALE public String getIfxCLIENT_LOCALE() public void setIfxCLIENT_LOCALE(String value) CSM public String getIfxCSM() public void setIfxCSM (String csm) DBANSIWARN public boolean isIfxDBANSIWARN() public void setIfxDBANSIWARN(boolean value) DBCENTURY public String getIfxDBCENTURY() public void setIfxDBCENTURY(String value) DBDATE public String getIfxDBDATE() public void setIfxDBDATE(String value) DB_LOCALE public String getIfxDB_LOCALE() public void setIfxDB_LOCALE(String value) DBSPACETEMP public String getIfxDBSPACETEMP() public void setIfxDBSPACETEMP(String value) DBTEMP public String getIfxDBTEMP() public void setIfxDBTEMP(String value) DBUPSPACE public String getIfxDBUPSPACE() public void setIfxDBUPSPACE(String value) DELIMIDENT public boolean isIfxDELIMIDENT() public void setIfxDELIMIDENT(boolean value) ENABLE_CACHE_TYPE public boolean isIfxENABLE_CACHE_TYPE() public void setIfxENABLE_CACHE_TYPE(boolean value) ENABLE_HDRSWITCH public booleangetIfxENABLE_HDRSWITCH() public void setIfxENABLE_HDRSWITCH(boolean value) FET_BUF_SIZE public int getIfxFET_BUF_SIZE() public void setIfxFET_BUF_SIZE(int value) GL_DATE public String getIfxGL_DATE() public void setIfxGL_DATE(String value) IFX_AUTOFREE public boolean isIfxIFX_AUTOFREE() public void setIfxIFX_AUTOFREE(boolean value) IFX_CODESETLOB public int getIfxIFX_CODESETLOB() public void setIfxIFX_CODESETLOB(int codesetlobFlag) IFX_DIRECTIVES public String getIfxIFX_DIRECTIVES() public void setIfxIFX_DIRECTIVES(String value) IFX_EXTDIRECTIVES public String getIfxIFX_EXTDIRECTIVES() public void setIfxIFX_EXTDIRECTIVES(String value) IFX_FLAT_UCSQ public int getIfxIFX_FLAT_UCSQ() public void setIfxIFX_FLAT_UCSQ(int value) IFX_GET_SMFLOAT_AS_ FLOAT public boolean getIfxIFX_GET_SMFLOAT_AS_FLOAT() public void setIfxIFX_IFX_GET_SMFLOAT_AS_FLOAT(boolean value) 付録 B. DataSource 拡張機能 229 環境変数 getIfxXXX() および setIfxXXX() メソッド シグニチャ IFX_ISOLATION_LEVEL public String getIfxIFX_ISOLATION_LEVEL() public void setIfxIFX_ISOLATION_LEVEL (String iso_level) IFX_LOCK_MODE_WAIT public int getIfxIFX_LOCK_MODE_WAIT() public void setIfxIFX_LOCK_MODE_WAIT (int lock_time) IFX_SET_FLOAT_AS_ SMFLOAT public boolean getIfxIFX_SET_FLOAT_AS_SMFLOAT() public void setIfxIFX_SET_FLOAT_AS_SMFLOAT(boolean value) IFX_TRIMTRAILINGSPACES public int getIfxIFX_TRIMTRAILINGSPACES() public void setIfxIFX_TRIMTRAILINGSPACES(int value) IFXHOST public String getIfxIFXHOST() public void setIfxIFXHOST(String value) IFXHOST_SECONDARY public String getIfxIFXHOST_SECONDARY() public void setIfxIFXHOST_SECONDARY(String value) IFX_USEPUT public boolean isIfxIFX_USEPUT() public void setIfxIFX_USEPUT(boolean value) IFX_XASPEC public String getIfxIFX_XASPEC() (y または n のみを戻す) public void IfxIFX_XASPEC(String XASPEC_flag) (y、Y、n、または N のみ有効) IFX_XASTDCOMPLIANCE_ XAEND public int getIfxIFX_XASTDCOMPLIANCE_XAEND() public void setIfxIFX_XASTDCOMPLIANCE_ XAEND(int value) INFORMIXCONRETRY public int getIfxINFORMIXCONRETRY() public void setIfxINFORMIXCONRETRY(int value) INFORMIXCONTIME public int getIfxINFORMIXCONTIME() public void setIfxINFORMIXCONTIME(int value) INFORMIXOPCACHE public String getIfxINFORMIXOPCACHE() public void setIfxINFORMIXOPCACHE(String value) INFORMIXSERVER_ SECONDARY public String getIfxINFORMIXSERVER_SECONDARY() public void setIfxINFORMIXSERVER_SECONDARY(String value) INFORMIXSTACKSIZE public int getIfxINFORMIXSTACKSIZE() public void setIfxINFORMIXSTACKSIZE(int value) JDBCTEMP public String getIfxJDBCTEMP() public void setIfxJDBCTEMP(String value) LDAP_IFXBASE public String getIfxLDAP_IFXBASE() public void setIfxLDAP_IFXBASE(String value) LDAP_PASSWD public String getIfxLDAP_PASSWD() public void setIfxLDAP_PASSWD(String value) LDAP_URL public String getIfxLDAP_URL() public void setIfxLDAP_URL(String value) LDAP_USER public String getIfxLDAP_USER() public void setIfxLDAP_USER(String value) LOBCACHE public int getIfxLOBCACHE() public void setIfxLOBCACHE(int value) NEWCODESET public String getIfxNEWCODESET() public void setIfxNEWCODESET(String value) NEWLOCALE public String getIfxNEWLOCALE() public void setIfxNEWLOCALE(String value) 230 IBM Informix JDBC ドライバ プログラマーズ ガイド 環境変数 getIfxXXX() および setIfxXXX() メソッド シグニチャ NEWNLSMAP public String getIfxNEWNLSMAP() public void setIfxNEWNLSMAP (String value) NODEFDAC public String getIfxNODEFDAC() public void setIfxNODEFDAC(String value) OPT_GOAL public String getIfxOPT_GOAL() public void setIfxOPT_GOAL(String value) OPTCOMPIND public String getIfxOPTCOMPIND() public void setIfxOPTCOMPIND(String value) OPTOFC public String getIfxOPTOFC() public void setIfxOPTOFC(String value) PATH public String getIfxPATH() public void setIfxPATH(String value) PDQPRIORITY public String getIfxPDQPRIORITY() public void setIfxPDQPRIORITY(String value) PLCONFIG public String getIfxPLCONFIG() public void setIfxPLCONFIG(String value) PLOAD_LO_PATH public String getIfxPLOAD_LO_PATH() public void setIfxPLOAD_LO_PATH(String value) PORTNO_SECONDARY public String getIfxPORTNO_SECONDARY() public void setIfxPORTNO_SECONDARY(int value) PROXY public String getIfxPROXY() public void setIfxPROXY(String value) PSORT_DBTEMP public String getIfxPSORT_DBTEMP() public void setIfxPSORT_DBTEMP(String value) PSORT_NPROCS public String getIfxPSORT_NPROCS() public void setIfxPSORT_NPROCS(String value) SECURITY public String getIfxSECURITY() public void setIfxSECURITY(String value) SQLH_FILE public String getIfxSQLH_FILE() public void setIfxSQLH_FILE(String value) SQLH_TYPE public String getIfxSQLH_TYPE() public void setIfxSQLH_TYPE(String value) SQLIDEBUG public String getIfxSQLIDEBUG () public void setIfxSQLIDEBUG (String value) STMT_CACHE public String getIfxSTMT_CACHE() public void setIfxSTMT_CACHE(String value) USEV5SERVER public boolean isIfxUSEV5SERVER() public void setIfxUSEV5SERVER(boolean value) 付録 B. DataSource 拡張機能 231 接続プール DataSource プロパティの取得と設定 ConnectionPoolDataSource オブジェクトを使用するために記述するコードは、 DataSource オブジェクトを使用するために記述するコードと同じです。追加調整パ ラメータにより、ユーザまたはデータベース管理者は、Connection Pool Manager を 使用した接続プール管理のいくつかの側面を制御できます。これらについては 211 ページの『接続プールの使用』で詳細に説明されています。次の表に要約します。 プロパティ getXXX() および setXXX() メソッド シグニチャ IFMX_CPM_ENABLE_SWITCH_ HDRPOOL public void setIfxCPMSwitchHDRPool (boolean flag) public int getIfxCPMSwitchHDRPool() IFMX_CPM_INIT_POOLSIZE public void setIfxCPMInitPoolSize (int init) public int getIfxCPMInitPoolSize() IFMX_CPM_MAX_CONNECTIONS public void setIfxCPMMaxConnections (int limit) public int getIfxCPMMaxConnections() IFMX_CPM_MIN_POOLSIZE public void setIfxCPMMinPoolSize (int min) public int getIfxCPMMinPoolSize() IFMX_CPM_MAX_POOLSIZE public void setIfxCPMMaxPoolSize (int max) public int getIfxCPMMaxPoolSize() IFMX_CPM_MIN_AGELIMIT public void setIfxCPMMinAgeLimit (long limit) public long getIfxCPMMinAgeLimit() IFMX_CPM_MAX_AGELIMIT public void setIfxCPMMaxAgeLimit (long limit) public long getIfxCPMMaxAgeLimit() IFMX_CPM_SERVICE_INTERVAL public void setIfxCPMServiceInterval (long interval) public long getIfxCPMServiceInterval() 232 IBM Informix JDBC ドライバ プログラマーズ ガイド 付録 C. データ型のマッピング この付録では、Java プログラムで定義されるデータ型と Informix データベース サ ーバでサポートされるデータ型との間のマッピングについて説明します。以下のト ピックを扱います。 v 次の、『Informix データ型と JDBC データ型との間のデータ型マッピング』 v 237 ページの『PreparedStatement.setXXX() 拡張機能に対するデータ型マッピン グ』 v 245 ページの『ResultSet.getXXX() メソッドに対するデータ型マッピング』 v 248 ページの『UDT Manager と UDR Manager に対するデータ型マッピング』 Informix データ型と JDBC データ型との間のデータ型マッピング 各データベース ベンダによりサポートされる SQL データ型にはさまざまなバリエ ーションがあるため、JDBC API ではクラス java.sql.Types に一連の汎用 SQL デ ータ型が定義されています。JDBC API を使用して Informix データベースに接続す る Java プログラムで汎用 SQL データ型を参照する場合は、これらの JDBC API データ型を使用します。 次の表に、それぞれの JDBC API データ型がマップされる Informix データ型を示 します。 JDBC API データ型 Informix データ型 大桁整数 (BIGINT) 型 INT8 型、大桁整数 (BIGINT) 型、BIGSERIAL 型 2 進数 (BINARY) 型 バイト (BYTE) 型 1 ビット (BIT) 型 ブール (BOOLEAN) 型 REF 非サポート 文字 (CHAR) 型 CHAR(n) 型 日付 (DATE) 型 日付 (DATE) 型 10 進数 (DECIMAL) 型 10 進数 (DECIMAL) 型 実数 (DOUBLE) 型 実数 (FLOAT) 型 実数 (FLOAT) 型 実数 (FLOAT) 型2 整数 (INTEGER) 型 整数 (INTEGER) 型 ロング可変長バイナリ (LONGVARBINARY) 型 バイト (BYTE) 型または BLOB 型 ロング可変長文字 (LONGVARCHAR) 型 テキスト (TEXT) 型または CLOB 型 10 進数 (NUMERIC) 型 10 進数 (DECIMAL) 型 10 進数 (NUMERIC) 型 金額 (MONEY) 型 小桁実数 (REAL) 型 小桁実数 (SMALLFLOAT) 型 © Copyright IBM Corp. 1996, 2008 233 小桁整数 (SMALLINT) 型 小桁整数 (SMALLINT) 型 時刻 (TIME) 型 DATETIME HOUR TO SECOND 型2 タイムスタンプ (TIMESTAMP) 型 DATETIME YEAR TO FRACTION(5) 型3 小桁整数 (TINYINT) 型 小桁整数 (SMALLINT) 型 可変長バイナリ (VARBINARY) 型 バイト (BYTE) 型 可変長文字 (VARCHAR) 型 VARCHAR(m,r) 型 ブール (BOOLEAN) 型 ブール (BOOLEAN) 型 小桁整数 (SMALLINT) 型 小桁整数 (SMALLINT) 型 1 Java 1.4 を使用している場合は、java.sql.Types.BOOLEAN がブール (BOOLEAN) 型にマップされます。 2 このマッピングは JDBC に準拠しています。 IFX_SET_FLOAT_AS_SMFLOAT 環境変数を 1 に設定することにより、下位方向の互換性のために JDBC 実数 (FLOAT) 型を Informix 小桁実数 (SMALLFLOAT) 型にマップできます。 3 Informix 日時 (DATETIME) 型は非常に制限的で、交換可能ではありません。詳し くは、251 ページの『フィールド長と日時データ』を参照してください。 拡張データ型と、Java および JDBC のデータ型間のデータ型マ ッピング 次の表に、Informix Dynamic Server でサポートされている拡張データ型と、対応す る Java および JDBC のデータ型との間のマッピングをリストします。 234 IBM Informix JDBC ドライバ プログラマーズ ガイド JDBC データ型 Java オブジェクト タイプ java.sql.Types.LONGVARCHAR java.sql.String Informix データ型 ラージ可変長文字 (LVARCHAR) 型 java.io.inputStream IfxTypes.IFX_TYPE_LVARCHAR java.sql.Types.JAVA_OBJECT java.sql.SQLData 不透明 (OPAQUE) 型 IfxTypes.IFX_TYPE_UDTFIXED IfxTypes.IFX_TYPE_UDTVAR java.sql.Types.LONGVARBINARY java.sql.Blob BLOB 型 java.sql.Types.BLOB java.io.inputStream IfxTypes.IFX_TYPE_BLOB byte[] java.sql.Types.LONGVARCHAR java.sql.Clob CLOB 型 java.sql.Types.CLOB java.io.inputStream IfxTypes.IFX_TYPE_CLOB java.lang.String java.sql.Types.LONGVARBINARY java.io.inputStream バイト (BYTE) 型 java.sql.Types.BLOB java.sql.Blob byte[] IfxTypes.IFX_TYPE_BYTE java.sql.Types.LONGVARCHAR java.io.InputStream テキスト (TEXT) 型 java.sql.Types.CLOB java.sql.Clob java.sql.String IfxTypes.IFX_TYPE_TEXT java.sql.Types.JAVA_OBJECT java.sql.SQLData 名前付き行 java.sql.Types.STRUCT java.sql.Struct IfxTypes.IFX_TYPE_ROW java.sql.Types.STRUCT java.sql.Struct 名前なし行 IfxTypes.IFX_TYPE_ROW java.sql.Types.ARRAY java.sql.Array java.sql.Types.OTHER java.util.LinkedList セット (SET) 型、 マルチセット (MULTISET) 型 IfxTypes.IFX_TYPE_SET java.util.HashSet IfxTypes.IFX_TYPE_MULTISET java.util.TreeSet java.sql.Types.ARRAY java.sql.Array リスト (LIST) 型 java.sql.Types.OTHER java.util.ArrayList IfxTypes.IFX_TYPE_LIST java.util.LinkedList Java ブール オブジェクトは、Informix 小桁整数 (SMALLINT) 型または Informix ブール (BOOLEAN) 型にマップできます。IBM Informix JDBC ドライバは、列型 に従ってマップしようとします。ただし、PreparedStatement ホスト変数などの場 合には、IBM Informix JDBC ドライバが列型にアクセスできないため、マッピング は多少限定されます。データ型マッピングの詳細については、 237 ページの 『PreparedStatement.setXXX() 拡張機能に対するデータ型マッピング』を参照してく ださい。 付録 C. データ型のマッピング 235 C 不透明 (OPAQUE) 型と Java との間のデータ型マッピング Java を使用して不透明 (OPAQUE) 型を作成するには、UDT および UDR Manager 機能を使用します。詳しくは、 149 ページの『第 5 章 不透明 (OPAQUE) 型に関す る作業』を参照してください。 すべての不透明 (OPAQUE) 型データは、不透明 (OPAQUE) 型で定義されているよ うに、さまざまな DataBlade API データ型から構成される C 構造でデータベース サーバの表に格納されます。 (詳しくは、「IBM Informix DataBlade API プログラ マーズ ガイド」を参照してください。) 次の表に、DataBlade API データ型の、対応する Java データ型へのマッピングをリ ストします。 236 DataBlade API データ型 Java データ型 MI_LO_HANDLE BLOB 型または CLOB 型 gl_wchar_t 文字列型 mi_boolean ブール (BOOLEAN) 型 mi_char 文字列型 mi_char1 文字列型 mi_date 日付 (DATE) 型 mi_datetime タイムスタンプ (TIMESTAMP) 型 mi_decimal BIGDECIMAL 型 mi_double_precision 実数 (DOUBLE) 型 mi_int1 バイト (BYTE) 型 mi_int8 長整数 (LONG) 型 mi_integer 整数 (INT) 型 mi_interval 非サポート mi_money BIGDECIMAL 型 mi_numeric BIGDECIMAL 型 mi_real 実数 (FLOAT) 型 mi_smallint short 型 mi_string 文字列型 mi_unsigned_char1 文字列型 mi_unsigned_int8 長整数 (LONG) 型 mi_unsigned_integer 整数 (INT) 型 mi_unsigned_smallint short 型 mi_wchar 文字列型 IBM Informix JDBC ドライバ プログラマーズ ガイド C 構造には埋込みバイトが含まれる場合があります。IBM Informix JDBC ドライバ は、これらの埋込みバイトを自動的にスキップして、次のデータ メンバが適切に位 置合せされるようにします。したがって、Java オブジェクトは独自に位置合せを処 理する必要はありません。 PreparedStatement.setXXX() 拡張機能に対するデータ型マッピング Informix Dynamic Server には多くの拡張データ型が導入されています。その結果、 JDBC または Java のデータ型と対応する Informix データ型との間に、複数のマッ ピングが存在する可能性があります。 例えば、PreparedStatement.setAsciiStream() を使用して、テキスト (TEXT) 型列ま たは CLOB 型列のいずれかに挿入できます。同様に、 PreparedStatement.setBinaryStream() を使用して、バイト (BYTE) 型列または BLOB 型列のいずれかに挿入することもできます。常に実際の列情報を IBM Informix JDBC ドライバが使用できるわけではないため、ドライバがデータ型をマ ップするときにドライバに対してあいまいさが生じる可能性があります。 通常、INSERT 文、SELECT 文、または DELETE 文では、列情報をドライバが使 用できるため、ドライバはデータベース サーバにデータを送信する方法を決定でき ます。 ただし、データが UPDATE 文、または WHERE 節の中で参照されているときは、 IBM Informix JDBC ドライバは列情報にアクセスできません。このような場合、 Informix 拡張セットを使用していなければ、ドライバは 233 ページの『Informix デ ータ型と JDBC データ型との間のデータ型マッピング』の最初の表にリストされた 対応する Informix データ型を使用してこれらの列をマップします。 PreparedStatement.setAsciiStream() メソッドの場合、ドライバはテキスト (TEXT) 型にマップしようとし、PreparedStatement.setBinaryStream() メソッドの場合、ド ライバはバイト (BYTE) 型にマップしようとします。 マッピング拡張機能の使用 特定のデータ型にマップするようにドライバに指示し、UPDATE 文および WHERE 節でのあいまいさをなくすには、PreparedStatement.setXXX() メソッドに対する拡 張機能を使用します。あいまいさを生じる可能性があるデータ型は、ブール (BOOLEAN) 型、ラージ可変長文字 (LVARCHAR) 型、テキスト (TEXT) 型、バイ ト (BYTE) 型、BLOB 型、および CLOB 型のみです。 これらの拡張メソッドを使用するには、PreparedStatement の参照を IfmxPreparedStatement にキャストする必要があります。例えば、次のコードで は、IfxSetObject() メソッドを呼び出してファイルの内容を CLOB 型のラージ オブ ジェクトとして挿入するために、文の変数 p_stmt を IfmxPreparedStatement にキャ ストしています。IfxSetObject() は I として定義されています。 public void IfxSetObject(int i, Object x, int scale, int ifxType) throws SQLException public void IfxSetObject(int i, Object x, int ifxType) throws SQLexception コードは次のとおりです。 付録 C. データ型のマッピング 237 File file = new File("sblob_06.dat"); int fileLength = (int)file.length(); byte[] buffer = new byte[fileLength]; FileInputStream fin = new FileInputStream(file); fin.read(buffer,0,fileLength); String str = new String(buffer); writeOutputFile("Prepare"); PreparedStatement p_stmt = myConn.prepareStatement ("insert into sblob_t20(c1) values(?)"); writeOutputFile("IfxSetObject"); ((IfmxPreparedStatement)p_stmt).IfxSetObject(1,str,30,IfxTypes.IFX _TYPE_CLOB); IfmxPreparedStatement.IfxSetObject 拡張機能では、単に追加の ifxType パラメー タでメソッド シグニチャをオーバーロードすることはできません。これは、そのよ うなオーバーロードによりメソッドのあいまいさが生じるためです。その代わり に、メソッドを IfxSetObject と指定する必要があります。 不透明 (OPAQUE) 型に対する拡張機能の使用 不透明 (OPAQUE) 型を処理するための拡張機能により、アプリケーションは、デー タベース サーバが不透明 (OPAQUE) 型をクライアントに戻す前にそれをキャスト する対象となる戻り型を指定できます。これは、戻り値の事前結合 として知られて います。メソッドは次のとおりです。 v setBindColType()。アプリケーションが java.sql.Types の標準 JDBC データ型を 使用して結果セット値の出力型を指定できるようにします。 v setBindColIfxType()。アプリケーションが com.informix.lang.IfxTypes の Informix データ型を使用して結果セット値の出力型を指定できるようにします。 使用可能なデータ型の詳細については、241 ページの『IfxTypes クラスの使用』 を参照してください。 v clearBindColType()。前の 2 つのメソッドを使用して設定された値をリセットし ます。 以降のセクションでは、以下のようになっています。 v colIndex パラメータは、列を指定します。1 は最初の列、2 は 2 番目の列などで す。 v sqltype パラメータは、java.sql.Types の値です。例えば、Types.INTEGER などで す。 v ifxtype パラメータは、IfxTypes の値です。例えば、IfxTypes.IFX_TYPE_DECIMAL などです。 setBindColType() メソッド: メソッドは次のとおりです。 public void setBindColType(int colIndex, int sqltype) throws SQLException; public void setBindColType(int colIndex, int sqltype, int scale) throws SQLException; public void setBindColType(int colIndex, int sqltype, String name) throws SQLException; オーバーロードされた最初のメソッドでは、アプリケーションは出力型を java.sql.DECIMAL または java.sql.NUMERIC に指定できます。scale パラメータ は、小数点の右側の桁数を指定します。オーバーロードされた 2 番目のメソッドで 238 IBM Informix JDBC ドライバ プログラマーズ ガイド は、アプリケーションは、java.sql.STRUCT、java.sql.ARRAY、 java.sql.DISTINCT、または java.sql.JAVA_OBJECT の値のいずれかを name パラメ ータに割り当てることにより、出力型をその型に指定できます。 setBindColIfxType() メソッド: メソッドは次のとおりです。 public void setBindColIfxType(int colIndex, int ifxtype) throws SQLException; public void setBindColIfxType(int colIndex, int ifxtype, int scale) throws SQLException; public void setBindColIfxType(int colIndex, int ifxtype, String name) throws SQLException; オーバーロードされた最初のメソッドでは、アプリケーションは出力型を IFX_TYPE_DECIMAL または IFX_TYPE_NUMERIC に指定できます。scale パラメータ は、小数点の右側の桁数を指定します。オーバーロードされた 2 番目のメソッドで は、アプリケーションは、IFX_TYPE_LIST、IFX_TYPE_ROW、IFX_TYPE_MULTISET、 IFX_TYPE_SET、IFX_TYPE_UDTVAR、または IFX_TYPE_UDTFIXED の値のいずれかを name パラメータに割り当てることにより、出力型をその型に指定できます。 clearBindColType() メソッド: メソッドは次のとおりです。 public void clearBindColType() throws SQLException; 事前結合の例: udt_bindCol.java サンプル プログラムに含まれる次のコードで は、不透明 (OPAQUE) 型を Informix 可変長文字 (VARCHAR) 型に事前結合し、 次に標準 Java 整数 (INTEGER) 型に事前結合しています。この例で使用されている 表には 1 つの整数 (INT) 型列と 1 つの不透明 (OPAQUE) 型列があり、次のよう に定義されています。 create table charattr_tab (int_col int, charattr_col charattr_udt) charattr_col 列の不透明 (OPAQUE) 型を選択して事前結合するためのコードは、次 のとおりです。 String s = "select int_col, charattr_col as cast_udt_to_lvc, " + "charattr_col as cast_udt_to_int from charattr_tab order by 1"; pstmt = conn.prepareStatement(s); ((IfxPreparedStatement)pstmt).setBindColIfxType(2,IfxTypes.IFX_TYPE_LVARCHAR); ((IfxPreparedStatement)pstmt).setBindColType(3,Types.INTEGER); ResultSet rs = pstmt.executeQuery(); System.out.println("Fetching data ..."); int curRow = 0; while (rs.next()) { curRow++; int intret = rs.getInt("int_col"); String strret = rs.getString("cast_udt_to_lvc"); int intret2 = rs.getInt("cast_udt_to_int"); } // end while その他のマッピング拡張機能の使用 残りのメソッド シグニチャを、適用される追加の考慮事項とともに次にリストしま す。いずれの場合でも、Informix データ型は標準 JDBC PreparedStatement.setXXX() インターフェイスに対する最後のパラメータである必 要があります。 IfmxPreparedStatement.setArray() 付録 C. データ型のマッピング 239 public void setArray(int parameterIndex, Array x, int ifxType) throws SQLException IfmxPreparedStatement.setAsciiStream() public void setAsciiStream(int i, InputStream x, int length, int ifxType) throws SQLException アプリケーションが非常に大きい ASCII 値をロング可変長文字 (LONGVARCHAR) 型列に挿入している場合は、java.io.InputStream を使用して ASCII 値をサーバに送 信する方が効率的なことがあります。 IfmxPreparedStatement.setBigDecimal() public void setBigDecimal(int i, BigDecimal x, int ifxType) throws SQLException IfmxPreparedStatement.setBinaryStream() public void setBinaryStream(int i, InputStream x, int length, int ifxType) throws SQLException アプリケーションが非常に大きいバイナリ値をロング可変長バイナリ (LONGVARBINARY) 型列に挿入している場合は、java.io.InputStream を使用して バイナリ値をサーバに送信する方が効率的なことがあります。 IfmxPreparedStatement.setBlob() public void setBlob(int parameterIndex, Blob x, int ifxType) throws SQLException IfmxPreparedStatement.setBoolean() public void setBoolean(int i, boolean x, int ifxType) throws SQLException IfmxPreparedStatement.setByte() public void setByte(int i, byte x, int ifxType) throws SQLException IfmxPreparedStatement.setBytes() public void setBytes(int i, byte x[], int ifxType) throws SQLException IfmxPreparedStatement.setCharacterStream() public void setCharacterStream(int parameterIndex, Reader reader, int length, int ifxType) throws SQLException アプリケーションがロング可変長文字 (LONGVARCHAR) 型のパラメータを非常に 大きい UNICODE 値に設定している場合は、java.io.Reader を使用して UNICODE 値をサーバに送信する方が効率的なことがあります。 IfmxPreparedStatement.setClob() public void setClob(int parameterIndex, Clob x, int ifxType) throws SQLException IfmxPreparedStatement.setDate() 240 IBM Informix JDBC ドライバ プログラマーズ ガイド public void setDate(int i, Date x, int ifxType) throws SQLException public void setDate(int parameterIndex, Date x, Calendar Cal, int ifxType) throws SQLException IfmxPreparedStatement.setDouble() public void setDouble(int i, double x, int ifxType) throws SQ LException IfmxPreparedStatement.setFloat() public void setFloat(int i, float x, int ifxType) throws SQLException IfmxPreparedStatement.setInt() public void setInt(int i, int x, int ifxType) throws SQLException IfmxPreparedStatement.setLong() public void setLong(int i, long x, int ifxType) throws SQLException IfmxPreparedStatement.setNull() public void setNull(int i, int sqlType, int ifxType) throws SQLException IfmxPreparedStatement.setShort() public void setShort(int i, short x, int ifxType) throws SQLException IfmxPreparedStatement.setString() public void setString(int i, String x, int ifxType) throws SQLException IfmxPreparedStatement.setTime() public void setTime(int i, Time x, int ifxType) throws SQLException public void setTime(int parameterIndex, Time time, Calendar Cal, int ifxType) throws SQLException IfmxPreparedStatement.setTimestamp() public void setTimestamp(int i, Timestamp x, int ifxType) throws SQLException public void setTimestamp(int parameterIndex, Timestamp x, Calendar Cal) throws SQLException IfxTypes クラスの使用 拡張された IfmxPreparedStatement メソッドでは、マップする対象となる Informix データ型を渡す必要があります。これらのデータ型は com.informix.lang.IfxTypes クラスに含まれています。 次の表に IfxTypes 定数と、対応する Informix データ型を示します。 IfxTypes 定数 Informix データ型 IfxTypes.IFX_TYPE_BIGINT 大桁整数 (BIGINT) 型 付録 C. データ型のマッピング 241 IfxTypes.IFX_TYPE_BIGSERIAL BIGSERIAL 型 IfxTypes.IFX_TYPE_CHAR 文字 (CHAR) 型 IfxTypes.IFX_TYPE_SMALLINT 小桁整数 (SMALLINT) 型 IfxTypes.IFX_TYPE_INT 整数 (INT) 型 IfxTypes.IFX_TYPE_FLOAT 実数 (FLOAT) 型 IfxTypes.IFX_TYPE_SMFLOAT 小桁実数 (SMALLFLOAT) 型 IfxTypes.IFX_TYPE_DECIMAL 10 進数 (DECIMAL) 型 IfxTypes.IFX_TYPE_SERIAL シリアル (SERIAL) 型 IfxTypes.IFX_TYPE_DATE 日付 (DATE) 型 IfxTypes.IFX_TYPE_MONEY 金額 (MONEY) 型 IfxTypes.IFX_TYPE_NULL NULL IfxTypes.IFX_TYPE_DATETIME 日時 (DATETIME) 型 IfxTypes.IFX_TYPE_BYTE バイト (BYTE) 型 IfxTypes.IFX_TYPE_TEXT テキスト (TEXT) 型 IfxTypes.IFX_TYPE_VARCHAR 可変長文字 (VARCHAR) 型 IfxTypes.IFX_TYPE_INTERVAL 時間隔 (INTERVAL) 型 IfxTypes.IFX_TYPE_NCHAR 各国語文字 (NCHAR) 型 IfxTypes.IFX_TYPE_NVARCHAR 各国語可変長文字 (NVARCHAR) 型 IfxTypes.IFX_TYPE_INT8 INT8 型 IfxTypes.IFX_TYPE_SERIAL8 SERIAL8 型 IfxTypes.IFX_TYPE_SET SQLSET 型 IfxTypes.IFX_TYPE_MULTISET SQLMULTISET 型 IfxTypes.IFX_TYPE_LIST SQLLIST 型 IfxTypes.IFX_TYPE_ROW SQLROW 型 IfxTypes.IFX_TYPE_COLLECTION コレクション (COLLECTION) 型 IfxTypes.IFX_TYPE_UDTVAR UDTVAR 型 IfxTypes.IFX_TYPE_UDTFIXED UDTFIXED 型 IfxTypes.IFX_TYPE_REFSER8 242 IBM Informix JDBC ドライバ プログラマーズ ガイド REFSER8 型 IfxTypes.IFX_TYPE_LVARCHAR ラージ可変長文字 (LVARCHAR) 型 IfxTypes.IFX_TYPE_SENDRECV SENDRECV 型 IfxTypes.IFX_TYPE_BOOL ブール (BOOLEAN) 型 IfxTypes.IFX_TYPE_IMPEXP IMPEXP 型 IfxTypes.IFX_TYPE_IMPEXPBIN IMPEXPBIN 型 IfxTypes.IFX_TYPE_CLOB CLOB 型 IfxTypes.IFX_TYPE_BLOB BLOB 型 拡張の概要 次の表に、Informix JDBC ドライバが非拡張データ型に対してサポートしている PreparedStatement.setXXX() メソッドをリストします。上部の見出しには、 java.sql.Types クラスで定義されている標準 JDBC API データ型がリストされてい ます。 234 ページの『拡張データ型と、Java および JDBC のデータ型間のデータ 型マッピング』の表に示されているように、これらの型は特定の Informix データ型 に変換されます。下の表には、特定の JDBC API データ型のデータを書き込むため に使用できる setXXX() メソッドがリストされています。大文字で強調表示されて いる X は、IBM Informix JDBC ドライバでの使用が推奨されている setXXX() メ ソッドを示します。小文字の x は、IBM Informix JDBC ドライバがサポートして いるその他の setXXX() メソッドを示します。 setByte() X x x x x x x x x x1 x1 1 setShort() x X x x x x x x x x x1 setInt() x x X x x x x x x x1 x1 1 setLong() x x x X x x x x x x x1 setFloat() x x x x X x x x x x1 x1 1 x1 setDouble() x x x x x X X x x x setBigDecimal() x x x x x x x X X x x setBoolean() x x x x x x x x x x x 付録 C. データ型のマッピング タイムスタンプ (TIMESTAMP) 型 時刻 (TIME) 型 日付 (DATE) 型 ロング可変長バイナリ (LONGVARBINARY) 型 可変長バイナリ (VARBINARY) 型 2 進数 (BINARY) 型 ロング可変長文字 (LONGVARCHAR) 型 可変長文字 (VARCHAR) 型 文字 (CHAR) 型 ビット (BIT) 型 10 進数 (NUMERIC) 型 10 進数 (DECIMAL) 型 実数 (DOUBLE) 型 実数 (FLOAT) 型 小桁実数 (REAL) 型 大桁整数 (BIGINT) 型 整数 (INTEGER) 型 小桁整数 (SMALLINT) 型 setXXX() メソッド 小桁整数 (TINYINT) 型 java.sql.Types の JDBC API データ型 243 setString() x x x x x x x x x X X setDate() x x setTime() x x setTimestamp() x x setBytes() x x x x x X X x x x X x X x x x setCharacterStream() X x x x x x X setAsciiStream() タイムスタンプ (TIMESTAMP) 型 時刻 (TIME) 型 日付 (DATE) 型 ロング可変長バイナリ (LONGVARBINARY) 型 可変長バイナリ (VARBINARY) 型 2 進数 (BINARY) 型 ロング可変長文字 (LONGVARCHAR) 型 可変長文字 (VARCHAR) 型 文字 (CHAR) 型 ビット (BIT) 型 10 進数 (NUMERIC) 型 10 進数 (DECIMAL) 型 実数 (DOUBLE) 型 実数 (FLOAT) 型 小桁実数 (REAL) 型 大桁整数 (BIGINT) 型 整数 (INTEGER) 型 小桁整数 (SMALLINT) 型 setXXX() メソッド 小桁整数 (TINYINT) 型 java.sql.Types の JDBC API データ型 x X setUnicodeStream() setBinaryStream() setObject() x x x x x x x x x x x x x x X x2 x x x2 x x3 x 1 注: 列の値は setXXX() のデータ型と正確に一致する必要があります。正確に一致しない場合は SQLException が発生します。列の 値が許される値の範囲外である場合、setXXX() メソッドはデータ型を変換せずに例外を発生させます。例えば、書き込まれている 値が 1000 である場合、setByte(1) は SQLException を発生させます。2 バイト配列が書き込まれます。3 Time オブジェクトの代 わりに Timestamp オブジェクトが書き込まれます。 setNull() メソッドは SQL NULL 値を書き込みます。 次の表に、IBM Informix JDBC ドライバが Informix 拡張データ型に対してサポー トしている PreparedStatement.setXXX() メソッドをリストします。Informix 拡張デ ータ型に対するマッピングは 234 ページの『拡張データ型と、Java および JDBC のデータ型間のデータ型マッピング』の表に示されています。この表には、特定の 拡張データ型のデータを書き込むために使用できる setXXX() メソッドがリストさ れています。 大文字で強調表示されている X は、使用することが推奨されている setXXX() メソ ッドを示します。小文字の x は、IBM Informix JDBC ドライバでサポートされて いるその他の setXXX() メソッドを示します。Informix 拡張データ型に対応してい ない setXXX() メソッドは表に含まれていません。 244 IBM Informix JDBC ドライバ プログラマーズ ガイド setByte() x setShort() x setInt() x setBoolean() X setString() x setBytes() x x X setCharacterStream() x x X x x x X x X x x x setArray() setBlob() setClob() リスト (LIST) 型 x x setObject() セット (SET) 型またはマルチセット (MULTISET) 型 x setAsciiStream() x 名前なし行型 x X setBinaryStream() 名前付き行型 テキスト (TEXT) 型 バイト (BYTE) 型 CLOB 型 BLOB 型 setXXX() メソッド 不透明 (OPAQUE) 型 ブール (BOOLEAN) 型 ラージ可変長文字 (LVARCHAR) 型 Informix 拡張データ型 X X x x x x X X setNull() メソッドは SQL NULL 値を書き込みます。 ResultSet.getXXX() メソッドに対するデータ型マッピング Informix データベースから、JDBC API を使用して Informix データベースに接続す る Java プログラムにデータを転送するには、ResultSet.getXXX() メソッドを使用し ます。例えば、ラージ可変長文字 (LVARCHAR) 型列に格納されているデータを取 得するには、ResultSet.getString() メソッドを使用します。 重要: SQL 文内で表現式を使用する場合 (例えば、SELECT mytype::LVARCHAR FROM mytab) は、ResultSet.getXXX(columnName) を使用して値を抽出できない可能 性があります。代わりに ResultSet.getXXX(columnIndex) を使用して値を抽 出してください。 付録 C. データ型のマッピング 245 次の表に、IBM Informix JDBC ドライバが非拡張データ型に対してサポートしてい る ResultSet.getXXX() メソッドをリストします。上部の見出しには、java.sql.Types クラスで定義されている標準 JDBC API データ型がリストされています。 233 ペ ージの『Informix データ型と JDBC データ型との間のデータ型マッピング』の最初 の表に示されているように、これらの型は特定の Informix データ型に変換されま す。この表には、特定の JDBC API データ型のデータを抽出するために使用できる getXXX() メソッドがリストされています。 大文字で強調表示されている X は、使用することが推奨されている getXXX() メ ソッドを示します。小文字の x は、IBM Informix JDBC ドライバでサポートされ ているその他の getXXX() メソッドを示します。 x x1 x1 getShort() x X x x x x x x x x1 x1 getInt() x x X x x x x x x x1 x1 getLong() x x x X x x x x x x1 x1 getFloat() x x x x X x x x x x1 x1 getDouble() x x x x x X X x x x1 x1 getBigDecimal() x x x x x x x X X x x getBoolean() x x x x x x x x x x x getString() x x x x x x x x x X X getBytes() getDate() x x getTime() x x getTimestamp() x x タイムスタンプ (TIMESTAMP) 型 x 時刻 (TIME) 型 x 日付 (DATE) 型 10 進数 (NUMERIC) 型 x ロング可変長バイナリ (LONGVARBINARY) 型 10 進数 (DECIMAL) 型 x 可変長バイナリ (VARBINARY) 型 実数 (DOUBLE) 型 x 2 進数 (BINARY) 型 実数 (FLOAT) 型 x ロング可変長文字 (LONGVARCHAR) 型 小桁実数 (REAL) 型 x 文字 (CHAR) 型 大桁整数 (BIGINT) 型 X ビット (BIT) 型 整数 (INTEGER) 型 getByte() getXXX() メソッド 小桁整数 (TINYINT) 型 小桁整数 (SMALLINT) 型 可変長文字 (VARCHAR) 型 java.sql.Types の JDBC API データ型 x x x x x x x x X X x X x X x getAsciiStream() X x x x getCharacterStream() X x x x x x x X 2 x x x2 x X getUnicodeStream() getBinaryStream() getObject() 246 x x x x x x IBM Informix JDBC ドライバ プログラマーズ ガイド x x x x x x x x3 x タイムスタンプ (TIMESTAMP) 型 時刻 (TIME) 型 日付 (DATE) 型 ロング可変長バイナリ (LONGVARBINARY) 型 可変長バイナリ (VARBINARY) 型 2 進数 (BINARY) 型 ロング可変長文字 (LONGVARCHAR) 型 可変長文字 (VARCHAR) 型 文字 (CHAR) 型 ビット (BIT) 型 10 進数 (NUMERIC) 型 10 進数 (DECIMAL) 型 実数 (DOUBLE) 型 実数 (FLOAT) 型 小桁実数 (REAL) 型 大桁整数 (BIGINT) 型 整数 (INTEGER) 型 小桁整数 (SMALLINT) 型 getXXX() メソッド 小桁整数 (TINYINT) 型 java.sql.Types の JDBC API データ型 注:1 列の値は getXXX() のデータ型と正確に一致する必要があります。正確に一致しない場合は SQLException が発 生します。列の値が許される値の範囲外である場合、getXXX() メソッドはデータ型を変換せずに例外を発生させま す。例えば、列の値が 1000 の場合、getByte(1) は SQLException を発生させます。2 バイト配列が戻されます。3 Time オブジェクトの代わりに Timestamp オブジェクトが戻されます。 抽出された列の値が SQL NULL 値である場合、getXXX() メソッドは NULL 値を 戻します。 次の表に、IBM Informix JDBC ドライバが Informix 拡張データ型に対してサポー トしている ResultSet.getXXX() メソッドをリストします。Informix 拡張データ型に 対するマッピングは 234 ページの『拡張データ型と、Java および JDBC のデータ 型間のデータ型マッピング』の表に示されています。この表には、特定の拡張デー タ型のデータを抽出するために使用できる getXXX() メソッドがリストされていま す。 大文字で強調表示されている X は、使用することが推奨されている getXXX() メ ソッドを示します。小文字の x は、IBM Informix JDBC ドライバでサポートされ ているその他の getXXX() メソッドを示します。Informix 拡張データ型に対応して いない getXXX() メソッドは表に含まれていません。 付録 C. データ型のマッピング 247 getByte() x getShort() x getInt() x getBoolean() X getString() x getBytes() x x X getCharacterStream() x x X x x x X x X x x x X getArray() getBlob() getClob() リスト (LIST) 型 x x getObject() セット (SET) 型またはマルチセット (MULTISET) 型 x getAsciiStream() x 名前なし行型 x X getBinaryStream() 名前付き行型 テキスト (TEXT) 型 バイト (BYTE) 型 CLOB 型 BLOB 型 getXXX() メソッド 不透明 (OPAQUE) 型 ブール (BOOLEAN) 型 ラージ可変長文字 (LVARCHAR) 型 Informix 拡張データ型 X x x x x X X 抽出された列の値が SQL NULL 値である場合、getXXX() メソッドは NULL 値を 戻します。 UDT Manager と UDR Manager に対するデータ型マッピング UDTManager クラスと UDRManager クラスを使用してデータベース サーバに不 透明 (OPAQUE) 型と Java UDR を作成すると、ドライバはこのセクションの表に 従って、Java メソッドの引数と戻り型を SQL データ型にマップします。これらの 表に示されていないデータ型はサポートされていません。 Java メソッドが以下の Java データ型のいずれかである引数を持つ場合、その引数 と戻り型は、次の表に示すとおりにサーバで SQL データ型にマップされます。こ の表には、それぞれの Java データ型がマップされる Informix データ型が示されて います。 248 IBM Informix JDBC ドライバ プログラマーズ ガイド Java データ型 SQL データ型 boolean, java.lang.Boolean ブール (BOOLEAN) 型 char CHAR(1) 型 byte CHAR(1) 型 short, java.lang.Short 小桁整数 (SMALLINT) 型 int, java.lang.Integer 整数 (INT) 型 long, java.lang.Long INT8 型 float, java.lang.Float 小桁実数 (SMALLFLOAT) 型 double, java.lang.Double 実数 (FLOAT) 型1 java.lang.String ラージ可変長文字 (LVARCHAR) 型 java.math.BigDecimal 10 進数 (DECIMAL) 型 サーバによって設定されるデフォルトの精度は、 DECIMAL(16,0) (ANSI データベースの場合) decimal (16,255) (非 ANSI データベースの場合) java.sql.Date 日付 (DATE) 型 java.sql.Time DATETIME HOUR TO SECOND 型 java.sql.Timestamp DATETIME YEAR TO FRACTION(5) 型 com.informix.lang.IntervalYM INTERVAL YEAR TO MONTH 型 com.informix.lang.IntervalDF INTERVAL DAY TO FRACTION(5) 型 java.sql.Blob BLOB 型 java.sql.Clob CLOB 型 1 このマッピングは JDBC に準拠しています。 IFX_GET_SMFLOAT_AS_FLOAT 環境変数を 1 に設定することにより、下位方向の互換性のために、Java 倍精度浮動 小数点数 (DOUBLE) 型 (JDBC 実数 (FLOAT) 型を経由) を、Informix 小桁実数 (SMALLFLOAT) 型にマップできます。 キャストに対するマッピング 次の表に、UDTMetaData.setXXXCast() メソッドの ifxtype パラメータに対して定義 されているデータ型と、サーバの SQL データ型との間でサポートされているマッ ピングを示します。 com.informix.lang.IfxTypes の ifxtype パラメータ型 Informix データ型 IFX_TYPE_CHAR 文字 (CHAR) 型 IFX_TYPE_SMALLINT 小桁整数 (SMALLINT) 型 IFX_TYPE_INT 整数 (INT) 型 IFX_TYPE_FLOAT 実数 (FLOAT) 型 IFX_TYPE_SMFLOAT 小桁実数 (SMALLFLOAT) 型 IFX_TYPE_DECIMAL 10 進数 (DECIMAL) 型 付録 C. データ型のマッピング 249 IFX_TYPE_SERIAL シリアル (SERIAL) 型 IFX_TYPE_DATE 日付 (DATE) 型 IFX_TYPE_MONEY 金額 (MONEY) 型 IFX_TYPE_DATETIME 日時 (DATETIME) 型 IFX_TYPE_BYTE バイト (BYTE) 型 IFX_TYPE_TEXT テキスト (TEXT) 型 IFX_TYPE_VARCHAR 可変長文字 (VARCHAR) 型 IFX_TYPE_INTERVAL 時間隔 (INTERVAL) 型 IFX_TYPE_NCHAR 各国語文字 (NCHAR) 型 IFX_TYPE_NVARCHAR 各国語可変長文字 (NVARCHAR) 型 IFX_TYPE_INT8 INT8 型 IFX_TYPE_SERIAL8 SERIAL8 型 IFX_TYPE_LVARCHAR ラージ可変長文字 (LVARCHAR) 型 IFX_TYPE_SENDRECV SENDRECV 型 IFX_TYPE_BOOL ブール (BOOLEAN) 型 IFX_TYPE_IMPEXP IMPEXP 型 IFX_TYPE_IMPEXPBIN IMPEXPBIN 型 IFX_TYPE_CLOB CLOB 型 IFX_TYPE_BLOB BLOB 型 フィールド型に対するマッピング 次の表に、UDTMetaData.setFieldType() メソッドの ifxtype パラメータに対して定 義されているデータ型と、Java クラス ファイルに表示されるとおりの Java データ 型との間でサポートされているマッピングを示します。この表に示されていないデ ータ型は、不透明 (OPAQUE) 型内でサポートされていません。 250 com.informix.lang.IfxTypes の ifxtype パラメータ型 Java データ型 IFX_TYPE_BIGINT 長整数 (LONG) 型 IFX_TYPE_BIGSERIAL 長整数 (LONG) 型 IFX_TYPE_CHAR java.lang.String IFX_TYPE_SMALLINT short 型 IFX_TYPE_INT 整数 (INT) 型 IFX_TYPE_FLOAT 実数 (DOUBLE) 型 IFX_TYPE_SMFLOAT 実数 (FLOAT) 型1 IFX_TYPE_DECIMAL java.lang.BigDecimal IFX_TYPE_SERIAL 整数 (INT) 型 IFX_TYPE_DATE 日付 (DATE) 型 IBM Informix JDBC ドライバ プログラマーズ ガイド IFX_TYPE_MONEY java.lang.BigDecimal IFX_TYPE_DATETIME 最初の修飾子が Year、Month、または Day である 場合は java.lang.Timestamp、その他の場合は java.lang.Time (251 ページの『フィールド長と日時 データ』を参照)。 IFX_TYPE_INTERVAL 最初の修飾子が Year または Month である場合は com.informix.lang.IfxIntervalYM、その他の場合は com.informix.lang.IfxIntervalDF (251 ページの『フィ ールド長と日時データ』を参照)。 IFX_TYPE_NCHAR java.lang.String IFX_TYPE_INT8 長整数 (LONG) 型 IFX_TYPE_SERIAL8 長整数 (LONG) 型 IFX_TYPE_BOOL ブール (BOOLEAN) 型 IFX_TYPE_CLOB java.sql.Clob IFX_TYPE_BLOB java.sql.Blob 1 このマッピングは JDBC に準拠しています。 IFX_GET_SMFLOAT_AS_FLOAT 環境変数を 1 に設定することにより、下位方向の互換性のために、 IFX_TYPE_SMFLOAT 型 (JDBC 実数 (FLOAT) 型を経由) を、Java 倍精度浮動小 数点数 (DOUBLE) 型にマップできます。 フィールド長と日時データ setFieldType(IFX_TYPE_DATETIME) または setFieldType (IFX_TYPE_INTERVAL) を呼び出してフィールド型を日時 (DATETIME) 型または 時間隔 (INTERVAL) 型に設定すると、ドライバは、ユーザが setFieldLength() を呼 び出して設定した符号化された長さに応じて、日時 (DATETIME) 型フィールドを java.sql.Timestamp または java.sql.Time のいずれかにマップします。 例えば、日時 (DATETIME) 型フィールドに対する標準形式が YYYY-MM-DD HH:MM:SS であるとすると、ドライバは次のマッピング アルゴリズムを使用しま す。 v 符号化された長さの開始コードが hour 以下の場合は、java.sql.Time にマップさ れます。 v 符号化された長さの開始コードが year 以下の場合は、java.sql.TimeStamp にマ ップされます。 時間隔の場合、標準は YYYY-MM または DD HH:MM:SS.frac のいずれかです。マ ッピングは次のようになります。 v 符号化された長さの開始コードが day 以下の場合は、 com.informix.jdbc.IfxIntervalDF にマップされます。 v 符号化された長さの開始コードが year 以下の場合は、 com.informix.jdbc.IfxIntervalYM にマップされます。 付録 C. データ型のマッピング 251 252 IBM Informix JDBC ドライバ プログラマーズ ガイド 付録 D. アクセシビリティ IBM は、年齢や障害の有無にかかわらず誰もが使用できる製品の提供に努めていま す。 IBM Informix Dynamic Server のアクセシビリティ機能 アクセシビリティ機能は、運動障害または視覚障害など身体に障害を持つユーザが IT プロダクトを快適に使用できるようにサポートします。 アクセシビリティ機能 下記は、IBM Informix Dynamic Server の主要なアクセシビリティ機能のリストで す。これらの機能は、以下をサポートします。 v キーボードのみの操作。 v スクリーン リーダ (読上げソフトウェア) で一般に使用されるインターフェイ ス。 v 代替入出力デバイスの接続。 ヒント: IBM Informix Dynamic Server インフォメーション センターおよび関連す るマニュアルは、 IBM ホームページ リーダでの読み上げが可能です。マ ウスの代わりにキーボードを使用して、すべての機能を操作できます。 キーボード ナビゲーション 本製品では、標準の Microsoft Windows ナビゲーション キーを使用します。 アクセシビリティ関連情報 IBM は、身体障害を持つユーザも閲覧可能なマニュアルの開発に取り組んでいま す。 IBM のマニュアルは HTML 形式でも提供されているため、スクリーン リー ダ (読上げソフトウェア) などの支援テクノロジーを使用してマニュアルを利用でき ます。IBM のマニュアルの構文ダイアグラムは、小数点付き 10 進数フォーマット で提供されています。小数点付き 10 進数フォーマットについて詳しくは、 254 ペ ージの『小数点付き 10 進数構文ダイアグラム』を参照してください。 IBM Informix Dynamic Server の Adobe PDF (Portable Document Format) フォーマ ットのマニュアルは、Adobe Acrobat Reader を使用して表示できます。 IBM のアクセシビリティに対する取組み IBM のアクセシビリティに対する取組みについて詳しくは、http://www-06.ibm.com/ jp/accessibility/『IBM アクセシビリティ・センター』を参照してください。 © Copyright IBM Corp. 1996, 2008 253 小数点付き 10 進数構文ダイアグラム IBM のマニュアルの構文ダイアグラムは、スクリーン リーダ (読上げソフトウェ ア) を使用する場合に限り利用できる小数点付き 10 進数フォーマットで提供され ています。 小数点付き 10 進数フォーマットでは、構文要素はそれぞれ別の行に書き込まれま す。2 つ以上の構文要素が、まとめて使用される (またはどちらも使用されない) 場 合、単一の複合構文要素と見なすことができるため、それらの要素が同じ行に表示 される場合があります。 各行は小数点付き 10 進数値で開始されます。例えば、3、3.1 または 3.1.1 など です。これらの数字を正確に聞き取れるように、必ずスクリーン リーダ (読上げソ フトウェア) では句読点を読み上げる設定にしてください。同じ小数点付き 10 進 数値を持つすべての構文要素 (例えば、数値 3.1 を含むすべての構文要素) は相互 に排他的な選択肢です。行「3.1 USERID」および行「3.1 SYSTEMID」が聞こえた場 合は、構文に USERID または SYSTEMID のいずれか一方のみを記述できます。 小数点付き 10 進数の番号付けレベルにより、ネストのレベルが示されます。例え ば、小数点付き 10 進数値 3 の構文要素の後に、小数点付き 10 進数値 3.1 の構 文要素が続く場合、3.1 と番号付けされている構文要素はすべて、3 と番号付けさ れている構文要素に従属します。 構文要素についての情報を追加するために、小数点付き 10 進数値の横に特定の単 語および記号が付加されます。たまたま、要素の先頭がこれらの単語および記号に 一致することがあります。識別を容易にするため、該当する単語または記号が構文 要素の一部である場合には、その単語または記号の前に円記号 (¥) を付加します。* 記号を小数点付き 10 進数値の横に付加して、その構文要素が反復することを示す ことができます。例えば、小数点付き 10 進数値 3 の構文要素 *FILE は、3 ¥* FILE と読み上げられます。フォーマット 3* FILE は、構文要素 FILE が反復する ことを示します。フォーマット 3* ¥* FILE は、構文要素 * FILE が反復すること を示します。 構文要素文字列の分離に使用されるコンマなどの文字は、構文では分離する項目の 直前に表示されます。これらの文字は、各項目と同じ行に表示される場合と、関連 項目と同じ小数点付き 10 進数値を持つ別の行に表示される場合があります。行に は構文要素についての情報を提供する別の記号も表示される場合があります。例え ば、「5.1*」、「5.1 LASTRUN,」、「5.1 DELETE」となっている行は、LASTRUN お よび DELETE 構文要素を複数使用する場合に、これらの要素をコンマで分離する必 要があることを意味します。分離文字を指定しない場合、各構文要素の分離には空 白が使用されるものと想定します。 構文要素の前に % 記号がある場合、別の場所で定義されている参照を示します。% 記号に続く文字列はリテラルではなく、構文フラグメントの名前です。例えば、行 「2.1 %OP1」は、別の構文フラグメント OP1 を参照する必要があることを意味しま す。 小数点付き 10 進数値の横に次の単語および記号が付加されます。 ? 254 オプションの構文要素を指定します。後ろに ? 記号が続く小数点付き 10 進数値は、対応する小数点付き 10 進数値の構文要素すべて、およびそれに IBM Informix JDBC ドライバ プログラマーズ ガイド 従属する構文要素がオプションであることを示します。ある小数点付き 10 進数値に構文要素が 1 つのみ含まれる場合、? 記号はその構文要素と同じ 行に表示されます (例えば、5? NOTIFY)。ある小数点付き 10 進数値に構文 要素が複数含まれる場合、? 記号は行に単独で表示され、以下オプションの 構文要素が続きます。例えば、「5 ?」、「5 NOTIFY」、「5 UPDATE」とい う行が聞こえた場合、構文要素 NOTIFY と UPDATE がオプションであること が分かります。つまり、それらをいずれも選択しないか、1 つのみ選択しま す。? 記号は、レールロード構文ダイアグラムでのバイパス線に相当しま す。 ! デフォルトの構文要素を指定します。小数点付き 10 進数値とそれに続く ! 記号および構文要素は、同じ小数点付き 10 進数値を共用するすべての構文 要素に対し、構文要素がデフォルト オプションであることを示します。同 じ小数点付き 10 進数値を持つ構文要素のうちの 1 つのみで ! 記号を指定 できます。例えば、「2? FILE」、「2.1! (KEEP)」、「2.1 (DELETE)」とい う行が聞こえた場合は、(KEEP) が FILE キーワードに対するデフォルト オ プションであることが分かります。この例では、オプションを指定せずに FILE キーワードを組み込んだ場合、デフォルト オプション KEEP が適用さ れます。デフォルト オプションは 1 レベル上の小数点付き 10 進数値にも 適用します。この例では、FILE キーワードが省略されるとデフォルトの FILE(KEEP) が使用されます。しかし、「2? FILE」、「2.1」、「2.1.1! (KEEP)」、および「2.1.1 (DELETE)」という行が聞こえた場合は、デフォル ト オプション KEEP は 1 レベル上の小数点付き 10 進数値 2.1 (関連キ ーワードなし) のみに適用され、2? FILE には適用されません。キーワード FILE が省略されると、いずれも使用されません。 * ゼロ回以上の反復が可能な構文要素を指定します。後ろに * 記号が続く小 数点付き 10 進数値は、この構文要素をゼロ回以上使用できることを示しま す。つまり、これはオプションであり、かつ反復可能です。例えば、 行「 5.1* data-area」が聞こえた場合、複数の data-area を記述するか、ま たは 1 つも記述しないことが可能であると分かります。「3*」、 「3 HOST」、「3 STATE」という行が聞こえた場合は、HOST、STATE 両方を 記述するか、またはいずれも記述しないことが可能であると分かります。 注: 1. 小数点付き 10 進数値の横にアスタリスク (*) があり、その小数点付き 10 進数値が指定された項目が 1 つのみである場合は、その同じ項目を 複数回反復できます。 2. 小数点付き 10 進数値の横にアスタリスクがあり、その小数点付き 10 進数値がいくつかの項目で指定されている場合は、そのリストから複数 の項目を使用できますが、各項目を複数回使用することはできません。 前の例では、HOST STATE と記述することはできますが、HOST HOST とは 記述できません。 3. * 記号は、レールロード構文ダイアグラムでのループバック線に相当し ます。 + 1 回以上組み込む必要がある構文要素を指定します。後ろに + 記号が続く 小数点付き 10 進数値は、この構文要素を 1 回以上組み込む必要があるこ とを示します。例えば、行「6.1+ data-area」が聞こえた場合、少なくとも 1 つの data-area を記述する必要があります。「2+」、「2 HOST」、 付録 D. アクセシビリティ 255 「2 STATE」という行が聞こえた場合、HOST または STATE、もしくはその両 方を記述する必要があると分かります。 * 記号の場合と同様、その小数点 付き 10 進数値が指定された唯一の項目である場合に限り、特定の項目を反 復できます。+ 記号は、* 記号と同様に、レールロード構文ダイアグラムで のループバック線に相当します。 256 IBM Informix JDBC ドライバ プログラマーズ ガイド エラー メッセージ -79700 このメソッドはサポートされていません 説明: IBM Informix JDBC ドライバは、この JDBC メ ソッドをサポートしていません。 -79702 新しいオブジェクトを作成できません 説明: ソフトウェアは新しい String オブジェクトに対 してメモリを割り当てられませんでした。 -79708 説明: 入力された文字列が NULL です。この場合、 IBM Informix JDBC ドライバは NULL の入力値を解析 できません。 ユーザーの処置: 入力文字列を調べて、適切な値が設定 されていることを確認してください。 -79709 -79703 説明: 行/列インデックスが範囲外です 行または列のインデックスが範囲外です。 ユーザーの処置: インデックスを、問合せで予期されて いる行数および列数と比較し、範囲内にあることを確認 してください。 -79704 ユーザーの処置: 日付を調べて、4 桁の年とそれに続く 有効な 2 桁の月と 2 桁の日があることを確認してくだ さい。区切り記号はハイフン (-) である必要がありま す。 -79710 -79705 URL フォーマットが正しくありません 説明: サブミットしたデータベース URL が無効です。 IBM Informix JDBC ドライバはその構文を認識しませ ん。 ユーザーの処置: -79706 構文を確認して再試行してください。 入力が不完全です 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中に無効文字が見つかりました。 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しい値を確認してください。 -79707 日付書式エラーです 説明: 予期される入力は、フォーマット yyyy-mm-dd の 有効な日付ストリングです。 ドライバをロードできません 説明: IBM Informix JDBC ドライバは独自のインスタ ンスを作成できず、それを DriverManager クラスに登 録できませんでした。 SQLException のテキストの残り の部分に、何が失敗したかが記述されています。 NULL は入力できません SQL エスケープ節の構文エラーです 説明: 無効な構文が JDBC エスケープ節に渡されまし た。有効な JDBC エスケープ節構文は中括弧とキーワ ードで分離されます。例えば、{keyword syntax} のよう に記述します。 ユーザーの処置: JDBC 仕様で、エスケープ節の有効な キーワードと構文のリストを確認してください。 -79711 時刻書式エラーです 説明: JDBC エスケープ節に無効な時刻書式が渡されま した。時刻リテラルに対するエスケープ節構文のフォー マットは次のとおりです。{t ’hh:mm:ss’} -79712 タイムスタンプ書式エラーです 説明: 無効なタイムスタンプ書式が JDBC エスケープ 節に渡されました。タイムスタンプ リテラルに対する エスケープ節構文のフォーマットは次のとおりです。{ts ’yyyy-mm-dd hh:mm:ss.f...’} 無効な修飾子です 説明: 最小の要素である長さ、開始値、または終了値か らの INTERVAL 修飾子の構築中にエラーが検出されま した。 ユーザーの処置: 長さ、開始値、および終了値を調べ、 それらが正しいことを確認してください。98 ページの 『時間隔 (INTERVAL) 型』で正しい値を参照してくだ さい。 © Copyright IBM Corp. 1996, 2008 -79713 引数の数が正しくありません 説明: 正しくない数の引数がスカラ関数エスケープ構文 に渡されました。正しい構文は、{fn function(arguments)} です。 ユーザーの処置: 関数に渡された引数の数が正しいこと を確認してください。 257 -79714 この型はサポートされていません 型』で正しい値を参照してください。 説明: IBM Informix JDBC ドライバでサポートされて いないデータ型が指定されました。 -79721 ユーザーの処置: プログラムを調べて、使用されたデー タ型がドライバでサポートされているデータ型であるこ とを確認してください。 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中にエラーが発生しました。 98 ペー ジの『時間隔 (INTERVAL) 型』で正しいフォーマット を確認してください。 -79715 構文エラーです 説明: 無効な構文が JDBC エスケープ節に渡されまし た。有効な JDBC エスケープ節構文は中括弧とキーワ ードで分離されます。例えば、{keyword syntax} のよう に記述します。 ユーザーの処置: JDBC 仕様で、エスケープ節の有効な キーワードと構文のリストを確認してください。 -79722 システム エラーまたは内部エラーです 説明: オペレーティング システムまたはランタイム シ ステム エラー、あるいはドライバの内部エラーが発生 しました。付随するメッセージに、問題についての説明 が記述されています。 -79717 修飾子の長さが無効です 説明: INTERVAL オブジェクトの長さの値が正しくあ りません。 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しい値を参照してください。 -79718 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しい値を参照してください。 修飾子の終了コードが無効です 説明: INTERVAL オブジェクトの終了値が正しくあり ません。 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しい値を参照してください。 -79720 修飾子の開始コードまたは終了コードが無 効です 説明: INTERVAL オブジェクトの開始値または終了値 が正しくありません。 ユーザーの処置: 258 区切り文字が必要です 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中にエラーが発生しました。区切り文 字が必要ですが、見つかりません。98 ページの『時間 隔 (INTERVAL) 型』で正しいフォーマットを確認して ください。 -79724 文字が必要です 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中にエラーが発生しました。変換処理 が完了する前に文字列の終端に到達しました。 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しいフォーマットを確認してください。 修飾子の開始コードが無効です 説明: INTERVAL オブジェクトの開始値が正しくあり ません。 -79719 数字が必要です 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中にエラーが発生しました。数値が必 要ですが、見つかりません。98 ページの『時間隔 (INTERVAL) 型』で正しいフォーマットを確認してくだ さい。 -79723 -79716 間隔 (INTERVAL) 型文字列が無効です 98 ページの『時間隔 (INTERVAL) IBM Informix JDBC ドライバ プログラマーズ ガイド -79725 余分な文字が見つかりました 説明: String 値を IntervalDF または IntervalYM オ ブジェクトに変換中にエラーが発生しました。 文字列 の終端が予期されましたが、文字列にはまだ文字があり ます。 ユーザーの処置: 98 ページの『時間隔 (INTERVAL) 型』で正しいフォーマットを確認してください。 -79726 SQL 文が NULL です 説明: 渡された SQL 文が NULL でした。 ユーザーの処置: プログラムの SQL 文の文字列を調べ て、文字列に有効な文が含まれていることを確認してく ださい。 -79727 文が準備されていません 説明: SQL 文が正しく準備されていません。SQL 文で ホスト変数を使用する場合 (例えば、insert into mytab values (?, ?);) は、その SQL 文を実行する前に connection.prepareStatement() を使用して準備する必要 があります。 -79728 オブジェクト型が不明です 説明: このオブジェクト型が NULL の不透明 (OPAQUE) 型の場合、型は不明となり、処理されませ ん。このオブジェクト型が複合データ型の場合、コレク ションまたは配列内のデータは不明型となり、Informix のデータ型にマップできません。このオブジェクト型が 行の場合、行内の要素の 1 つを Informix のデータ型に マップできません。カスタマイズされた型マッピングま たはオブジェクトのデータ型を確認してください。 -79729 説明: 接続が確立されていませんでした。 MaxRows が範囲外です 説明: 範囲外の maxRow 値を指定しました。必ず 0 と Integer.MAX_VALUE の間の値を指定してくださ い。 -79732 カーソル名が不正です 説明: 指定されたカーソル名は無効です。渡された文字 列が NULL または空でないことを確認してください。 -79733 説明: INFORMIXSERVER は Informix データベースに 接続するために必要なプロパティです。データベース URL 内に指定するか、connect() メソッドに渡される Properties オブジェクトの一部として指定できます。 -79735 プロトコルをインスタンス化できません 説明: 接続試行中に内部エラーが発生しました。テクニ カル サポートに連絡してください。 -79736 接続/文が確立されていません 説明: 現行接続または文がありません。 ユーザーの処置: プログラムを調べて、接続が正しく確 立されていること、または文が作成されていることを確 認してください。 -79737 メタデータがありません 説明: この SQL 文に使用可能なメタデータがありませ ん。 ユーザーの処置: 使用を試行する前に、この文が結果セ ットを生成することを確認してください。 接続が確立されていません ユーザーの処置: 最初に DriverManager.getConnection() メソッドまたは DataSource.getConnection()メソッドを呼び出して、接続 を取得する必要があります。 -79731 INFORMIXSERVER を指定する必要があ ります メソッドは引数を取りません 説明: このメソッドは引数を取りません。ご使用の Java API 仕様、またはこのガイドの該当するセクショ ンを参照して、メソッドを適切に使用していることを確 認してください。 -79730 -79734 アクティブな結果がありません 説明: 文にアクティブな結果が含まれていません。プロ グラム ロジックを調べて、結果を参照する前に executeXXX() メソッドを呼び出していることを確認し てください。 -79738 そのような列名は存在しません 説明: 指定された列名は存在しません。列名が正しいこ とを確認してください。 -79739 現在行がありません 説明: カーソルが適切に位置決めされていません。最初 に、ResultSet.next()、ResultSet.beforeFirst()、 ResultSet.first()、ResultSet.absolute() などのメソッドを 使用して、結果セット内でカーソルを位置決めする必要 があります。 -79740 文が作成されていません 説明: 現行文がありません。文が正しく作成されている ことを確認してください。 -79741 次のデータ型に変換できません 説明: 列のデータ型から指定されたデータ型へのデータ 変換は不可能です。実際のデータ型はこのメッセージの 最後に示されます。 ユーザーの処置: プログラム ロジックを調べて、要求 した変換がサポートされていることを確認してくださ エラー メッセージ 259 い。データ マッピング マトリックスについては、付録 C を参照してください。 -79742 次のデータ型から変換できません 説明: 指定されたデータ型から列のデータ型へのデータ 変換は不可能です。実際のデータ型はこのメッセージの 最後に示されます。 ユーザーの処置: プログラム ロジックを調べて、要求 した変換がサポートされていることを確認してくださ い。データ マッピング マトリックスについては、付録 C を参照してください。 -79744 トランザクションがサポートされていませ ん 説明: トランザクションをサポートしていないデータベ ースに対して commit() または rollback() を呼び出そう としたか、またはログなしのデータベースに対して autoCommit を False に設定しようとしました。 ユーザーの処置: 現行データベースが正しいロギング モードになっていることを確認し、プログラム ロジッ クを見直してください。 -79745 読取り専用モードはサポートされていませ ん 説明: Informix は読取り専用モードをサポートしてい ません。 -79746 ログなしデータベースではトランザクショ ン排他設定を行えません 説明: Informix は、ログなしデータベースに対するト ランザクション排他レベルの設定はサポートしていませ ん。 -79748 説明: IBM Informix JDBC ドライバは通常、データベ ース サーバとのデータ交換を開始する直前に接続オブ ジェクトをロックします。ドライバはロックを取得でき ませんでした。接続オブジェクトを同時に使用できるの は、1 つのスレッドのみです。 -79749 トランザクション排他レベルが無効です 説明: データベース サーバがロールバックを完了でき なかった場合、このエラーが発生します。ロールバック が失敗した理由の詳細については、SQLException メッ セージの残りの部分を参照してください。 このエラーは setTransactionIsolation() に無効なトラン ザクション レベルが渡された場合にも発生します。有 効な値は次のとおりです。 v TRANSACTION_READ_UNCOMMITTED v TRANSACTION_READ_COMMITTED v TRANSACTION_REPEATABLE_READ v TRANSACTION_SERIALIZABLE 260 IBM Informix JDBC ドライバ プログラマーズ ガイド 入力値の数が疑問符の数と一致しません 説明: この文で PreparedStatement.setXXX() メソッド を使用して設定した変数の数が、この文に記述した位置 指定子 ? の数と一致していません。 ユーザーの処置: この文のテキストを見つけて位置指定 子の数を確認してから、PreparedStatement.setXXX() の 呼出しを確認してください。 -79750 問合せ専用のメソッドです 説明: Statement.executeQuery(String) メソッドおよび PreparedStatement.executeQuery() メソッドは、文が SELECT 文である場合にのみ使用できます。それ以外の 文の場合は、Statement.execute(String)、 Statement.executeBatch()、 Statement.executeUpdate(String)、 Statement.getUpdateCount()、 Statement.getResultSet()、または PreparedStatement.executeUpdate() メソッドを使用して ください。 -79755 オブジェクトが NULL です 説明: 渡されたオブジェクトが NULL です。プログラ ム ロジックを調べて、オブジェクト参照が有効である ことを確認してください。 -79756 -79747 接続をロックできません 「jdbc」で始まる必要があります 説明: データベース URL の最初のトークンは、次の例 に示すようにキーワード jdbc (大文字と小文字を区別し ない) である必要があります。 jdbc:informix-sqli://mymachine:1234/ mydatabase:user=me: password=secret -79757 説明: す。 サブプロトコルが無効です 現在有効なサブプロトコルは informix-sqli で -79758 IP アドレスが無効です 説明: IP アドレスを使用して Informix データベース サーバに接続するときは、その IP アドレスが有効であ る必要があります。有効な IP アドレスは、ピリオド (.) で分離された、0 から 255 までの 4 つの数字のセット です (例: 127.0.0.1)。 -79759 ポート番号が無効です 説明: ポート番号は次のように 4 桁の有効な数字でな ければなりません。 jdbc:informix-sqli://mymachine:1234/ mydatabase:user=me: password=secret この例では、1234 がポート番号です。 -79760 データベース名が無効です 説明: この文には無効なフォーマットのデータベース名 があります。 データベース名とカーソル名の最大長は、データベース サーバのバージョンによって異なります。Informix デー タベース サーバのバージョン 7.x、8.x、および 9.1x で は、最大長は 18 文字です。 IBM Informix SE では、データベース名の最大長は 10 文字 (いくつかのホスト オペレーティング システムで は 10 文字未満) です。 データベース名とカーソル名はともに、文字で始まる必 要があり、文字、数字、および下線文字 (_) のみを使用 できます。データベース サーバの 6.0 以降のバージョ ンでは、データベース名とカーソル名を下線で始めるこ とができます。 MS-DOS システムの場合、ファイル名は最大で 8 文字 であり、それに加え拡張子に 3 文字を使用できます。 -79762 説明: バージョン 5.x のデータベース サーバに接続す る場合、ユーザは、データベース URL プロパティ USE5SERVER を任意の非 NULL 値に設定する必要が あります。その後で、バージョン 6.0 以降のデータベー ス サーバに接続すると、この例外が呼び出されます。 ユーザーの処置: データベース サーバのバージョンが 正しいことを確認し、必要に応じてデータベース URL を訂正してください。 -79764 -79765 ユーザーの処置: key=value ペアの構文に構文エラーが ないか調べてください。= 符号が 1 つだけで、キー、 値、= 符号の間にスペースがなく、key=value ペアが空 白を含まない 1 つのコロン (:) で区切られていること を確認してください。 ResultSet タイプは TYPE_FETCH_FORWARD です。方向は FETCH_FORWARD のみ指定可能です 説明: 結果セット型が TYPE_FORWARD_ONLY に設 定されていますが、setFetchDirection() メソッドが FETCH_FORWARD 以外の値で呼び出されました。指定 された方向が指定された結果型と整合している必要があ ります。 -79766 フェッチ サイズの値が正しくありません 説明: Statement.setFetchSize() メソッドが、無効な値 で呼び出されました。渡された値が 0 より大きいこと を確認してください。setMaxRows() メソッドが呼び出 された場合、フェッチ サイズはその値を超えることが できません。 プロパティ フォーマットが無効です 説明: データベース URL は key=value のペアになっ たプロパティ値を受け入れます。例えば、 user=informix:password=informix は key=value ペアを 接続オブジェクトに渡されるプロパティのリストに追加 します。 フェッチ方向の値が無効です 説明: Statement.setFetchDirection() メソッドまたは ResultSet.setFetchDirection() メソッドに、無効なフェッ チ方向が引数として渡されました。有効な値は、 FETCH_FORWARD、FETCH_REVERSE、および FETCH_UNKNOWN です。 -79767 -79761 5.x 以外のサーバに接続しようとしました ResultSet タイプが TYPE_FORWARD_ONLY です 説明: ResultSet.beforeFirst()、ResultSet.afterLast()、 ResultSet.first()、ResultSet.last()、ResultSet.absolute()、 ResultSet.relative()、ResultSet.current()、または ResultSet.previous() などのメソッドが呼び出されました が、結果セット型が TYPE_FORWARD_ONLY です。結 果セット型が TYPE_FORWARD_ONLY の場合は、 ResultSet.next() メソッドのみを呼び出してください。 -79768 行の値が正しくありません 説明: ResultSet.absolute(int) メソッドが値 0 を使用し て呼び出されました。パラメータは 0 より大きい値で ある必要があります。 エラー メッセージ 261 -79769 このデータ型にはカスタマイズされた型マ ップが必要です 説明: 不透明 (OPAQUE) 型を使用するにはカスタマイ ズされた型マップの登録が必要です。 -79770 SQLData または Struct で指定された SQLTypeName が見つかりません 説明: SQLData または Struct クラスで指定した SQLTypename オブジェクトはデータベースに存在しま せん。型名が有効であることを確認してください。 -79771 もう読み込むデータがありません。 SQLData クラスまたは getSQLTypeName() を確認してください 説明: このエラーは、データ入力ストリームから取得で きる不透明 (OPAQUE) 型データの終端以降の位置の読 込みまたは設定を、Java ユーザ定義ルーチンが行おうと した場合に発生します。 ユーザーの処置: 不透明 (OPAQUE) 型の長さと構造 を、データ入力 UDR コードに対して慎重にチェックし てください。 getSQLTypeName() メソッドが戻した SQLTypeName オブジェクトも正しくない可能性があり ます。 -79774 ローカル ファイルを作成できません 説明: データベース サーバから読み込んだラージ オブ ジェクトのデータは、メモリまたはローカル ファイル のいずれかに格納できます。LOBCACHE 値が 0 であ るか、またはラージ オブジェクトのサイズが LOBCACHE 値より大きい場合、データベース サーバ から読み込んだラージ オブジェクト データは常にファ イルに格納されます。この場合、セキュリティ例外が発 生すると、IBM Informix JDBC ドライバはラージ オブ ジェクトをメモリに格納しようとせずにこの例外を呼び 出します。 -79775 TYPE_SCROLL_INSENSITIVE と TYPE_FORWARD_ONLY のみがサポー トされます 説明: IBM Informix JDBC ドライバがサポートする結 果セット型は、TYPE_SCROLL_INSENSITIVE と 262 -79776 IBM Informix JDBC ドライバ プログラマーズ ガイド 要求された型 (%s) が行型情報 (%s) の 型と一致しません 説明: 行型情報がシステム カタログ、または指定した 行定義から取得されました。指定した行データが該当す る行要素型と一致しません。型情報を修正するか、また はデータを指定する必要があります。 -79777 入力した値が無効です 説明: 入力された値はこのデータ型に対して受け入れら れません。このデータ型に対して有効な入力であること を確認してください。 -79772 TYPE_FORWARD_ONLY のみです。これらの値のみを 使用してください。 readObject/writeObject() は、UDT、ディ スティンクト (DISTINCT) 型、および複 合データ型のみをサポートします 説明: ユーザ定義型、ディスティンクト (DISTINCT) 型、または複合データ型以外のオブジェクトに対して SQLData.writeObject() メソッドが呼び出されました。 ユーザーの処置: カスタマイズされた型マッピング情報 を提供したことを確認してください。 -79778 型マッピング クラスは java.util.Collection インプリメンテーショ ンである必要があります 説明: セット (SET) 型、リスト (LIST) 型、またはマ ルチセット (MULTISET) 型のデフォルトを上書きする 型マッピングが指定されましたが、クラスに java.util.Collection インターフェイスが実装されていま せん。 -79780 Java クラスおよび長さは、コレクション 内のデータですべて同じにしてください。 説明: コレクション内のすべてのオブジェクトが同じク ラスであることを確認してください。 -79781 インデックス/カウントが範囲外です 説明: インデックスおよびカウント値を指定して Array.getArray() または Array.getResultSet() が呼び出 されました。インデックスが範囲外であるか、カウント 値が大きすぎます。 ユーザーの処置: 配列の要素数が、インデックスとカウ ント値に対して十分であることを確認してください。 -79782 メソッドは 1 回だけ呼び出すことができ ます 説明: Statement.getUpdateCount() および Statement.getResultSet() などのメソッドが 1 つの結果 に対して 1 回だけ呼び出されていることを確認してく ださい。 -79783 エンコードまたはコード セットがサポー トされていません 説明: DB_LOCALE または CLIENT_LOCALE 変数 に入力されたエンコードまたはコード セットが無効で す。 ユーザーの処置: 198 ページの『コード セット変換の サポート』で有効なコード セットを確認してくださ い。 -79784 -79788 ユーザ名を指定する必要があります 説明: IBM Informix JDBC ドライバで接続を確立する ためにはユーザ名が必要です。 ユーザーの処置: user=your_user_name を、データベー ス URL またはプロパティの 1 つとして渡してくださ い。 -79789 ロケールがサポートされていません サーバは GLS 変数 DB_LOCALE、CLIENT_LOCALE、また は GL_DATE をサポートしていません 説明: DB_LOCALE または CLIENT_LOCALE 変数 に入力されたロケールが無効です。 説明: これらの変数は、データベース サーバが GLS をサポートしている場合にのみ使用できます。 ユーザーの処置: 198 ページの『コード セット変換の サポート』で有効なロケールを確認してください。 ユーザーの処置: ご使用のデータベース サーバ バージ ョンのマニュアルを確認し、サポートされていない場合 はこれらの変数を省略してください。 -79785 JDBC エスケープ フォーマット日付スト リングをローカライズされた日付ストリン グに変換できません 説明: 日付値に対する JDBC エスケープ フォーマット は、フォーマット {d ’yyyy-mm-dd’} で指定する必要が あります。指定した JDBC エスケープ日付書式が正し いことを確認してください。 ユーザーの処置: DBDATE または GL_DATE のいず れかが、接続データベース URL 文字列またはプロパテ ィ リストの値に設定された場合は、これらの設定が正 しい日付ストリング フォーマットになっていることを 確認してください。 -79786 ローカライズされた日付ストリング表現に 従って Date オブジェクトを作成できませ ん 説明: 文字 (CHAR) 型列、可変長文字 (VARCHAR) 型 列、またはラージ可変長文字 (LVARCHAR) 型列で指定 されたローカライズされた日付ストリング表現が正しく なく、年、月、および日の値に基づいて日付オブジェク トを作成できません。 ユーザーの処置: DBDATE または GL_DATE 日付書 式が接続データベース URL 文字列またはプロパティ リストに指定されている場合は、日付ストリング表現が DBDATE または GL_DATE 日付書式に準拠している ことを確認してください。DBDATE と GL_DATE は どちらも指定されていないが、CLIENT_LOCALE また は DB_LOCALE が接続データベース URL 文字列また はプロパティ リストで明示的に設定されている場合 は、日付ストリング表現が JDK の短いデフォルト フォ ーマット (DateFormat.SHORT) に準拠していることを 確認してください。 -79790 複合データ型を定義する文字列が無効です 説明: getSQLTypeName() メソッドにより戻される値 が NULL または無効です。 ユーザーの処置: 文字列が有効な名前付き行名または有 効な行型定義であることを確認してください。 -79792 行にデータが含まれている必要があります 説明: Array.getAttributes() メソッドまたは Array.getAttributes(Map) メソッドは 0 の要素を戻しま した。これらのメソッドはゼロ以外の数字を戻す必要が あります。 -79793 配列内のデータが getBaseType() 値と一 致しません 説明: Array.getArray() メソッドまたは Array.getArray(Map) メソッドが、要素型が JDBC 基 本型と一致しない配列を戻します。 -79794 指定された行の長さ (%s) が行型情報 (%s) と一致しません 説明: 行内のデータが行型情報で指定されている長さと 一致しません。 文字列の長さが行定義で指定されてい る長さと一致するよう文字を埋め込む必要はありません が、これ以外のデータ型については長さを一致させる必 要があります。 エラー メッセージ 263 -79795 指定された行拡張 ID (%s) が行型情報 (%s) と一致しません 説明: 行のオブジェクトの拡張 ID が、行型情報で定 義されている拡張 ID と一致しません。 ユーザーの処置: 行型情報を更新する (行定義をユーザ が行っている場合) か、または型マッピング情報を確認 してください。 -79796 データベースに UDT、ディスティンクト (DISTINCT) 型、または名前付き行 (%s) が見つかりません 説明: getSQLTypeName() メソッドがデータベースに 見つからない名前を戻しました。 ユーザーの処置: Struct または SQLData オブジェク トが正しい情報を戻すことを確認してください。 -79797 DBDATE 設定は、4 文字以上 6 文字以 下である必要があります 説明: このエラーは、データベース サーバに渡される DBDATE フォーマット文字列の文字数が少なすぎるか 多すぎる場合に発生します。 ユーザーの処置: この問題を解決するには、ユーザ マ ニュアルで DBDATE フォーマット文字列を確認し、 DBDATE フォーマット文字列の正しい年、月、日、お よび場合により時代に該当する部分が、正しく示されて いることを確認します。 -79798 DBDATE 文字列の文字「Y」の後には、 年拡張の数値が必要です 説明: このエラーは、DBDATE 形式の文字列に年指定 (Y 文字で指定) があるが、年指定の後に数値形式の年拡 張を表す文字 (2 または 4) がない場合に発生します。 ユーザーの処置: この問題を解決するには、DBDATE フォーマット文字列を修正して、数値形式の年拡張の数 値を Y 文字の後に指定します。 -79799 DBDATE 文字列の文字「Y」の後に無効 文字が見つかりました 説明: このエラーは、DBDATE 形式の文字列に年指定 (Y 文字で指定) があるが、年指定の後に続く文字が 2 または 4 (それぞれ、2 桁の年または 4 桁の年) でない 場合に発生します。 ユーザーの処置: この問題を解決するには、DBDATE フォーマット文字列を修正して、必要な数値形式の年拡 張の数値を Y 文字の後に指定します。Y 文字指定の直 264 IBM Informix JDBC ドライバ プログラマーズ ガイド 後には、文字 2 または 4 のみを続けることができま す。 -79800 年拡張数値の前に文字「Y」が指定されて いません 説明: このエラーは、DBDATE フォーマット文字列に 数値形式の年拡張の数値 (2 または 4。それぞれ 2 桁ま たは 4 桁の年を表す) が指定されているが、年指定の文 字 (Y) が指定された数値形式の年拡張文字の直前にない ために発生します。 ユーザーの処置: この問題を解決するには、DBDATE フォーマット文字列を修正して、必要な Y 文字を要求 された数値形式の年拡張値の直前に指定します。 -79801 DBDATE フォーマット文字列に無効文字 が見つかりました 説明: このエラーは、DBDATE フォーマット文字列に 使用できない文字が含まれているために発生します。 ユーザーの処置: この問題を解決するには、DBDATE フォーマット文字列を修正して、次の正しい日付部分指 定のみを含めるようにします。年 (Y)、数値形式の年拡 張値 (2 または 4)、月 (M)、および日 (D)。オプション で、時代指定 (E) とデフォルトの分離文字 (ハイフン (-)、ピリオド (.)、またはスラッシュ (/)) を組み込むこ とができます。分離文字は DBDATE フォーマット文字 列の最後に指定します。正しい DBDATE フォーマット 文字列の文字指定の詳細については、ユーザ マニュア ルを参照してください。 -79802 日付値の文字列表現に指定されたトークン が十分ではありません 説明: このエラーは、指定された日付ストリングに、有 効な日付値 (年、月、および日の数値要素から構成) を 形成するのに最低必要な数のトークンまたは分離文字が ないために発生します。例えば、12/15/98 は、スラッシ ュ文字を分離文字またはトークンとして使用した有効な 日付ストリング表現です。一方、12/1598 は十分な分離 文字またはトークンがないため有効な日付ストリング表 現ではありません。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、日付値の日、月、および年の要素 を分離するための有効なフォーマットを指定します。 -79803 Date オブジェクトの作成のための日付書 式の構文解析中に、限度外の日付ストリン グ インデックスが検出されました 説明: このエラーは、DBDATE または GL_DATE が 必要とする日付ストリング フォーマットと、ユーザが 定義した実際の日付ストリング表現との間に、1 対 1 の対応関係がないために発生します。例えば、 GL_DATE が %b %D %y に設定されているときに文字列 Oct を指定した場合、GL_DATE が必要とするフォーマ ットと実際の日付ストリングとの間に明確なミスマッチ が存在します。 ユーザーの処置: この問題を解決するには、DBDATE または GL_DATE 設定の日付ストリング表現を修正し て、指定された日付書式が、必要とされる日付ストリン グ表現と 1 対 1 で一致するようにします。 -79804 日付値の DBDATE 文字列表現にトーク ンがこれ以上見つかりません 説明: このエラーは、指定された日付ストリングに DBDATE フォーマット文字列に基づいた有効な日付値 (年、月、および日の数値要素から構成) を形成するのに 必要なトークンまたは分離文字がこれ以外にないために 発生します。例えば、DBDATE が MDY2/ に設定されて いるとき、12/15/98 は有効な日付ストリング表現です。 一方、12/1598 は十分な分離文字またはトークンがない ため有効な日付ストリング表現ではありません。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、DBDATE フォーマット文字列設 定に基づいて日付値の日、月、および年の要素を分離す るための有効なフォーマットを指定します。 -79805 日付値の DBDATE/GL_DATE 文字列表 現に時代指定が見つかりません 説明: このエラーは、指定した日付ストリングに、 DBDATE または GL_DATE フォーマット文字列設定 が必要とする有効な時代指定がないために発生します。 例えば、DBDATE が Y2MDE- に設定されているとき に、ユーザにより指定された日付ストリング表現が 98-12-15 である場合、日付ストリング値の最後に時代 指定がないためエラーになります。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、DBDATE または GL_DATE フ ォーマット文字列設定に基づく有効な時代指定を含める ようにします。この例では、ロケールにもよりますが、 日付ストリング表現 98-12-15 AD で足りるものと考え られます。 -79806 DBDATE に基づいて日付ストリングから 日の数値を判別できません 説明: このエラーは、指定された日付ストリングに DBDATE フォーマット文字列設定が要求する有効な数 値形式の日指定がないために発生します。例えば、 DBDATE が Y2MD- に設定されている場合に、指定した 日付ストリング表現が 98-12-blah であると、エラーに なります。これは、blah が有効な数値形式の日表現で はないためです。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、DBDATE フォーマットの文字列 設定に基づいた有効な数値型日指定 (1 から 31) を指定 します。 -79807 DBDATE に基づいて日付ストリングから 月の数値を判別できません 説明: このエラーは、指定された日付ストリングに DBDATE フォーマット文字列設定が要求する有効な数 値形式の月指定がないために発生します。例えば、 DBDATE が Y2MD- に設定されている場合に、指定した 日付ストリング表現が 98-blah-15 であると、エラーに なります。これは、blah が有効な数値型の月表現では ないためです。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、DBDATE フォーマットの文字列 設定に基づいた有効な数値型月指定 (1 から 12) を指定 します。 -79808 日付ストリングの %D ディレクティブ表 現に指定されたトークンが十分ではありま せん 説明: このエラーは、指定された日付ストリングに GL_DATE %D ディレクティブ (mm/dd/yy フォーマッ ト) に基づいた有効な日付値を形成するのに必要な正し い数のトークンまたは分離文字がないために発生しま す。例えば、12/15/98 は GL_DATE %D ディレクティ ブに基づいた有効な日付ストリング表現ですが、12/1598 は分離文字またはトークンが不十分なため有効な日付ス トリング表現ではありません。 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、GL_DATE %D ディレクティブに 対して有効なフォーマットを指定します。 -79809 日付ストリングの %x ディレクティブ表 現に十分なトークンが指定されていません 説明: このエラーは、指定された日付ストリングに GL_DATE %x ディレクティブ (必要なフォーマット は、日、月、年の部分に基づき、各部分の順序は指定さ れたロケールで決定) に基づいた有効な日付値を形成す るのに必要な正しい数のトークンまたは分離文字がない ために発生します。例えば、12/15/98 は GL_DATE %x ディレクティブに基づいた米国英語ロケールに対する有 効な日付ストリング表現ですが、12/1598 は分離文字ま たはトークンが不十分なため有効な日付ストリング表現 ではありません。 エラー メッセージ 265 ユーザーの処置: この問題を解決するには、日付ストリ ング表現を修正して、ロケールに基づいて GL_DATE %x ディレクティブに対して有効なフォーマットを指定 します。 -79811 ユーザ/パスワードを使用しない接続はサ ポートされていません 説明: DataSource オブジェクトに対して getConnection() メソッドを呼び出しましたが、ユーザ名 またはパスワードが NULL です。 ユーザーの処置: getConnection() メソッドのユーザ名 とパスワードの引数を使用するか、またはこれらの値を DataSource オブジェクトで設定します。 -79812 ユーザ/パスワードがデータ ソースと一致 しません 説明: DataSource オブジェクトに対して getConnection(user, passwd) メソッドを呼び出しました が、指定した値がデータ ソースにすでに存在している 値と一致しません。 -79814 BLOB/CLOB オブジェクトがクローズさ れているか無効です 説明: ResultSet.getBlob() メソッドまたは ResultSet.getClob() メソッドを使用してスマート ラージ オブジェクトを取得するか、IfxBlob() コンストラクタ または IfxCblob() コンストラクタを使用してスマート ラージ オブジェクトを作成すると、スマート ラージ オブジェクトがオープンされます。これでスマート ラ ージ オブジェクトからの読取りまたはそれへの書込み ができるようになります。IfxBlob.close() メソッドの実 行後は、以降の読取り/書込み操作にスマート ラージ オ ブジェクトのハンドルを使用しないでください。これを 行うとこの例外が呼び出されます。 -79815 挿入モードではありません。最初に moveToInsertRow() を呼び出す必要があ ります 説明: insertRow() メソッドの使用を試みましたが、モ ードが挿入に設定されていません。 ユーザーの処置: insertRow() を呼び出す前に moveToInsertRow() メソッドを呼び出してください。 -79816 表名が判別できません 説明: 問合せで指定した表名が正しくないか、または存 在しない表を参照しています。 266 IBM Informix JDBC ドライバ プログラマーズ ガイド -79817 文に、シリアル (SERIAL) 型列、行 ID、 または主キーが指定されていません 説明: 更新可能なスクロール可能機能は、問合せに指定 されたシリアル (SERIAL) 型列、主キー、または行 ID を持つ表に対してのみ動作します。表に上記のいずれも 含まれない場合は、更新可能な両方向スクロール カー ソルは作成できません。 -79818 文の同時実行タイプが CONCUR_UPDATABLE に設定されてい ません 説明: CONCUR_UPDATABLE 同時実行タイプで作成 されていない文に対して insertRow() メソッド、 updateRow() メソッド、または deleteRow() メソッドを 呼び出そうとしました。 ユーザーの処置: 同時実行属性にこのタイプを設定して 文を再作成してください。 -79819 まだ挿入モードです。最初に moveToCurrentRow() を呼び出してくだ さい 説明: 挿入モードの間は updateRow() メソッドまたは deleteRow() メソッドを呼び出せません。最初に moveToCurrentRow() メソッドを呼び出してください。 -79820 関数に出力パラメータが含まれています 説明: OUT パラメータを含む文を渡しましたが、OUT パラメータの処理のために、ドライバの CallableStatement.registerOutParameter() メソッドおよ び getXXX() メソッドを使用していません。 -79821 このデータ型には名前は不要です 説明: 名前を必要とするデータ型 (不透明 (OPAQUE) 型または複合データ型) がある場合は、以下のメソッド のように名前に対するパラメータがあるメソッドを呼び 出す必要があります。 public void IfxSetNull(int i, int ifxType, String name) public void registerOutParameter (int parameterIndex, int sqlType, java.lang.String name); public void IfxRegisterOutParameter (int parameterIndex, int ifxType, java.lang.String name); 指定したデータ型は名前を必要としません。 ユーザーの処置: 型パラメータのない別のメソッドを使 用してください。 -79822 OUT パラメータが登録されていません 説明: CallableStatement インターフェイスを使用して 指定された関数に、登録されていない OUT パラメータ が含まれています。 ユーザーの処置: executeQuery() メソッドを呼び出す 前に registerOutParameter() メソッドか IfxRegisterOutParameter() メソッドのどちらかを呼び出 して、OUT パラメータ型を登録してください。 -79823 ユーザーの処置: IN パラメータに NULL 値を設定す る場合は、setNull() メソッドまたは IfxSetNull() メソッ ドを呼び出してください。それ以外の場合は、 PreparedStatement インターフェイスから継承された設 定メソッドのいずれかを呼び出してください。 OUT パラメータが設定されていません 説明: CallableStatement インターフェイスを使用して 指定された関数に、設定されていない OUT パラメータ が含まれています。 ユーザーの処置: OUT パラメータに NULL 値を設定 する場合は、setNull() メソッドまたは IfxSetNull() メソ ッドを呼び出してください。それ以外の場合は、 PreparedStatement インターフェイスから継承された設 定メソッドのいずれかを呼び出してください。 -79825 このデータ型には型名が必要です 説明: このデータ型は、不透明 (OPAQUE) 型、ディス ティンクト (DISTINCT) 型、または複合データ型である ため、名前を必要とします。 ユーザーの処置: IN パラメータに対してはパラメータ として型名を取る設定メソッド、OUT パラメータに対 してはパラメータとして型名を取る登録メソッドを使用 してください。 -79826 -79827 関数に出力パラメータがありません 説明: この関数には OUT パラメータがないか、また はこの関数の OUT パラメータの値をサーバ バージョ ンが戻しません。CallableStatement インターフェイス のどのメソッドも適用されません。PreparedStatement インターフェイスから継承されたメソッドを使用してく ださい。 IN パラメータが設定されていません 説明: CallableStatement インターフェイスを使用して 指定された関数に、設定されていない IN パラメータが 含まれています。 -79824 の 1 つを使用して Informix データ型を指定してくださ い。 あいまいな java.sql.Type です。 IfxRegisterOutParameter() を使用してく ださい 説明: 指定された SQL データ型には Informix データ 型へのマッピングがないか、または複数のマッピングが 存在します。 ユーザーの処置: IfxRegisterOutParameter() メソッド -79828 指定された関数パラメータは OUT パラ メータではありません 説明: Informix の関数には OUT パラメータを 1 つだ け指定でき、このパラメータは必ず最後に指定します。 -79829 GL_DATE 環境変数に無効なディレクテ ィブが使用されました 説明: GL_DATE 環境変数で指定された 1 つ以上のデ ィレクティブが使用できません。192 ページの 『GL_DATE 変数』で、GL_DATE フォーマットに対す る有効なディレクティブのリストを参照してください。 -79830 Time または Timestamp Java オブジェ クトを構築するための情報が足りません。 説明: java.sql.Timestamp または java.sql.Time オブジ ェクトを作成するために文字列からバイナリ形式へ正し く変換するには、選択された日付ストリング表現に対し てすべての DATETIME フィールドが指定されている必 要があります。java.sql.Timestamp オブジェクトの場合 は、年、月、日、時間、分、および秒の部分を文字列表 現で指定する必要があります。java.sql.Time オブジェク トの場合は、時間、分、および秒の部分を文字列表現で 指定する必要があります。 -79831 Connection Pool Manager に対して構成 された最大接続数を超えました 説明: 接続をクローズせずに DataSource オブジェクト を使用してデータベースへの接続を繰り返すと、接続が 累積されます。DataSource オブジェクトに対する接続 の総数が最大制限 (100) を超えると、このエラーが呼び 出されます。 -79834 分散トランザクション (XA) は、このサ ーバではサポートされていません 説明: このエラーは、ユーザが XPS サーバに対してメ ソッド XAConnection.getConnection() を呼び出した場 合に発生します。 エラー メッセージ 267 -79836 プロキシ エラー: データベース接続があ りません 説明: 無効または間違ったデータベース接続でデータベ ースと通信しようとすると、Informix HTTP プロキシに よってこのエラーが呼び出されます。 ユーザーの処置: アプリケーションがデータベースへの 接続をオープンしていることを確認し、Web サーバと データベースのエラー ログを確認してください。 -79837 プロキシ エラー: データベースとの通信 中に入出力エラーが発生しました 説明: プロキシとデータベースとの通信中にエラーが検 出されると、Informix HTTP プロキシによってこのエラ ーが呼び出されます。データベース サーバにアクセス できない場合にこのエラーが発生する可能性がありま す。 ユーザーの処置: データベース サーバにアクセスでき ることを確認し、データベースおよび Web サーバのエ ラー ログを確認してください。 -79840 説明: このエラーは setJarTmpPath() を使用して設定 されたパス名に対して、ユーザ informix または JDBC 接続で指定されているユーザが書き込めない場合に発生 します。 ユーザーの処置: パス名がどのユーザからも読込みおよ び書込み可能であることを確認してください。 -79842 アクセス権を変更するコマンド (chmod/attrib) を実行できません。 説明: ドライバはクライアント JAR ファイルに対する アクセス権を変更できません。このエラーは、クライア ントのプラットフォームが chmod または attrib コマン ドをサポートしていない場合、または JDBC アプリケ ーションを実行中のユーザがクライアント JAR ファイ ルに対するアクセス権を変更する権限を持たない場合に 発生する可能性があります。 ユーザーの処置: chmod または attrib コマンドがご使 用のプラットフォームで使用可能なこと、およびアプリ ケーションを実行中のユーザにクライアント JAR ファ イルに対するアクセス権を変更する権限があることを確 認してください。 -79839 同じ Jar SQL 名がシステム カタログに すでに存在しています 説明: アプリケーションが UDTManager.createJar() を 呼び出したときに指定した JAR ファイル名は、すでに データベース サーバに登録されています。 ユーザーの処置: UDTMetaData.setJarFileSQLName() を使用して、JAR ファイルに対して異なる SQL 名を指 定してください。 UDR 情報が UDRMetaData に設定され ていません。 説明: アプリケーションはデータベース サーバに登録 する UDR を指定せずに UDRManager.createUDRs() メ ソッドを呼び出しました。 ユーザーの処置: UDRManager.createUDRs() メソッド を呼び出す前に UDRMetaData.setUDR() メソッドを呼 び出して、データベース サーバに登録する UDR を指 定してください。 -79843 -79838 JAR ファイルをクライアントからサーバ にコピーできません。 JAR ファイルの SQL 名が UDR/UDT MetaData で設定されていません 説明: データベース サーバに対して登録する不透明 (OPAQUE) 型または UDR を含む JAR ファイルに対す る SQL 名を指定せずに、UDTManager.createUDT() メ ソッドまたは UDRManager.createUDRs() メソッドのい ずれかをアプリケーションが呼び出しました。 ユーザーの処置: UDTManager.createUDT() メソッド または UDRManager.createUDRs() メソッドを呼び出す 前に、UDTMetaData.setJarFileSQLName() メソッドま たは UDRMetaData.setJarFileSQLName() メソッドを呼 び出して、JAR ファイルに対する SQL 名を指定しま す。 -79844 接続でデータベースが指定されていないた め、UDT/UDR を作成または削除できま せん。 説明: アプリケーションはデータベースを指定せずに接 続しました。接続を確立して test という名前のデータ ベースをオープンする例を次に示します。 url = "jdbc:informix-sqli:myhost:1533/test:" + "informixserver=myserver;user=rdtest; password=test"; conn = DriverManager.getConnection(url); データベースをオープンせずに接続を確立する例を次に 示します。 268 IBM Informix JDBC ドライバ プログラマーズ ガイド url = "jdbc:informix-sqli:myhost:1533:" + "informixserver=myserver;user=rdtest; password=test"; conn = DriverManager.getConnection(url); ユーザーの処置: この問題を解決するには、接続の確立 後、createUDT() メソッドまたは createUDRs() メソッ ドを呼び出す前に、次の SQL 文を使用します。 Statement stmt = conn.createStatement(); stmt.executeUpdate("create database test ..."); 次のコードを使用することもできます。 stmt.executeUpdate("database test"); -79845 クライアント上の JAR ファイルが存在し ないか、または読み取れません 説明: このエラーは以下のいずれかの理由により発生し ます。 v クライアント JAR ファイルの作成に失敗した。 v クライアント JAR ファイルに誤ったパス名を指定し た。 v JDBC アプリケーションを実行しているユーザ、また は接続で指定されたユーザが、クライアント JAR フ ァイルのオープンまたは読込みを行うためのアクセス 権を持っていない。 -79846 JAR ファイル名が無効です。 説明: アプリケーションが UDTManager.createUDT() または UDRManager.createUDRs() への 2 番目のパラ メータとして指定したクライアント JAR ファイルは、 .jar 拡張子で終わっている必要があります。 -79847 javac コマンドまたは jar コマンドが失 敗しました 説明: 以下のいずれかの場合にドライバでコンパイル エラーが発生しました。 v JDBC アプリケーションからの createJar() コマンド に応じた、jar コマンドを使用しての .class ファイル の .jar ファイルへのコンパイル v JDBC アプリケーションからの UDTManager.createUDTClass() メソッド呼出しに応 じた、javac と jar コマンドを使用しての、.java フ ァイルから .class ファイルおよび .jar ファイルへの コンパイル -79848 同じ UDT SQL 名がシステム カタログ にすでに存在しています。 説明: アプリケーションが UDTMetaData.setSQLName() を呼び出し、すでにデー タベース サーバに存在する名前を指定しました。 -79849 UDTMetaData で UDT SQL 名が設定さ れていません 説明: アプリケーションは、 UDTMetaData.setSQLName() を呼び出して不透明 (OPAQUE) 型に対する SQL 名を指定することができま せんでした。 -79850 UDT フィールドのカウント数が UDTMetaData で設定されていません。 説明: アプリケーションは不透明 (OPAQUE) 型を定義 する内部データ構造体内のフィールド数を最初に指定せ ずに UDTManager.createUDTClass() を呼び出しまし た。 ユーザーの処置: UDTMetaData.setFieldCount() を呼び 出してフィールド数を指定してください。 -79851 UDTMetaData で UDT の長さが設定され ていません 説明: アプリケーションは不透明 (OPAQUE) 型の長さ を最初に指定せずに UDTManager.createUDTClass() を 呼び出しました。 ユーザーの処置: UDTMetaData.setLength() を呼び出 して不透明 (OPAQUE) 型の全長を指定してください。 -79852 UDT フィールド名またはフィールド型が UDTMetaData で設定されていません。 説明: アプリケーションは不透明 (OPAQUE) 型を定義 するデータ構造体の各フィールドに対するフィールド名 およびデータ型を最初に指定せずに UDTManager.createUDTClass() を呼び出しました。 ユーザーの処置: UDTMetaData.setFieldName() を呼び 出してフィールド名を指定してください。 UDTMetaData.setFieldType()を呼び出してデータ型を指 定してください。 -79853 jar に書き込むクラス ファイルがありま せん 説明: アプリケーションが createJar() メソッドを呼び 出し、classnames パラメータに長さがゼロの文字列を渡 しました。メソッド シグニチャは次のとおりです。 エラー メッセージ 269 createJar(UDTMetaData mdata, String[] classnames) -79854 UDT Java クラスは java.sql.SQLData イ ンターフェイスを実装している必要があり ます。 説明: アプリケーションは不透明 (OPAQUE) 型を作成 するために UDTManager.createUDT() を呼び出しまし たが、この不透明 (OPAQUE) 型のクラス定義には java.sql.SQLData インターフェイスが実装されていませ ん。UDTManager はこのインターフェイスを実装してい ないクラスから不透明 (OPAQUE) 型を作成できませ ん。 -79855 指定された UDT Java クラスが見つかり ません 説明: アプリケーションは UDTManager.createUDT() メソッドを呼び出しましたが、ドライバは 3 番目のパ ラメータに指定した名前のクラスを検出できませんでし た。 -79859 説明: アプリケーションが UDTMetaData.setXXX() メ ソッドまたは UDTMetaData.getXXX() メソッドを呼び 出し、0 よりも小さいフィールド番号、または UDTMetaData.setFieldCount() メソッドで設定された値 よりも大きいフィールド番号を指定しました。 -79860 指定した UDT がデータベースに存在し ていません。 説明: アプリケーションは UDTManager.removeUDT (String sqlname) を呼び出し、sqlname という名前の不 透明 (OPAQUE) 型をデータベースから削除しようとし ましたが、指定した名前の不透明 (OPAQUE) 型はデー タベースに存在しません。 -79857 サポート関数型が無効です あいまいな Java データ型です Object/SQLData をメソッドの引数として 使用できません。 説明: UDR として登録されるメソッドの 1 つ以上の パラメータのデータ型が、java.lang.Object または java.sql.SQLData です。これらの Java データ型は複数 の Informix データ型にマップできるため、ドライバは 型を選択できません。 ユーザーの処置: メソッドの引数として java.lang.Object または java.sql.SQLData を使用するこ とは避けてください。 -79861 -79856 UDT フィールド番号が無効です 指定された UDT フィールド型には一致 する Java データ型がありません。 説明: アプリケーションが UDTMetaData.setFieldType() を呼び出し、Java で 100 % 一致するものがないデータ型を指定しました。このカ テゴリには以下のデータ型が含まれます。 IfxTypes.IFX_TYPE_BYTE IfxTypes.IFX_TYPE_TEXT IfxTypes.IFX_TYPE_VARCHAR IfxTypes.IFX_TYPE_NVARCHAR IfxTypes.IFX_TYPE_LVARCHAR 説明: このエラーは、アプリケーションが UDTMetaData.setSupportUDR() メソッドを呼び出し、 type パラメータに 0 から 7 以外の整数を渡した場合に のみ発生します。 ユーザーの処置: 代わりに IFX_TYPE_CHAR または IFX_TYPE_NCHAR を使用してください。これらのデー タ型は java.lang.String にマップされます。 ユーザーの処置: サポート UDR 型に対して定義され た定数を使用してください。詳しくは、167 ページの 『setSupportUDR() および setUDR() の使用』を参照し てください。 -79862 -79858 クライアントのファイルを削除するコマン ドが失敗しました。 説明: UDTMetaData.keepJavaFile() が呼び出されない 場合、または FALSE に設定された場合、ドライバは生 成された .java ファイルを UDTManager.createUDTClass() メソッドの実行時に削 除します。このエラーはドライバが .java ファイルを削 除できない場合に発生します。 270 IBM Informix JDBC ドライバ プログラマーズ ガイド UDT フィールド型が無効です。 説明: アプリケーションが UDTMetaData.setFieldType() を呼び出し、不透明 (OPAQUE) 型に対してサポートされていないデータ型を 指定しました。サポートされているデータ型について は、250 ページの『フィールド型に対するマッピング』 を参照してください。 -79863 UDTMetaData で UDT フィールド長が設 定されていません 説明: アプリケーションは UDTMetaData.setFieldType() を呼び出すことにより、文 字 (CHAR) 型、日時 (DATETIME) 型、または時間隔 (INTERVAL) 型のフィールドを指定しましたが、フィー ルド長を指定しませんでした。 UDTMetaData.setFieldLength() を呼び出してフィールド 長を設定してください。 -79864 文の長さが最大許容値を超えています 説明: アプリケーションがデータベース サーバが処理 できる長さを超えた SQL PREPARE、 DECLARE、ま たは EXECUTE IMMEDIATE 文を発行しました。最大 長はインプリメンテーションの種類によって異なります が、通常は 32,000 文字までです。 ユーザーの処置: プログラム ロジックを見直して、ア プリケーションに指定の長さを超えた文字列が存在する ようなエラーがないかどうかを確認してください。テキ ストの長さが指定した長さである場合は、アプリケーシ ョンを修正して同時に存在する文の数を少なくしてくだ さい。 -79879 予期しない例外が呼び出されました。詳し くは、次の例外を参照してください 説明: このエラーは非 SQL 例外が発生した場合に発生 します。例えば入出力例外です。 -79880 ドライバの JDK バージョンを設定できま せん。 説明: このエラーは、ドライバが Java 仮想マシンから JDK バージョンを取得できないときに発生します。 -79881 ローカル トランザクション中のため、XA トランザクションを開始できません。 説明: このエラーは、アプリケーションがローカル ト ランザクションの進行中に XA トランザクションを開 始しようとしたときに発生します。 これはデータベース サーバが戻すエラー -460 と同じエ ラーです。 -79865 Statement はすでにクローズされています 説明: このエラーは、アプリケーションが stmt.close() メソッドの後で文のメソッドにアクセスしようとしたと きに発生します。 -79868 ResultSet はオープンされていません。操 作は許可されません 説明: このエラーは、アプリケーションが ResultSet.close() メソッドの後で ResultSet メソッドに アクセスしようとしたときに発生します。 -79877 最大フィールド サイズ設定のパラメータ 値は無効です 説明: このエラーは、アプリケーションが最大フィール ド サイズに負の値を設定しようとしたときに発生しま す。 -79878 ResultSet がオープンされていません。操 作「next」は許可されません。自動コミッ トがオフであることを確認してください 説明: このエラーは、アプリケーションが結果セット問 合せを実行せずに ResultSet.next() メソッドにアクセス しようとしたときに発生します。 エラー メッセージ 271 272 IBM Informix JDBC ドライバ プログラマーズ ガイド 特記事項 本書に記載の製品、サービス、または機能が日本においては提供されていない場合 があります。日本で利用可能な製品、サービス、および機能については、日本 IBM の営業担当員にお尋ねください。本書で IBM 製品、プログラム、またはサービス に言及していても、その IBM 製品、プログラム、またはサービスのみが使用可能 であることを意味するものではありません。これらに代えて、IBM の知的所有権を 侵害することのない、機能的に同等の製品、プログラム、またはサービスを使用す ることができます。ただし、IBM 以外の製品とプログラムの操作またはサービスの 評価および検証は、お客様の責任で行っていただきます。 IBM は、本書に記載されている内容に関して特許権 (特許出願中のものを含む) を 保有している場合があります。本書の提供は、お客様にこれらの特許権について実 施権を許諾することを意味するものではありません。実施権についてのお問い合わ せは、書面にて下記宛先にお送りください。 〒106-8711 東京都港区六本木 3-2-12 日本アイ・ビー・エム株式会社 法務・知的財産 知的財産権ライセンス渉外 以下の保証は、国または地域の法律に沿わない場合は、適用されません。IBM およ びその直接または間接の子会社は、本書を特定物として現存するままの状態で提供 し、商品性の保証、特定目的適合性の保証および法律上の瑕疵担保責任を含むすべ ての明示もしくは黙示の保証責任を負わないものとします。国または地域によって は、法律の強行規定により、保証責任の制限が禁じられる場合、強行規定の制限を 受けるものとします。 この情報には、技術的に不適切な記述や誤植を含む場合があります。本書は定期的 に見直され、必要な変更は本書の次版に組み込まれます。IBM は予告なしに、随 時、この文書に記載されている製品またはプログラムに対して、改良または変更を 行うことがあります。 本書において IBM 以外の Web サイトに言及している場合がありますが、便宜のた め記載しただけであり、決してそれらの Web サイトを推奨するものではありませ ん。それらの Web サイトにある資料は、この IBM 製品の資料の一部ではありませ ん。それらの Web サイトは、お客様の責任でご使用ください。 IBM は、お客様が提供するいかなる情報も、お客様に対してなんら義務も負うこと のない、自ら適切と信ずる方法で、使用もしくは配布することができるものとしま す。 本プログラムのライセンス保持者で、(i) 独自に作成したプログラムとその他のプロ グラム (本プログラムを含む) との間での情報交換、および (ii) 交換された情報の 相互利用を可能にすることを目的として、本プログラムに関する情報を必要とする 方は、下記に連絡してください。 © Copyright IBM Corp. 1996, 2008 273 IBM Corporation J46A/G4 555 Bailey Avenue San Jose, CA 95141-1003 U.S.A. 本プログラムに関する上記の情報は、適切な使用条件の下で使用することができま すが、有償の場合もあります。 本書で説明されているライセンス・プログラムまたはその他のライセンス資料は、 IBM 所定のプログラム契約の契約条項、IBM プログラムのご使用条件、またはそれ と同等の条項に基づいて、IBM より提供されます。 この文書に含まれるいかなるパフォーマンス・データも、管理環境下で決定された ものです。そのため、他の操作環境で得られた結果は、異なる可能性があります。 一部の測定が、開発レベルのシステムで行われた可能性がありますが、その測定値 が、一般に利用可能なシステムのものと同じである保証はありません。さらに、一 部の測定値が、推定値である可能性があります。実際の結果は、異なる可能性があ ります。お客様は、お客様の特定の環境に適したデータを確かめる必要がありま す。 IBM 以外の製品に関する情報は、その製品の供給者、出版物、もしくはその他の公 に利用可能なソースから入手したものです。IBM は、それらの製品のテストは行っ ておりません。したがって、他社製品に関する実行性、互換性、またはその他の要 求については確証できません。IBM 以外の製品の性能に関する質問は、それらの製 品の供給者にお願いします。 IBM の将来の方向または意向に関する記述については、予告なしに変更または撤回 される場合があり、単に目標を示しているものです。 表示されている IBM の価格は IBM が小売り価格として提示しているもので、現行 価格であり、通知なしに変更されるものです。卸価格は、異なる場合があります。 本書には、日常の業務処理で用いられるデータや報告書の例が含まれています。よ り具体性を与えるために、それらの例には、個人、企業、ブランド、あるいは製品 などの名前が含まれている場合があります。これらの名称はすべて架空のものであ り、名称や住所が類似する企業が実在しているとしても、それは偶然にすぎませ ん。 著作権使用許諾: 本書には、様々なオペレーティング・プラットフォームでのプログラミング手法を 例示するサンプル・アプリケーション・プログラムがソース言語で掲載されていま す。お客様は、サンプル・プログラムが書かれているオペレーティング・プラット フォームのアプリケーション・プログラミング・インターフェイスに準拠したアプ リケーション・プログラムの開発、使用、販売、配布を目的として、いかなる形式 においても、IBM に対価を支払うことなくこれを複製し、改変し、配布することが できます。このサンプル・プログラムは、あらゆる条件下における完全なテストを 経ていません。従って IBM は、これらのサンプル・プログラムについて信頼性、 利便性もしくは機能性があることをほのめかしたり、保証することはできません。 お客様は、IBM のアプリケーション・プログラミング・インターフェースに準拠し 274 IBM Informix JDBC ドライバ プログラマーズ ガイド たアプリケーション・プログラムの開発、使用、販売、配布を目的として、いかな る形式においても、IBM に対価を支払うことなくこれを複製し、改変し、配布する ことができます。 それぞれの複製物、サンプル・プログラムのいかなる部分、またはすべての派生的 創作物にも、次のように、著作権表示を入れていただく必要があります。 © (お客様の会社名) (西暦年). このコードの一部は、IBM Corp. のサンプル・プ ログラムから取られています。© Copyright IBM Corp. (年を記入)。All rights reserved. この情報をソフトコピーでご覧になっている場合は、写真やカラーの図表は表示さ れない場合があります。 商標 IBM、IBM logo、ibm.com は、International Business Machines Corporation の米国お よびその他の国における商標です。本書では、これらおよびその他の IBM 商標に つき、それぞれが最初に出現する個所で所定のマーク (® または ™) を付けていま す。これは、本資料の発表時に IBM が米国において所有する、登録商標または商 標であることを示します。これらの商標は、その他の国においても登録商標または 商標である場合があります。現時点での IBM の商標については、 http://www.ibm.com/legal/copytrade.shtml をご覧ください。 Adobe、PostScript は、Adobe Systems Incorporated の米国およびその他の国におけ る登録商標または商標です。 Intel、Intel (ロゴ)、Intel Inside、Intel Inside (ロゴ)、Intel Centrino、Intel Centrino (ロゴ)、Celeron、 Intel Xeon、Intel SpeedStep、Itanium、Pentium は、Intel Corporation または子会社の米国およびその他の国における商標または登録商標で す。 Linux は、Linus Torvalds の米国およびその他の国における商標です。 Microsoft、Windows、Windows NT および Windows ロゴは、Microsoft Corporation の米国およびその他の国における商標です。 Java およびすべての Java 関連の商標およびロゴは Sun Microsystems, Inc.の米国お よびその他の国における商標です。 UNIX は The Open Group の米国およびその他の国における登録商標です。 他の会社名、製品名およびサービス名等はそれぞれ各社の商標です。 特記事項 275 276 IBM Informix JDBC ドライバ プログラマーズ ガイド 索引 日本語, 数字, 英字, 特殊文字の順に配列されてい ます。なお, 濁音と半濁音は清音と同等に扱われて います。 [ア行] アクセシビリティ インターフェイス (続き) java.sql.PreparedStatement List 104 202 PooledConnection 3 PreparedStatement 54, 55, 59, 237, 245 ResultSet 54, 55, 210, 245, 248 ResultSetMetaData 54 253 Set キーボード 253 構文ダイアグラム、スクリーン リーダ (読上げソフトウェ ア) による読取り ショートカット キー 254 Statement 253 Struct 小数点付き 10 進数フォーマットの構文ダイアグラム アプレット およびデータベース アクセス 40 における IBM Informix JDBC ドライバの使用 未署名の、に対して使用できない機能 12 アンインストール エラーの回避 8 グラフィカル モードで 13 コンソール モードで 13 サイレント モードで 13 XAConnection 75 XADataSource 3 エスケープ構文 11, 17 71 エラー 構文エラー オフセットの抽出 処理 76 標準 Informix 257 ローカライゼーション 77 205 RSAM 77 SQLCODE 77 グラフィカル モード 8 コンソール モード 8 サイレント モード 9 オーバーロード UDR および CallableStatement 69 オーバーロードされた UDR の除去 9 接続 55, 75 データ型 96, 233 ファイル 94 BatchUpdateException 59 CallableStatement 54, 60, 267 Collection 104 ConnectionEventListener 3 ConnectionPoolDataSource 3 DatabaseMetaData 77, 80 DataSource 17 サポートする Informix クラス 3 標準プロパティ 228 Driver 80 DriverManager 2, 17, 20, 26 FileInputStream 94 IfmxCallableStatement 65 IfmxUdtSQLInput 151 IfmxUdtSQLOutput 152 IfxCblob 127 InputStream 93 java.sql.Blob 127 © Copyright IBM Corp. 1996, 2008 254 24, 54, 59, 210 107, 112 メッセージ テキストの抽出 77 SQLException クラス、使用 76 エラー メッセージ 暗号化オプション 44 位置合せの値 162 インストール インストール イベントのロギング インターフェイス 104 SQLData 107, 112, 116, 152, 154 SQLInput 111 170 オブジェクト IfxLocator 123 Locator 123 [カ行] カーソル 自動的に解放 27, 79, 210 スクロール 56 HOLD 58 カーソルの解放 27 カーソルを自動的に解放 79, 210 格納特性 システム デフォルト 134, 137, 138 システム指定の 137, 138 属性情報 138 定義 133 ディスク格納領域情報 136 ユーザ指定の 137, 138 列レベル 137, 138 型情報のキャッシュ 118, 153 カタログ IBM Informix JDBC ドライバによる解釈 79 277 カタログ (続き) systables 環境変数 環境変数 (続き) 79, 198 NODEFDAC 31 OPTCOMPIND 31 サポートされている 指定 191 OPTOFC 23, 25 31, 210, 219 OPT_GOAL 31 BIG_FET_BUF_SIZE 26 CLASSPATH 10, 81, 116 PATH 31 PDQPRIORITY CLIENT_LOCALE PLCONFIG CSM 27 DATABASE 191, 197 PLOAD_LO_PATH PORTNO 18, 22 18, 22 DBANSIWARN 31 31 27 32 PORTNO_SECONDARY DBCENTURY 191, 196 DBDATE 191, 194, 197 PROXY 32 PSORT_DBTEMP 32 DBSPACETEMP PSORT_NPROCS 32 DBTEMP 27 27 DBUPSPACE SECURITY 27 32 SQLH_TYPE DB_LOCALE 191, 197 DELIMIDENT 27 32, 37 32 SQLIDEBUG 32 STMT_CACHE 32 ENABLE_CACHE_TYPE 27, 118, 153 ENABLE_HDRSWITCH 27, 37 FET_BUF_SIZE 27, 208, 219 USEV5SERVER 32 感嘆符 (!) インストール パスの GL_DATE 191, 192, 197 IFMX_CPM_AGELIMIT 213 既存のクラスを使用しない不透明 (OPAQUE) 型の作成 既存のコードからの不透明 (OPAQUE) 型の作成 166 IFMX_CPM_ENABLE_SWITCH_HDRPOOL IFMX_CPM_INIT_POOLSIZE 212 213 クラス プロパティ 25 IFMX_CPM_MAX_CONNECTIONS 212 IFMX_CPM_MAX_POOLSIZE 212 IFMX_CPM_MIN_AGELIMIT 213 ヘルパー 5 メッセージ 77 ロケール 190 IFMX_CPM_MIN_POOLSIZE 212 IFMX_CPM_SERVICE_INTERVAL 213 Array 106 ArrayList 104 IFXHOST 18, 22, 30 IFXHOST_SECONDARY extensibleObject HashSet 104 30, 37 8 33 IFX_AUTOFREE 27, 210, 218 IFX_BATCHUPDATE_PER_SPEC 27, 59 IFX_CODESETLOB 28, 201, 202 IfmxStatement 79 IfxBblob 127 IfxCblob 127 IFX_DIRECTIVES 28 IFX_EXTDIRECTIVES 28 IfxConnectionEventListener 3 IfxConnectionPoolDataSource 3, 227 IFX_FLAT_UCSQ 28 IFX_GET_SMFLOAT_AS_FLOAT 28 IFX_PAD_VARCHAR 29 IFX_SET_FLOAT_AS_SMFLOAT 29 IFX_TRIMTRAILINGSPACES 29 IFX_USEPUT 29, 59 IFX_XASPEC 29 IFX_XASTDCOMPLIANCE_XAEND 30 INFORMIXCONRETRY 30 INFORMIXCONTIME 30 INFORMIXOPCACHE 30 INFORMIXSERVER 18, 22, 24, 30 INFORMIXSERVER_SECONDARY 30, 37 INFORMIXSTACKSIZE 30 JDBCTEMP 30 LOBCACHE 31, 93, 146, 209 NEWCODESET 191, 204 NEWLOCALE 191, 204 NEWNLSMAP 31, 204 IfxCoreDataSource 3 IfxDataSource 3, 227 IfxDriver 16 IfxJDBCProxy 41 IfxLobDescriptor 123 IfxLocator 132 IfxPooledConnection 3 IfxTypes 238, 241 IfxUDTManager 154 IfxUDTMetaData 154 IfxXADataSource 3 Interval 98 IntervalDF 101 IntervalYM 99 Java.Socket 36 ResultSet 193, 195 SessionMgr 41 SQLException 76, 77, 244, 247 SqlhDelete 36 278 IBM Informix JDBC ドライバ プログラマーズ ガイド 161 クラス (続き) サポートされている環境変数 TreeSet 不透明 (OPAQUE) 型に対して 155 163 プロキシ サーバ 33 HDR 224 XML 文書 コード セット テキスト (TEXT) 型の変換 表 198 204 ロケールとの同期化 コード セット変換 202 広域言語サポート (GLS) 構文ダイアグラムの読取り 時間隔 (INTERVAL) 型 254 名前付き行と名前なし行で 108 98 に対するバイナリ修飾子 98 時間隔 (INTERVAL) 型に対するバイナリ修飾子 189 実装されているクラス 3 Java インターフェイス Java 仕様の拡張 4 Java 仕様を超えた 自動コミット 75 38 214 用のデモ 37 読取り専用状態の検査 38 IFMX_CPM_ENABLE_SWITCH_HDRPOOL 98 3 5 修飾子、バイナリ、時間隔 (INTERVAL) 型に対する ショートカット キー キーボード 253 副サーバの指定 37 用の環境変数 37 使用 アプレットで 213 98 11 小数点付き 10 進数フォーマットの構文ダイアグラム 状態に関する情報 更新、バッチ 58 構造型 (Struct) 107 構文エラー オフセット、抽出 構文ダイアグラム 223 224 に対する拡張 190 高可用性データ レプリケーション サンプル プログラム 224 使用 36 接続の再試行 接続プールと 153 視覚障害 201 198, 201 ユーザ定義 92 サンプル プログラム 接続プール 224 グループ オプション、sqlhosts ファイルの 検索、無名、sqlhosts 情報の 34 変換 72 ディスティンクト (DISTINCT) 型に対して 名前付き行に対して 108 155 UDRMetaData Version 80 クラス名 データベースの問合せに 105 UDRManager 191 サポートされないメソッド SqlhUpload 35 TimeoutMgr 41 77 スクリーン リーダ (読上げソフトウェア) での読取り 国際化 189, 205 固有の名前 ストアド プロシジャおよび名前付きパラメータの コレクション (COLLECTION) 型 名前付き行と名前なし行で 108 に対する拡張 103 例 Array インターフェイスの使用 106 Collection インターフェイスの使用 104 コンストラクタ IfxBblob() 127 IfxCblob() 127 IfxLobDescriptor() 123 IfxLocator() 123 IntervalDF() 101 IntervalYM() 100 [サ行] サーバの制約事項、制限 60 サービス プロバイダ インターフェイス (SPI) サーブレット 40 サイレント モード 13 33 67 254 254 最終アクセス時間 143 最終修正時間 143 最終変更時間 143 サイズ 143 定義 142 シリアル (SERIAL) 型 96 シリアル (SERIAL) 型列とスクロール カーソル 57 シングル サインオン (SSO) アクセス コントロール 49 身体障害 253 身体障害、視覚 構文ダイアグラムの読取り 254 スキーマ、IBM Informix JDBC ドライバによる解釈 スクリーン リーダ (読上げソフトウェア) 構文ダイアグラムの読取り 254 スクロール カーソル 56 スクロール可能結果セット 55 ストアド プロシジャ および名前付きパラメータ 67 スマート ラージ オブジェクト アクセス モード 144 アンロック 144, 145 エクステント サイズ 136, 137 クローズ 144 最終アクセス時間 138, 140, 142, 143 最終修正時間 143 最終変更時間 143 79 索引 279 スマート ラージ オブジェクト (続き) 接続プール (続き) 最小エクステント サイズ 137 サイズ 135, 136, 137, 143 接続のクリーニング 215 調整パラメータ 212 最大入出力ブロック サイズ デモ プログラム 137 213 作成 121 用のプロパティ 選択 挿入 126 126 HDR と 214 Sun JDBC 3.0 のプロパティ 属性 138 バイト データ 136, 137 INFORMIXSERVER 138 メタデータ 139, 140, 143 文字データ 127 ユーザ データ DATABASE 18 IFXHOST 18 127 バッファリング モード 見積りサイズ 137 USER 18, 23 設定 自動コミット 140, 143 相対識別名 (RDN) 挿入、バルク 59 スマート ラージ オブジェクト、インプリメンテーション クラス 121 121 IfxLobDescriptor IfxLocator 121 IfxLoStat 121 75 プロパティ 25 CLASSPATH 環境変数 を使用したトランザクション 138, 144, 145 SB 領域 137 スマート ラージ オブジェクト、アクセス 119 10, 11 36 [タ行] 大桁整数 (BIGINT) 型 データ型 97 121 IfxSmartBlob 121 スマート ラージ オブジェクトの作成 タプル バッファ 抽出 220, スマート ラージ オブジェクトの選択 126 スマート ラージ オブジェクトの挿入 126 スマート ラージ オブジェクトのロック 144 更新 144 更新モード 144 全体 144 排他 141, 144, 145 スレッド、複数、および同時実行性 56 制限、サーバ 60 制限、ドライバ 63 製品 CD、内容 8 制約事項、サーバ 60 制約事項、ドライバ 63 接続 クリーニング 215 非 ASCII 文字を含むデータベースに 200 DataSource オブジェクトを使用した作成 17 DriverManager.getConnection() を使用した作成 接続のクリーニング 215 接続プール 3, 16, 19, 211, 227 サンプル プログラム 224 使用 211 27, 208 構文エラー オフセット データベース名 79 バージョン情報 80 121 スマート ラージ オブジェクトのサンプル プログラム 221 280 18 PASSWORD 18, 23 PORTNO 18 ロギング 138, 141, 142 ロック 138 解放 145 共有モード 214 接続プロパティ 追加エクステント サイズ データ整合性 140 IfxBblob IfxCblob 232 20 IBM Informix JDBC ドライバ プログラマーズ ガイド 日付 (DATE) 型値 77 193, 195 ユーザ名 79 Informix エラー メッセージ テキスト XML データ 84 77 データ型 コレクション 103 シリアル (SERIAL) 型 96 ディスティンクト 90 名前付き行 107 名前なし行 107 ブール (BOOLEAN) 型 235 不透明 150 とトランザクション 172 マッピング 不透明 (OPAQUE) 型 152 CallableStatement パラメータに対する 64 ラージ可変長文字 (LVARCHAR) 型 235, 245 BLOB 208 BYTE 93, 208 CLOB 208 DataBlade API 153 INTERVAL 98 SERIAL8 型 96 TEXT 93, 208 データ整合性 140 名前付き行型 (続き) データベース 問合せ 54 名前の設定 に対する SQLData インターフェイスの使用 108 に対する Struct インターフェイスの使用 112 データベース URL で 22 に対する拡張 DataSource オブジェクトで バッチ更新 58 非 ASCII 文字を含む に対する Struct クラスの作成 200 114 SQLData インターフェイスの使用 39 109 Struct インターフェイスの使用 113 ClassGenerator ユーティリティを使用した生成 191 データベース サーバ名 名前付き行のサンプル プログラム データベース URL での設定 22 DataSource オブジェクトでの設定 データベース ロケール情報の不一致 名前付きパラメータ およびストアド プロシジャ 18 データベース ローカル コード セット CallableStatement での 202 名前付き表記 198 データベース URL の構文 21 116 222 67 66 66 名前なし行型 データベース URL の名前と値のペア データベースの問合せ 54 データベースのバッチ更新 58 データベースへのリモート アクセス ディスティンクト (DISTINCT) 型 時間隔とコレクション 108 に対する Struct インターフェイスの使用 23 に対する拡張 107 例 に対する Struct クラスの作成 39 型情報のキャッシュ 118, 153 に対してサポートされないメソッド に対する拡張 用の例 108 例 リモート アクセス オプション ロケールの指定 URL 20, 21 107 不透明 (OPAQUE) 型列 18 Struct インターフェイスの使用 ネイティブ SQL 日付書式 193, 195 92 112 114 113 90 データの挿入 90 データの抽出 92 ディレクティブ、フォーマット、日付用 [ハ行] バージョン、IBM Informix JDBC ドライバの 配置記述子 165 192 テキスト (TEXT) 型 キャッシュ 208 コード セット変換 に対する拡張 93 80 配置パラメータ 165 バイト (BYTE) 型 201 に対するコード セット変換 用の例 データ抽出 95 データの挿入と更新 デバッグ 207 キャッシュ 208 に対する拡張 93 201 に対するコード セット変換 用の例 データ抽出 95 93 同時実行性と複数のスレッド 56 動的 SQL 70 ドライバのアンインストール 12 ドライバの制約事項、制限 63 トランザクション 開始 145 コミット 145 処理 75 分散 3, 16, 19, 75 ロールバック 145 トランザクション、不透明 (OPAQUE) 型と UDR の作成 トランザクション管理 スマート ラージ オブジェクトおよび 138, 144, 145 [ナ行] 名前付き行型 時間隔とコレクション 108 に対してサポートされないメソッド 108 172 203 データの挿入と更新 93 バイト (BYTE) 型とテキスト (TEXT) 型のサンプル プログラ ム 220 バイト配列、16 進への変換 131 バイナリ修飾子用の変数 98 配列 103, 106 パスワード DataSource オブジェクトでの設定 18 URL 構文 23 パフォーマンス 208 パラメータ 名前の抽出 67 CallableStatement での名前付き 66 パラメータ名の抽出 67 バルク挿入 59 日付 値の挿入 193, 195 値の抽出 193, 195 エンド ユーザ フォーマットのサポート 192 エンド ユーザ フォーマットの優先順位ルール 197 ネイティブ SQL フォーマット 193, 195 索引 281 日付 (続き) メソッド 非ネイティブ SQL フォーマット 文字列から日付への変換 196 文字列で表された 193, 195 データベースの問合せに 4 桁への年の拡張 196 DBDATE フォーマット GL_DATE フォーマット 192 不透明 (OPAQUE) 型に対して absolute() 57, 259, 261 activateHDRPool_Primary() 194 192 日付 (DATE) 型値の挿入 193, 195 日付書式の優先順位ルール 197 afterLast() 非ネイティブ SQL 日付書式 214 261 beforeFirst() 259, 261 Clob::setAsciiStream(long position, InputStream fin, int 192 length) 193, 195 202 ブール (BOOLEAN) 型 235 close() ファイル SessionMgr.class commit() 75 connect() 259 41 複数の OUT パラメータ 61 不透明 (OPAQUE) 型 型情報のキャッシュ 118, 153 27, 31, 56, 210 createJar() 165 createUDRs() 169 createUDTClass() 165 作成 154 作成手順 156 createUDT() 165 current() 261 作成例 177 サポートされないメソッド 定義 150 とトランザクション に対するマッピング DatabaseMetaData 67 DatabaseMetaData.supportsNamedParameters() deleteRow() 266 153 deleteRow()、およびスクロール カーソル deletesAreDetected() 74 172 152 例 データの抽出 dispValue() 96 equals() 101, 103 174 に対するクラスの定義 173 ラージ オブジェクト 175 executeBatch() 260 executeQuery() 55, 63, 79 executeUpdate() 24, 94, 260 executeXXX() 259 execute() 55, 72, 74, 260 first() 259, 261 39, 41 サンプル プログラム プロパティ リスト 25 223 分散トランザクション 3, 16, 19, 75 文の局所変数 60 変換 10 進表記 191 IfxLocator から 16 進へ 131 ポート番号の設定 データベース URL で 22 DataSource オブジェクトで 18 sqlhosts ファイルまたは LDAP サーバで ホスト名の設定 データベース URL で 22 DataSource オブジェクトで 18 33 [マ行] マッピング 不透明 (OPAQUE) 型 152 CallableStatement パラメータに対する 282 153 addBatch() 72 addProp() 227 のサポート 192 優先順位ルール 197 日付用のフォーマット ディレクティブ 92 214 activateHDRPool_Secondary() 日付のエンド ユーザ フォーマット SQL 名 163 ブラウザ 11 プロキシ サーバ 72 ディスティンクト (DISTINCT) 型に対して 名前付き行に対して 108 193 用のフォーマット ディレクティブ 非サポート 64 IBM Informix JDBC ドライバ プログラマーズ ガイド forName() 16 fromHexString() 132 fromString() 101, 103 getAlignment() 162 getArray() 104, 107, 263 getAsciiStream() 95, 96, 127 getAttributes() 114, 263 getAutoAlignment() 152 getAutoFree() 79, 210 getBigSerial() 97 getBinaryStream() 95, 96, 127 getBlob() 127, 148, 266 getBytes() 127, 201, 202 getCatalogName() 74 getCatalogs() 79 getClassName() 171 getClob() 127, 148, 266 getConnection() 20, 24, 25, 259 getCurrentPosition() 151 getDatabaseName() 228 66 57 メソッド (続き) メソッド (続き) getDataSourceName() getDate() 196 getDescription() 228 228 getIfxNEWCODESET() 230 getIfxNEWLOCALE() 230 getIfxNEWNLSMAP() 231 getDriverMajorVersion() 80 getIfxNODEFDAC() getDriverMinorVersion() getDsProperties() 227 80 getIfxOPTCOMPIND() getIfxOPTOFC() 231 getEndCode() 99 231 getIfxOPT_GOAL() 231 getErrorCode() 76 getFetchSize() 74 getIfxPATH() 231 getIfxPDQPRIORITY() getFieldCount() getIfxPLCONFIG() 170 231 231 231 getFieldLength() 171 getFieldName() 99, 170 getIfxPLOAD_LO_PATH() 231 getIfxPORTNO_SECONDARY() 231 getFieldTypeName() getIfxPROXY() 171 231 getFieldType() 171 getIfxPSORT_DBTEMP() 231 getHDRtype() 38 getIfxPSORT_NPROCS() 231 getIfxCLIENT_LOCALE() 229 getIfxCPMInitPoolSize() 232 getIfxSECURITY() 231 getIfxSQLH_FILE() 231 getIfxCPMMaxAgeLimit() 232 getIfxCPMMaxConnections() 232 getIfxCPMMaxPoolSize() 232 getIfxSQLH_TYPE() 231 getIfxSQLIDEBUG () 231 getIfxSTMT_CACHE() 231 getIfxCPMMinAgeLimit() 232 getIfxCPMMinPoolSize() 232 getIfxTypeName() 99 getInputSource() 84 getIfxCPMServiceInterval() 232 getIfxCPMSwitchHDRPool() 232 getJarFileSQLName() 171 getJDBCVersion() 80 getIfxCSM() 229 getIfxDBCENTURY() 229 getIfxDBDATE() 229 getLength() 99, 162 getLocator() 128, 148 getMajorVersion() 80 getIfxDBSPACETEMP() getIfxDBTEMP() 229 getMessage() 76 getMetaData() 63 229 getIfxDBUPSPACE() 229 getIfxDB_LOCALE() 229 getMinorVersion() getMonths() 101 80 getIfxFET_BUF_SIZE() 229 getIfxGL_DATE() 229 getIfxIFXHOST() 230 getNanoSeconds() 103 getNextException() 77 getObject() 104, 107, 109, 112, 114 getIfxIFXHOST_SECONDARY() 230 getIfxIFX_CODESETLOB() 229 getPassword() 228 getPortNumber() 228 getIfxIFX_DIRECTIVES() 229 getIfxIFX_EXTDIRECTIVES() 229 getIfxIFX_FLAT_UCSQ() 229 getIfxIFX_IFX_GET_SMFLOAT_AS_FLOAT() 229 getIfxIFX_ISOLATION_LEVEL() 230 getIfxIFX_SET_FLOAT_AS_SMFLOAT() 230 getIfxIFX_TRIMTRAILINGSPACES() 230 getIfxIFX_XASPEC() 230 getIfxINFORMIXCONRETRY() 230 getIfxINFORMIXCONTIME() 230 getIfxINFORMIXOPCACHE() 230 getIfxINFORMIXSERVER_SECONDARY() 230 getIfxINFORMIXSTACKSIZE() 230 getIfxJDBCTEMP() 230 getIfxLDAP_IFXBASE() 230 getIfxLDAP_PASSWD() 230 getIfxLDAP_URL() 230 getIfxLDAP_USER() 230 getIfxLOBCACHE() 230 getProcedureColumns() 73 getProp() 227 getQualifier() 99 getRef() 72 getResultSet() 260, 262 getScale() 99 getSchemaName() 74 getSchemas() 79 getSeconds() 103 getSerial8() 96 getSerial() 96 getServerName() 228 getSQLName() 171 getSQLStatementOffset() 77 getSQLState() 76 getSQLTypeName() 109, 112, 114, 116, 118, 153 getStartCode() 99 getString() 127, 193, 195, 201, 202 getTableName() 74 索引 283 メソッド (続き) メソッド (続き) getText() 200 getTimestamp() getTypeMap() othersUpdatesAreVisible() 73 OutputStreamWriter() 200, 201, 202 196 107, 111 ownDeletesAreVisible() getUDRSQLname() 169 ownInsertsAreVisible() getUDR() 169 getUnicodeStream() 72 ownUpdatesAreVisible() prepareStatement() 55 getUpdateCounts() getUpdateCount() getUser() 228 getWarnings() 59 previous() 260, 262 73 73 73 261 put() 26, 210 readArray() 92 63 readAsciiStream() 153 getXXX() 55, 60, 245, 247, 266 greaterThan() 101, 103 readBinaryStream() 153 readBytes() 151, 153 hasOutParameter() readByte() 63 IfxCblob::setAsciiStream(long) IfxLocator() 202 108 readCharacterStream() 132 readObject() 92, 108, 153 108, 153 IfxLoClose() 131 IfxLoCreate() 123, 124 readProperties() 227 readRef() 92, 108, 153 IfxLoOpen() 124, 127, 128, 148 IfxLoRead() 127, 129, 148 IfxLoRelease() 131 readSQL() 109, 111, 116, 152 readString() 151, 153 read() 96 IfxLoSeek() 128 IfxLoSize() 131 refreshRow() 72 registerDriver() 17 IfxLoTell() 128 IfxLoTruncate() 131 registerOutParameter() relative() 261 IfxLoWrite() 127, 130 IfxRegisterOutParameter() IfxSetNull() 65, 266 removeJar() 169, 170 removeProperty() 227 removeUDR() 169, 170 65, 266, 267 IfxSetObject() 196, 237 IFX_XASTDCOMPLIANCE_XAEND(int value) IFX_XASTDCOMPLIANCE_XAEND() InputStreamReader() 200, 201, 202 60, 266, 267 230 230 rowDeleted() 72 rowInserted() 72 rowUpdated() 72 scrubConnection() 215 InputStreamtoDOM() 84 insertRow() 266 insertsAreDetected() 74 setAlignment() 162 setArray() 104, 239 setAsciiStream() 93, 95, 237, 240 isDefinitelyWriteable() isHDREnabled() 38 setAutoAlignment() 152 setAutoCommit() 75 74 isIfxDBANSIWARN() 229 isIfxDELIMIDENT() 229 isIfxENABLE_CACHE_TYPE() isIfxIFX_AUTOFREE() 229 isIfxIFX_USEPUT() 230 isIfxUSEV5SERVER() 231 isReadOnly() 38, 74 isWriteable() 74 keepJavaFile() 163 last() 261 length() 152 lessThan() 101, 103 map.get() 111 map.put() 111, 112 moveToCurrentRow() 266 moveToInsertRow() 266 next() 31, 55, 95, 210 othersDeletesAreVisible() 73 othersInsertsAreVisible() 73 284 229 IBM Informix JDBC ドライバ プログラマーズ ガイド setAutoFree() 79, 210 setBigDecimal() 92, 240 setBinaryStream() 93, 94, 237, 240 setBlob() 240 setBoolean() 240 setBytes() 240 setByte() 240 setCatalog() 72 setCharacterStream() 240 setClassName() 163 setClob() 240 setCurrentPosition() 151 setDatabaseName() 228 setDataSourceName() 228 setDate() 240 setDescription() 228 setDouble() 241 setExplicitCast() 166 setFetchDirection() 261 メソッド (続き) メソッド (続き) setFetchSize() 72, 261 setFieldCount() 161 setIfxPATH() 231 setIfxPDQPRIORITY() setFieldLength() setIfxPLCONFIG() 161 setFieldTypeName() 161 231 231 setIfxPLOAD_LO_PATH() setFieldType() 161 setFloat() 241 231 setIfxPROXY() 231 setIfxPSORT_DBTEMP() 231 229 setIfxPSORT_NPROCS() 231 setIfxCPMInitPoolSize() 232 setIfxCPMMaxAgeLimit() 232 setIfxSECURITY() 231 setIfxSQLH_FILE() 231 setIfxCPMMaxConnections() setIfxSQLH_TYPE() setIfxCLIENT_LOCALE() 232 231 setIfxCPMMaxPoolSize() 232 setIfxCPMMinAgeLimit() 232 setIfxSQLIDEBUG 231 setIfxSTMT_CACHE() 231 setIfxCPMMinPoolSize() setIfxUSEV5SERVER() 232 setIfxCPMServiceInterval() 232 setIfxCPMSwitchHDRPool() 232 setImplicitCast() setInt() 231 166 55, 241 setIfxCSM (String csm) 229 setIfxDBANSIWARN() 229 setJarFileSQLName() 163, 168 setJarTmpPath() 165 setIfxDBCENTURY() 229 setIfxDBDATE() 229 setIfxDBSPACETEMP() 229 setLength() 162 setLong() 241 setMaxFieldSize() setIfxDBTEMP() 229 setIfxDBUPSPACE() 229 setMaxRows() 261 setNull() 64, 241 setIfxDB_LOCALE() 229 setIfxDELIMIDENT() 229 setObject() 92, 104, 112, 196 setPassword() 228 setIfxENABLE_CACHE_TYPE() 229 setIfxENABLE__HDRSWITCH() 229 setIfxFET_BUF_SIZE() 229 setPortNumber() 228 setQualifier() 101, 103 setReadOnly() 72 setIfxGL_DATE() 229 setIfxIFXHOST() 230 setRef() 72 setServerName() setIfxIFX_AUTOFREE() 229 setIfxIFX_CODESETLOB() 229 setShort() 241 setSQLName() 163, 164, 269 setIfxIFX_DIRECTIVES() 229, 230 setIfxIFX_EXTDIRECTIVES() 229 setIfxIFX_FLAT_UCSQ() 229 setString() 174, 196, 241 setTimestamp() 241 setTime() 241 setIfxIFX_ISOLATION_LEVEL 230 setIfxIFX_LOCK_MODE_WAIT 230 setTypeMap() 104, 109 setUDR() 169 setIfxIFX_TRIMTRAILINGSPACES() 230 setIfxIFX_USEPUT() 230 setIfxINFORMIXCONRETRY() 230 setIfxINFORMIXCONTIME() 230 setIfxINFORMIXOPCACHE() 230 setIfxINFORMIXSERVER_SECONDARY() 230 setIfxINFORMIXSTACKSIZE() 230 setIfxJDBCTEMP() 230 setIfxLDAP_IFXBASE() 230 setIfxLDAP_PASSWD() 230 setIfxLDAP_URL() 230 setIfxLDAP_USER() 230 setIfxLOBCACHE() 230 setIfxNEWCODESET() 230 setIfxNEWLOCALE() 230, 231 setIfxNODEFDAC(String value) 231 setIfxOPTCOMPIND() 231 setIfxOPTOFC() 231 setIfxOPT_GOAL() 231 setUDTExtName() 155 setUnicodeStream() 72 setUser() 228 setXXX() 63, 174, 237, 243, 244 set() 101, 103 skipBytes() 151 SQLInput() 108, 150 SQLOutput() 108, 150 StringtoDOM() 84 toBytes() 132 toHexString() 132 toString() 101, 103 updateObject() 196 updateRow() 266 updateRow()、およびスクロール カーソル updatesAreDetected() 74 updateString() 196 writeArray() 92 writeAsciiStream() 153 72 228 57 索引 285 メソッド (続き) 例 (続き) 名前付き行と名前なし行 名前付き行に対する SQLData インターフェイスの使用 writeBinaryStream() 154 writeBytes() 152, 154 writeByte() 108 109 writeCharacterStream() に対する Struct クラスの作成 92, 108, 154 114 writeInt() 112 writeObject() 108, 112, 154, 262 Struct インターフェイスの使用 113 バイト (BYTE) 型とテキスト (TEXT) 型 writeProperties() 不透明 (OPAQUE) 型 228 writeRef() 92, 108, 154 writeSQL() 109, 112, 116, 152 データの抽出 174 に対するクラスの定義 writeString() ラージ オブジェクト 152, 154 writeXXX() 112 XMLtoInputStream XMLtoString() ユーザ定義ルーチン 187 autofree.java 210, 218 83 83 BatchUpdate.java メソッド、DatabaseMetaData 文字列、を使用した日付表現 77 113 作成 154 作成例 187 CallOut3.java CallOut4.java 218 218 charattrUDT.java 221 createTypes.java 221 172 ユーザ定義ルーチン、作成手順 ユーザ名の設定 データベース URL で 23 DataSource オブジェクトで ユーティリティ ClassGenerator 6, 116 158 18 11 SqlhDelete 36 SqlhUpload 35 読取り専用接続 74 [ラ行] ラージ オブジェクトのキャッシュ 208 ラージ可変長文字 (LVARCHAR) 型 235, 245 リソースの割当て解除 56 リモート データベース アクセス 39 リモート メソッド起動 (RMI) 44 例 コレクション (COLLECTION) 型 Array インターフェイスの使用 106 Collection インターフェイスの使用 104 スマート ラージ オブジェクト 220, 221 ディスティンクト (DISTINCT) 型 データの挿入 90 データの抽出 92 名前付き行 222 286 220 146 ByteType.java 93, 95, 218 CallOut1.java 218 CallOut2.java 218 [ヤ行] jar 作成 データ抽出 147 BulkInsert.java 59 193 ユーザ定義ルーチン および名前付き行パラメータ 59, 218 BLOB 型と CLOB 型 78 メタデータ、データベースへのアクセス 定義 150, 160 とトランザクション 173 175 IBM Informix JDBC ドライバ プログラマーズ ガイド DataSource 217 DBCENTURYSelect2.java DBCENTURYSelect3.java 197, 218 197, 218 DBCENTURYSelect4.java DBCENTURYSelect5.java 197, 218 197, 218 DBCENTURYSelect.java 197, 218 DBConnection.java 24, 219 DBDATESelect.java 219 DBMetaData.java 219 distinct_d1.java 221 distinct_d2.java 221 ErrorHandling.java 77, 219 GenericStruct.java 222 GLDATESelect.java 219 Intervaldemo.java 103, 219 largebinUDT.java 221 list1.java 221 list2.java 222 LOCALESelect.java 219 locmsg.java 205, 219 manualUDT.java 221 MultiRowCall.java 219 myMoney.java 221 OptimizedSelect.java 219 optofc.java 26, 210, 219 OUT パラメータ 60 PropertyConnection.java 219 row3.java 222 RSMetaData.java 219 ScrollCursor.java 57, 219 Serial.java 219 93, 95, 220 例 (続き) B SimpleCall.java 219 SimpleConnection.java SimpleSelect.java TextConv.java BatchUpdateException インターフェイス 220 BatchUpdate.java サンプル プログラム beforeFirst() メソッド 259, 261 220 220 TextType.java 95, 96, 220 UDR Manager 225 BEGIN WORK 文 UDT Manager データ型 97 BIG_FET_BUF_SIZE 環境変数 221 221 udt_d3.java 221 57, 220 57, 220 UpdateCursor3.java 57, 220 キャッシュ 定義 127 に対する拡張 連邦情報処理標準への準拠 フォーマット 例 ユーザ定義 ロック 行 45 作成 189 ロケール クライアント、指定 191 コード セットとの同期化 93, 146, 208 118 に対するコード セット変換 XML 文書 84 データベース、指定 表 200 26, 207 BLOB 型 UpdateCursor1.java UpdateCursor2.java ローカライゼーション 10 進表記 191 145 BIGSERIAL 型 225 udt_d1.java udt_d2.java 59 59, 218 203 127 146 データ抽出 147 BLOB 型および CLOB 型、アクセス 119 BLOB 型と CLOB 型のサンプル プログラム 220 BulkInsert.java サンプル プログラム 59 ByteType.java サンプル プログラム 93, 95, 218 190 191 204 C 143 CallableStatement およびオーバーロード ストアド プロシジャ [ワ行] 名前付きパラメータ 66 CallableStatement インターフェイス 54, 60, 267 を戻します。 CallOut1.java サンプル プログラム CallOut2.java サンプル プログラム CallOut3.java サンプル プログラム 218 218 218 CallOut4.java サンプル プログラム 218 74 [数字] 10 進変換 191 16 進フォーマット、間での変換 131 16 進文字列フォーマット 131 5.x データベース サーバ 32 A absolute() メソッド 57, 259, 261 activateHDRPool_Primary() メソッド 214 activateHDRPool_Secondary() メソッド 214 addBatch() メソッド 72 addProp() メソッド 227 afterLast() メソッド 261 APPLET タグ 12 APPLET タグの ARCHIVE 属性 12 Array クラス 106 ArrayList クラス 104 autofree.java サンプル プログラム 210, 218 69 charattrUDT.java サンプル プログラム 221 ClassGenerator ユーティリティ 6, 116, 225 CLASSPATH 環境変数 10, 81, 116 CLIENT_LOCALE 環境変数 191, 197 CLOB 型 キャッシュ 93, 146, 208 コード セット変換 201 定義 127 に対する拡張 118 に対するコード セット変換 201 フォーマット 127 例 作成 146 データ抽出 147 Clob::setAsciiStream(long position, InputStream fin, int length) メ ソッド 202 close() メソッド 27, 31, 56, 210 Collection インターフェイス 104 COMMIT WORK 文 145 commit() メソッド 75 com.informix.jdbc.Message クラス 79 Connection Pool Manager 212 プロパティ 232 索引 287 Connection インターフェイス 3 ConnectionPoolDataSource インターフェイス ConnectionPoolDataSource オブジェクト Connection.close() メソッド connect() メソッド 259 CORBA E 55, 75 ConnectionEventListener インターフェイス ConnectionPoolDataSource 232 ENABLE_CACHE_TYPE 環境変数 ENABLE_HDRSWITCH 環境変数 equals() メソッド 101, 103 3 211 ErrorHandling.java サンプル プログラム 52 executeBatch() メソッド createUDRs() メソッド executeXXX() メソッド 221 27 current() メソッド 259 execute() メソッド 55, 72, 74, 260 extensibleObject クラス 33 169 createUDTClass() メソッド 164 createUDT() メソッド 165 CSM 環境変数 F 261 FET_BUF_SIZE 環境変数 27, 207, 208, 219 File インターフェイス 94 FileInputStream インターフェイス D DATABASE 環境変数 18, 22 DatabaseMetaData インターフェイス FilesTimeoutMgr.class 77, 80 DatabaseMetaData メソッド 78 DatabaseMetaData.supportsNamedParameters() メソッド 66 FIPS 準拠 45 first() メソッド 259, 261 forName() メソッド 16 fromString() メソッド 拡張機能 227 サポートする Informix クラス 3 標準プロパティ 17, 228 94 41 fromHexString() メソッド DataBlade API データ型 153 DataSource インターフェイス 132 101, 103 G 例 217 DBANSIWARN 環境変数 27 DBCENTURY 環境変数 191, 196 GenericStruct.java サンプル プログラム getAlignment() メソッド 171 DBCENTURYSelect2.java サンプル プログラム 197, 218 getArray() メソッド 104, 107, 263 getAsciiStream() メソッド 95, 96, 127 DBCENTURYSelect3.java サンプル プログラム DBCENTURYSelect4.java サンプル プログラム DBCENTURYSelect5.java サンプル プログラム 197, 218 197, 218 197, 218 getAttributes() メソッド 114, 263 getAutoAlignment() メソッド 152 DBCENTURYSelect.java サンプル プログラム 197, 218 DBConnection.java サンプル プログラム 24, 219 DBDATE 環境変数 191, 194, 197 DBDATESelect.java サンプル プログラム 219 DBMetaData.java サンプル プログラム 219 DBSPACETEMP 環境変数 27 DBTEMP 環境変数 27 DBUPSPACE 環境変数 27 DB_LOCALE 環境変数 191, 197 deleteRow() メソッド 57, 266 deletesAreDetected() メソッド 74 DELIMIDENT 環境変数 27 DESCRIBE INPUT 文 70 dispValue() メソッド 96 distinct_d1.java サンプル プログラム 221 distinct_d2.java サンプル プログラム 221 DOM (Document Object Model) 81 Driver インターフェイス 80 DriverManager インターフェイス 2, 17, 20, 26 288 77, 219 260 executeQuery() メソッド 55, 63, 79 executeUpdate() メソッド 24, 94, 260 44 createJar() メソッド 165 createTypes.java サンプル プログラム 27, 118, 153 27, 37 IBM Informix JDBC ドライバ プログラマーズ ガイド 222 getAutoFree() メソッド 79, 210 getBigSerial() メソッド 97 getBinaryStream() メソッド 95, 96, 127 getBlob() メソッド 127, 148, 266 getBytes() メソッド 127, 201, 202 getCatalogName() メソッド 74 getCatalogs() メソッド 79 getClassName() メソッド 171 getClob() メソッド 127, 148, 266 getConnection() メソッド 20, 24, 25, 259 getCurrentPosition() メソッド 151 getDatabaseName() メソッド 228 getDataSourceName() メソッド 228 getDate() メソッド 196 getDescription() メソッド 228 getDriverMajorVersion() メソッド 80 getDriverMinorVersion() メソッド 80 getDsProperties() メソッド 227 getEndCode() メソッド 99 getErrorCode() メソッド 76 getFetchSize() メソッド 74 getFieldCount() メソッド 170 getFieldLength() メソッド 171 getFieldName メソッド getIfxPLOAD_LO_PATH() メソッド 231 getIfxPORTNO_SECONDARY() メソッド 231 170 getFieldName() メソッド 99 getFieldTypeName() メソッド getIfxPROXY() メソッド 171 231 getIfxPSORT_DBTEMP() メソッド 231 229 getIfxPSORT_NPROCS() メソッド 231 getIfxCPMInitPoolSize() メソッド 232 getIfxCPMMaxAgeLimit() メソッド 232 getIfxSECURITY() メソッド 231 getIfxSQLH_FILE() メソッド 231 getIfxCPMMaxConnections() メソッド getIfxSQLH_TYPE() メソッド 231 getIfxSQLIDEBUG () メソッド 231 getHDRtype() メソッド 38 getIfxCLIENT_LOCALE() メソッド 232 getIfxCPMMaxPoolSize() メソッド 232 getIfxCPMMinAgeLimit() メソッド 232 getIfxCPMMinPoolSize() メソッド getIfxSTMT_CACHE() メソッド getIfxTypeName() メソッド 232 getIfxCPMServiceInterval() メソッド 232 getIfxCPMSwitchHDRPool() メソッド 232 getInputSource() メソッド getIfxCSM() メソッド getJDBCVersion() メソッド 80 getLength() メソッド 99, 171 getIfxDBCENTURY() メソッド getIfxDBDATE() メソッド 229 getLocator() メソッド 229 getIfxDBSPACETEMP() メソッド getIfxDBTEMP() メソッド 229 171 128, 148 getMajorVersion() メソッド 229 80 getMessage() メソッド 76 getMetaData() メソッド 63 getIfxDBUPSPACE() メソッド 229 getIfxDB_LOCALE() メソッド 229 getIfxFET_BUF_SIZE() メソッド 229 getMinorVersion() メソッド 80 getMonths() メソッド 101 getNanoSeconds() メソッド 103 getNextException() メソッド 77 getIfxGL_DATE() メソッド 229 getIfxIFXHOST() メソッド 230 getObject() メソッド 104, 107, 109, 112, 114 getParameterAlignment メソッド 71 getParameterExtendedId メソッド 71 getIfxIFXHOST_SECONDARY() メソッド 230 getIfxIFX_CODESETLOB() メソッド 229 getIfxIFX_DIRECTIVES() メソッド 229 getIfxIFX_EXTDIRECTIVES() メソッド 229 getIfxIFX_FLAT_UCSQ() メソッド 229 getParameterExtendedName メソッド getIfxIFX_IFX_GET_SMFLOAT_AS_FLOAT() メソッド getIfxIFX_ISOLATION_LEVEL() メソッド 230 getIfxIFX_LOCK_MODE_WAIT() 230 getIfxIFX_LOCK_MODE_WAIT() メソッド 84 getJarFileSQLName() メソッド 229 231 99 229 230 getIfxIFX_SET_FLOAT_AS_SMFLOAT() メソッド 230 getIfxIFX_TRIMTRAILINGSPACES() メソッド 230 getIfxIFX_XASPEC() メソッド 230 getIfxINFORMIXCONRETRY() メソッド 230 getIfxINFORMIXCONTIME() メソッド 230 getIfxINFORMIXOPCACHE() メソッド 230 getIfxINFORMIXSERVER_SECONDARY() メソッド getIfxINFORMIXSTACKSIZE() メソッド 230 getIfxJDBCTEMP() メソッド 230 getIfxLDAP_IFXBASE() メソッド 230 getIfxLDAP_PASSWD() メソッド 230 getIfxLDAP_URL() メソッド 230 getIfxLDAP_USER() メソッド 230 getIfxLOBCACHE() メソッド 230 getIfxNEWCODESET() メソッド 230 getIfxNEWLOCALE() メソッド 230 getIfxNEWNLSMAP() メソッド 231 getIfxNODEFDAC() メソッド 231 getIfxOPTCOMPIND() メソッド 231 getIfxOPTOFC() メソッド 231 getIfxOPT_GOAL() メソッド 231 getIfxPATH() メソッド 231 getIfxPDQPRIORITY() メソッド 231 getIfxPLCONFIG() メソッド 231 230 71 getParameterExtendedOwnerName メソッド getParameterLength メソッド 71 getParameterMetaData() メソッド 70 getParameterSourceType メソッド getPassword() メソッド 228 getPortNumber() メソッド 228 getProcedureColumns() メソッド getProp() メソッド 227 71 71 73 getQualifier() メソッド 99 getRef() メソッド 72 getResultSet() メソッド 260, 262 getScale() メソッド 99 getSchemaName() メソッド 74 getSchemas() メソッド 79 getSeconds() メソッド 103 getSerial8() メソッド 96 getSerial() メソッド 96 getServerName() メソッド 228 getSQLName() メソッド 171 getSQLStatementOffset() メソッド 77 getSQLState() メソッド 76 getSQLTypeName() メソッド 109, 112, 114, 116, 118, 153 getStartCode() メソッド 99 getString() メソッド 127, 193, 195, 201, 202 getTableName() メソッド 74 getText() メソッド 200 getTimestamp() メソッド 196 getTypeMap() メソッド 107, 111 getUDRSQLname() メソッド 172 索引 289 getUDR() メソッド IFXHOST_SECONDARY 環境変数 172 getUnicodeStream() メソッド 72 getUpdateCounts() メソッド 59 IfxJDBCProxy クラス 41 IfxJDBCProxy.class ファイル getUpdateCount() メソッド ifxjdbcx.jar getUser() メソッド 260, 262 GLDATESelect.java サンプル プログラム 219 6 ifxjdbc.jar 7 ifxjdbc.jar ファイル 6, 12 ifxlang.jar ファイル 6, 205 IfxLobDescriptor クラス GL_DATE 環境変数 191, 192, 197 greaterThan() メソッド 101, 103 7, 41 7 ifxjdbcx.jar ファイル 228 getWarnings() メソッド 63 getXXX() メソッド 55, 60, 245, 247, 266 123 IfxLobDescriptor() コンストラクタ IfxLocator オブジェクト 123 16 進フォーマットへの変換 H HashSet クラス 104 IfxLocator() コンストラクタ 63 IfxLoCreate() メソッド IfxLoOpen() メソッド 37 123 39, 41 IfxLoSize() メソッド 131 IfxLoTell() メソッド 128 IfxLoTruncate() メソッド 131 IBM Informix JDBC ドライバ 接続プールでの使用 211 IBM Informix JDBC ドライバの概要 IBM Informix JDBC ドライバの登録 123, 124 124, 127, 128, 148 IfxLoRead() メソッド 127, 129, 148 IfxLoRelease() メソッド 131 IfxLoSeek() メソッド 128 I IfxLoWrite() メソッド 127, 130 IfxPooledConnection クラス 3 3 17 IBM Informix JDBC ドライバのロード 16 IBM xml4j パーサ 81 IDS でのスマート ラージ オブジェクト サポート IfmxCallableStatement インターフェイス IfxRegisterOutParameter() メソッド IfxSetNull() メソッド 65, 266 119 65 IFMX_CPM_AGELIMIT 環境変数 213 IFMX_CPM_ENABLE_SWITCH_HDRPOOL 環境変数 IFMX_CPM_INIT_POOLSIZE 環境変数 212 IFMX_CPM_MAX_CONNECTIONS 環境変数 212 IFMX_CPM_MAX_POOLSIZE 環境変数 212 IFMX_CPM_MIN_AGELIMIT 環境変数 213 IFMX_CPM_MIN_POOLSIZE 環境変数 212 IFMX_CPM_SERVICE_INTERVAL 環境変数 213 IfxBblob クラス 127 IfxBblob() コンストラクタ 127 IfxCblob インターフェイス 127 IfxCblob クラス 127 IfxCblob() コンストラクタ 127 IfxCblob::setAsciiStream(long) メソッド 202 IfxConnectionEventListener クラス 3 IfxConnectionPoolDataSource クラス 3, 227 IfxCoreDataSource クラス 3 IfxDataSource クラス 3, 227 IfxDriver クラス 16 IFXHOST 環境変数 18, 22, 30 65, 266, 267 IfxSetObject() メソッド 196, 237 ifxsqlj.jar ファイル 6 ifxtools.jar ファイル 5, 6, 81, 116 IfxTypes クラス 238, 241 IfxXADataSource クラス 3 IfmxStatement クラス 79 IfmxUdtSQLInput インターフェイス 150, 151 IfmxUdtSQLOutput インターフェイス 150, 152 290 131 IfxLocator() メソッド 132 IfxLoClose() メソッド 131 37 HDR ペア 37 HDR ペアでのグループ記入項目 HOLD カーソル 58 HTTP プロキシ 123 16 進への変換 131 IfxLocator クラス 132 hasOutParameter() メソッド HDR グループ記入項目 30, 37 IFX_AUTOFREE 環境変数 27, 210, 218 IFX_BATCHUPDATE_PER_SPEC 環境変数 213 IBM Informix JDBC ドライバ プログラマーズ ガイド 27, 59 IFX_CODESETLOB 202 IFX_CODESETLOB 環境変数 28, 201, 202 IFX_DIRECTIVES 環境変数 28 IFX_EXTDIRECTIVES 環境変数 28 IFX_FLAT_UCSQ 環境変数 28 IFX_GET_SMFLOAT_AS_FLOAT 環境変数 28 IFX_ISOLATION_LEVEL 28, 33 IFX_LOCK_MODE_WAIT 32 IFX_LOCK_MODE_WAIT 環境変数 29 IFX_PAD_VARCHAR 環境変数 29 IFX_SET_FLOAT_AS_SMFLOAT 環境変数 29 IFX_TRIMTRAILINGSPACES 環境変数 29 IFX_USEPUT 環境変数 29, 59 IFX_XASPEC 環境変数 29 IFX_XASTDCOMPLIANCE_XAEND 環境変数 30 IFX_XASTDCOMPLIANCE_XAEND(int value) メソッド IFX_XASTDCOMPLIANCE_XAEND() メソッド 230 Informix 拡張セット Clob インターフェイスへの 202 Informix ベース識別名 36 230 INFORMIXCONRETRY 環境変数 java.sql.Clob インターフェイス メソッド 202 30 INFORMIXCONTIME 環境変数 30 INFORMIXOPCACHE 環境変数 30 INFORMIXSERVER 環境変数 java.sql.ParameterMetaData クラス INFORMIXSTACKSIZE 環境変数 30 INFORMIX-SE 5.x データベース サーバ 32 202 java.sql.PreparedStatement インターフェイス 202 java.sql.PreparedStatement::setBinaryStream() 203 JDBC 3.0 93 200, 201, 202 InputStreamtoDOM() メソッド insertRow() メソッド 266 84 install.txt ファイル 70 202 java.text ファイル 190 java.util ファイル 190 InputStreamReader() メソッド insertsAreDetected() メソッド からのメソッド 30, 37 214 INOUT パラメータ 61 InputStream インターフェイス Interval クラス java.sql.PreparedStatement 18, 22, 24, 30 INFORMIXSERVER_SECONDARY 環境変数 initialPoolSize 202 メソッド java.sql.Blob インターフェイス java.sql.Clob インターフェイス 74 JDBC 3.0 仕様準拠 JDBC API 1 8 98 Intervaldemo.java サンプル プログラム IntervalDF クラス 101 103, 219 JDBC ドライバ、一般 2 K 18 keepJavaFile() メソッド isDefinitelyWriteable() メソッド 74 isHDREnabled() メソッド 38 isIfxDBANSIWARN() メソッド 229 163 L 229 isIfxIFX_AUTOFREE() メソッド 229 isIfxIFX_USEPUT() メソッド 230 isIfxUSEV5SERVER() メソッド isReadOnly() メソッド 38, 74 isWriteable() メソッド 74 78 アプリケーションで 10 jdbcrel.htm ファイル 8 JDBCTEMP 環境変数 30 IP アドレスの設定 データベース URL で 22 isIfxDELIMIDENT() メソッド 229 isIfxENABLE_CACHE_TYPE() メソッド 121 121 JDBC の使用 IntervalDF() コンストラクタ 101 IntervalYM クラス 99 IntervalYM() コンストラクタ 100 DataSource オブジェクトで IPv6 認識 23 119 JDBC 3.0 仕様 231 J JAR ファイル ifxjdbcx.jar 6 ifxjdbc.jar 6, 12 ifxlang.jar 6, 205 ifxsqlj.jar 6 ifxtools.jar 6, 116 JNDI 用 33 LDAP SPI 用 33 JAR ファイル、サーバ上の格納場所 165 jar ユーティリティ 11 Java Naming and Directory Interface (JNDI) および sqlhosts ファイル 33 用の JAR ファイル 33 Java 仮想マシン (JVM) 10 JavaSoft 1, 11 java.io ファイル 190 Java.Socket クラス 36 java.sql.Blob インターフェイス 127 largebinUDT.java サンプル プログラム last() メソッド 261 LDAP サーバ 19 および HTTP プロキシ 221 43 sqlhosts のデータでの更新 length() メソッド 152 35 lessThan() メソッド 101, 103 Lightweight Directory Access Protocol (LDAP) サーバ および sqlhosts ファイル 33 管理要件 35 と未署名のアプレット 12 バージョン要件 33 用の JAR ファイル 33 用の URL 構文 33 用のユーティリティ 35 用のローダ 6 List インターフェイス 104 list1.java サンプル プログラム 221 list2.java サンプル プログラム 222 LO ハンドル BLOB 列に 127 CLOB 列に 127 LOBCACHE 環境変数 31, 93, 146, 209 Locale クラス 190 LOCALESelect.java サンプル プログラム 219 Locator オブジェクト 123 locmsg.java サンプル プログラム 205, 219 索引 291 PreparedStatement インターフェイス prepareStatement() メソッド 55 M manualUDT.java サンプル プログラム 221 previous() メソッド 54, 55, 59, 237, 245 261 map.get() メソッド 111 map.put() メソッド 111, 112 Properties クラス 25 PropertyConnection.java サンプル プログラム maxIdleTime 214 propertyCycle maxPoolSize 214 PROXY 環境変数 maxStatements 214 Message クラス 77 minPoolSize 214 mitypes.h ファイル 153 moveToCurrentRow() メソッド moveToInsertRow() メソッド 32 PSORT_DBTEMP 環境変数 32 PSORT_NPROCS 環境変数 put() メソッド 26, 210 32 266 R 266 MultiRowCall.java サンプル プログラム myMoney.java サンプル プログラム 219 221 readArray() メソッド 92 readAsciiStream() メソッド 153 readBinaryStream() メソッド 153 readBytes() メソッド N 151, 153 NEWCODESET 環境変数 191, 204 NEWLOCALE 環境変数 191, 204 readByte() メソッド 108 readCharacterStream() メソッド 92, 108, 153 readObject() メソッド 108, 153 NEWNLSMAP 環境変数 31, 204 next() メソッド 31, 55, 95, 210 readProperties() メソッド NODEFDAC 環境変数 read() メソッド 96 REF 型 233 refreshRow() メソッド O registerDriver() メソッド 134 OPTCOMPIND 環境変数 31 OptimizedSelect.java サンプル プログラム 219 OPTOFC 環境変数 31, 210, 219 optofc.java サンプル プログラム 26, 210, 219 OPT_GOAL 環境変数 31 othersDeletesAreVisible() メソッド 73 othersInsertsAreVisible() メソッド 73 othersUpdatesAreVisible() メソッド 73 OUT パラメータ 61 OUT パラメータのサンプル プログラム 60 OutputStreamWriter() メソッド 200, 201, 202 ownDeletesAreVisible() メソッド 73 ownInsertsAreVisible() メソッド 73 ownUpdatesAreVisible() メソッド 73 P ParameterMetaData クラス 67, 70 PASSWORD 接続プロパティ 18, 23 PATH 環境変数 31 PDQPRIORITY 環境変数 31 PLCONFIG 環境変数 31 PLOAD_LO_PATH 環境変数 32 PooledConnection インターフェイス 3 PORTNO 環境変数 18, 22 PORTNO_SECONDARY 環境変数 32, 37 PREPARE 文、複数実行 58 292 227 readRef() メソッド 92, 108, 153 readSQL() メソッド 109, 111, 116, 152 readString() メソッド 151, 153 31 ODBC 2 onspaces ユーティリティ 219 214 IBM Informix JDBC ドライバ プログラマーズ ガイド 72 17 registerOutParameter() メソッド に対する型マッピング 64 relative() メソッド 261 60, 266, 267 removeJar() メソッド 168, 169 removeProperty() メソッド 227 removeUDR() メソッド 169, 170 removeUDT() メソッド 168 ResultSet インターフェイス 54, 55, 210, 245, 248 ResultSet クラス 193, 195 ResultSetMetaData インターフェイス 54 RMI 44 ROLLBACK WORK 文 145 row3.java サンプル プログラム 222 rowDeleted() メソッド 72 rowInserted() メソッド 72 rowUpdated() メソッド 72 RSMetaData.java サンプル プログラム 219 S SAX (Simple API for XML) 81 SB 領域 名前 137 メタデータ領域 139 ユーザ データ領域 139 SBSPACENAME 構成パラメータ 134, 137 ScrollCursor.java サンプル プログラム 57, 219 SCROLL_INSENTIVE ResultSet scrubConnection() メソッド SECURITY 環境変数 32 SERIAL8 型 55 52, 215 Serial.java サンプル プログラム SessionMgr クラス 41 SessionMgr.class ファイル 219 7, 41 229 setAsciiStream() メソッド 79, 210 92, 240 setBinaryStream() メソッド 93, 94, 237, 240 229 setIfxIFX_FLAT_UCSQ メソッド 229 229 setIfxIFX_ISOLATION_LEVEL メソッド 230 setIfxIFX_LOCK_MODE_WAIT メソッド 230 setIfxIFX_TRIMTRAILINGSPACES() メソッド setIfxIFX_USEPUT() メソッド 230 setIfxINFORMIXCONRETRY() メソッド setIfxINFORMIXCONTIME() メソッド setBlob() メソッド 240 setBoolean() メソッド 240 230 230 230 setIfxINFORMIXOPCACHE() メソッド 230 setIfxINFORMIXSERVER_SECONDARY() メソッド setBytes() メソッド 240 setByte() メソッド 240 setCatalog() メソッド 72 setIfxINFORMIXSTACKSIZE() メソッド setCharacterStream() メソッド 240 setClassName() メソッド 163 setClob() メソッド 240 setCurrentPosition() メソッド 229 setIfxIFXHOST() メソッド 230 setIfxIFX_AUTOFREE() メソッド setIfxIFX_EXTDIRECTIVES() メソッド 93, 95, 237, 240 setAutoAlignment() メソッド 152 setAutoCommit() メソッド 75 setBigDecimal() メソッド setIfxGL_DATE() メソッド 229 setIfxIFX_CODESETLOB() メソッド 229 setIfxIFX_DIRECTIVES() メソッド 229, 230 104 setAlignment() メソッド 162 setArray() メソッド 104, 239 setAutoFree() メソッド 229 setIfxENABLE__HDRSWITCH() メソッド setIfxFET_BUF_SIZE() メソッド 96 Set インターフェイス setIfxDELIMIDENT() メソッド 229 setIfxENABLE_CACHE_TYPE() メソッド 151 setDatabaseName() メソッド 228 setDataSourceName() メソッド 228 setDate() メソッド 240 setDescription() メソッド 228 setDouble() メソッド 241 setExplicitCast() メソッド 166 setFetchDirection() メソッド 261 setFetchSize() メソッド 72, 261 setFieldCount() メソッド 161 setFieldLength() メソッド 161 setFieldName メソッド 161 setFieldTypeName() メソッド 161 setFieldType() メソッド 161 setFloat() メソッド 241 setIfxCLIENT_LOCALE() メソッド 229 setIfxCPMInitPoolSize() メソッド 232 setIfxCPMMaxAgeLimit() メソッド 232 setIfxCPMMaxConnections() メソッド 232 setIfxCPMMaxPoolSize() メソッド 232 setIfxCPMMinAgeLimit() メソッド 232 setIfxCPMMinPoolSize() メソッド 232 setIfxCPMServiceInterval() メソッド 232 setIfxCPMSwitchHDRPool() メソッド 232 setIfxCSM (String csm) メソッド 229 setIfxDBANSIWARN() メソッド 229 setIfxDBCENTURY() メソッド 229 setIfxDBDATE() メソッド 229 setIfxDBSPACETEMP() メソッド 229 setIfxDBTEMP() メソッド 229 setIfxDBUPSPACE() メソッド 229 setIfxDB_LOCALE() メソッド 229 230 230 setIfxJDBCTEMP() メソッド 230 setIfxLDAP_IFXBASE() メソッド 230 setIfxLDAP_PASSWD() メソッド 230 setIfxLDAP_URL() メソッド 230 setIfxLDAP_USER() メソッド 230 setIfxLOBCACHE() メソッド 230 setIfxNEWCODESET() メソッド 230 setIfxNEWLOCALE() メソッド 230, 231 setIfxNODEFDAC(String value) メソッド 231 setIfxOPTCOMPIND() メソッド 231 setIfxOPTOFC() メソッド 231 setIfxOPT_GOAL() メソッド 231 setIfxPATH() メソッド 231 setIfxPDQPRIORITY() メソッド 231 setIfxPLCONFIG() メソッド 231 setIfxPLOAD_LO_PATH() メソッド 231 setIfxPROXY() メソッド 231 setIfxPSORT_DBTEMP() メソッド 231 setIfxPSORT_NPROCS() メソッド 231 setIfxSECURITY() メソッド 231 setIfxSQLH_FILE() メソッド 231 setIfxSQLH_TYPE() メソッド 231 setIfxSQLIDEBUG) メソッド 231 setIfxSTMT_CACHE() メソッド 231 setIfxUSEV5SERVER() メソッド 231 setImplicitCast() メソッド 166 setInt() メソッド 55, 241 setJarFileSQLName() メソッド 161, 163, 168 setJarTmpPath() メソッド 165 setLength() メソッド 162 setLong() メソッド 241 setMaxFieldSize() メソッド 72 setMaxRows() メソッド 261 setNull() メソッド 64, 241 setObject() メソッド 92, 104, 112, 196 setPassword() メソッド 228 索引 293 setPortNumber() メソッド Struct オブジェクト 228 型情報のキャッシュ setQualifier() method 101 setQualifier() メソッド 103 setReadOnly() メソッド setRef() メソッド 72 72 setServerName() メソッド setShort() メソッド 241 setSQLName() メソッド 118, 153 Sun JDBC 3.0 のプロパティ sysmaster データベース 78 systables カタログ 214 およびコード セット変換 198 228 およびメタデータ 79 163, 164, 269 setSQLname() メソッド 161 setString() メソッド 174, 196, 241 T setTimestamp() メソッド TextConv.java サンプル プログラム 220 TextType.java サンプル プログラム TimeoutMgr クラス 41 95, 96, 220 241 setTime() メソッド 241 setTypeMap() メソッド 104, 109 setUDR() メソッド 155, 169, 172, 268 setUDTExtName() メソッド 155 setUnicodeStream() メソッド 72 TimeoutMgr.class ファイル toBytes() メソッド toHexString() メソッド 132 toString() メソッド 101, 103 setup.jar ファイル 5, 8 setup.std ファイル 116 メソッド setUser() メソッド 228 setXXX() メソッド 63, 174, 237, 243, 244 set() メソッド 101, 103 SimpleCall.java サンプル プログラム 219 SimpleConnection.java サンプル プログラム SimpleSelect.java サンプル プログラム skipBytes() メソッド 151 toString() 132 TreeSet クラス 105 TU_DAY 変数 98, 102 220 220 SQL 日付書式 ネイティブ 193, 195 非ネイティブ 193, 195 107, 112, 116, 152, 154 型情報のキャッシュ 118, 153 SQLException クラス 76, 77, 244, 247 SqlhDelete ユーティリティ 36 sqlhosts 情報の無名検索 34 sqlhosts ファイル 管理要件 35 グループ オプション 33 と未署名のアプレット 12 用の URL 構文 33 用のユーティリティ 35 読取り 33 SqlhUpload ユーティリティ 35 SQLH_TYPE 環境変数 32 SQLH_TYPE プロパティ 19 SQLIDEBUG 環境変数 32 SQLIDEBUG トレース 207 SQLInput インターフェイス 111 SQLInput() メソッド 108, 150 SQLOutput() メソッド 108, 150 SQLSTATE 値 76 Statement インターフェイス 24, 54, 59, 210 STMT_CACHE 環境変数 32 StringtoDOM() メソッド 84 Struct インターフェイス 107, 112 294 TU_F1 変数 99 TU_F2 変数 99 TU_F3 変数 99 TU_F4 変数 99 TU_F5 変数 99, 102 TU_FRAC 変数 99 TU_HOUR 変数 99 SQL 名 160, 163, 167 SQLCODE メッセージ 77 SQLData インターフェイス SQLData オブジェクト 7, 41 132 IBM Informix JDBC ドライバ プログラマーズ ガイド TU_MINUTE 変数 99 TU_MONTH 変数 98 TU_SECOND 変数 99 TU_YEAR 変数 98 Types インターフェイス 96, 233 U UDR 参照: ユーザ定義ルーチン UDR Manager サンプル プログラム 225 UDRManager クラス 5, 150, 155 UDRMetaData クラス 150, 155 UDT 参照: 不透明 (OPAQUE) 型 UDT Manager サンプル プログラム 225 UDTManager クラス 5, 150 UDTMetaData クラス 150 udtudrmgr パッケージ 5 udt_d1.java サンプル プログラム 221 udt_d2.java サンプル プログラム 221 udt_d3.java サンプル プログラム 221 Unicode およびクライアント コード セット および国際化 API 190 200 Unicode (続き) .java ファイル、保存 およびデータベース コード セット Unicode 文字 202 UpdateCursor1.java サンプル プログラム 57, 220 UpdateCursor2.java サンプル プログラム 57, 220 UpdateCursor3.java サンプル プログラム updateObject() メソッド 196 57, 220 updateRow() メソッド 164 198 57, 266 updatesAreDetected() メソッド updateString() メソッド 196 74 URL データベース 20, 21 LDAP サーバと sqlhosts ファイルの構文 USER 接続プロパティ 33 18, 23 USEV5SERVER 環境変数 32 V Version クラス 80 W writeArray() メソッド 92 writeAsciiStream() メソッド 153 writeBinaryStream() メソッド 154 writeBytes() メソッド 152, 154 writeByte() メソッド 108 writeCharacterStream() メソッド writeInt() メソッド 112 writeObject() メソッド 92, 108, 154 108, 112, 154, 262 writeProperties() メソッド 228 writeRef() メソッド 92, 108, 154 writeSQL() メソッド 109, 112, 116, 152 writeString() メソッド 152, 154 writeXXX() メソッド 112 X XA (分散トランザクション) 3, 16, 19, 75 XAConnection インターフェイス 75 XADataSource インターフェイス 3 xerces パーサ 81 xerces.jar ファイル 81 XML データの挿入 82 XML 文書 サンプル プログラム 224 ための環境設定 81 例 84 XMLtoInputStream() メソッド 83 XMLtoString() メソッド 83 [特殊文字] (!) 感嘆符 インストール パスの 8 索引 295 296 IBM Informix JDBC ドライバ プログラマーズ ガイド Printed in Japan SC88-4886-00 IBM Informix バージョン 3.50 Spine information: IBM Informix JDBC ドライバ プログラマーズ ガイド