Download IBM Informix JDBC ドライバ プログラマーズガイド バージョン 3.5(PDF:2.09MB)

Document related concepts
no text concepts found
Transcript
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 ドライバ プログラマーズ ガイド
򔻐򗗠򙳰