10 グローバル環境でのOCIプログラミング
この章では、グローバル環境でのOCIプログラミングについて説明します。この章の内容は次のとおりです。
10.1 OCI NLS関数の使用
多くのOCI NLS関数では、次のいずれかを受け入れます。
-
環境ハンドル
-
ユーザー・セッション・ハンドル
OCI環境ハンドルは、クライアントNLS環境に関連付けられており、クライアントNLS環境変数によって初期化されます。サーバーに対してALTER
SESSION
文が使用されても、この環境は変わりません。環境ハンドルに関連付けられている文字セットは、クライアント文字セットです。
OCIセッション・ハンドルは、サーバー・セッション環境に関連付けられています。ALTER
SESSION
文によってセッション環境が変更されると、このNLS設定も変更されます。セッション・ハンドルに関連付けられている文字セットは、データベース文字セットです。
OCIセッション・ハンドルは、そのセッションで最初のトランザクションが始まるまで、どのNLS設定とも関連付けられていません。SELECT
文では、トランザクションは始まりません。
関連項目:
OCI NLS関数の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください
10.2 OCIでの文字セットの指定
OCI環境の作成時にOCIEnvNlsCreate
関数を使用して、クライアント側データベースと各国語文字セットを指定します。この関数を使用すると、NLS_LANG
およびNLS_NCHAR
初期化パラメータの設定に関係なく、アプリケーションで文字セット情報を動的に設定できます。また、1つのアプリケーションで、同じサーバー環境内で異なるクライアント環境に使用する複数の環境ハンドラを初期化できます。
AL16UTF16を除くOracle文字セットIDを指定するには、OCIEnvNlsCreate
関数を通じてメタデータ、SQL CHAR
データおよびSQL NCHAR
データのエンコーディングを指定します。UTF-16データを指定するには、OCIEnvNlsCreate
関数でOCI_UTF16ID
を使用します。
関連項目:
OCIEnvNlsCreate
関数の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください
10.3 OCIでのロケール情報の取得
Oracleロケールは、言語、地域および文字セット定義で構成されます。ロケールは、曜日と月の名前、および日付、時刻、数値、通貨の書式などの表記規則を決定します。国際化されたアプリケーションは、ユーザーのロケール設定と文化的な慣習に従って動作します。たとえば、ロケールをドイツに設定すると、月日の名前がドイツ語で表示されます。
OCINlsGetInfo()
関数を使用すると、次のロケール情報を取得できます。
- 曜日(翻訳済)
- 曜日の略称(翻訳済)
- 月名(翻訳済)
- 月名の略称(翻訳済)
- はい/いいえ(翻訳済)
- AM/PM (翻訳済)
- AD/BC (翻訳済)
- 数値書式
- 借方/貸方
- 日付書式
- 通過書式
- デフォルトの言語
- デフォルトの地域
- デフォルトの文字セット
- デフォルトの言語ソート
- デフォルトのカレンダ
表10-1に、ロケール情報を戻すOCI関数を示します。
表10-1 ロケール情報を戻すOCI関数
関数 | 説明 |
---|---|
|
ロケール情報を戻します。前述の説明を参照してください。 |
|
指定されたOracle文字セット名のOracle文字セットIDを戻します。 |
|
指定された文字セットIDのOracle文字セット名を戻します。 |
|
最大文字サイズなど、指定された数値情報を戻します。 |
|
|
10.4 Oracleと他の規格とのロケール情報のマッピング
OCINlsNameMap
関数は、Oracle文字セット名、言語名および地域名と、Internet Assigned Numbers Authority (IANA)名および国際標準化機構(ISO)名の間のマッピングを行います。
10.5 OCIでの文字列操作
文字列の操作用に、2種類のデータ構造がサポートされています。
-
ネイティブ・キャラクタ文字列
-
ワイド・キャラクタ文字列
ネイティブ・キャラクタ文字列は、Oracleのネイティブ文字セットでエンコードされます。ネイティブ・キャラクタ文字列を処理する関数は、その文字列の長さをバイト単位で計算して1単位として扱います。ワイド・キャラクタ(wchar
)文字列関数は、文字列操作の柔軟性を高めます。この種の関数は、文字列の長さを文字数で計算し、文字ベースと文字列ベースの操作をサポートします。
ワイド・キャラクタのデータ型はOracle固有です。ANSI/ISOのC規格で定義されているwchar_t
データ型と混同しないでください。Oracleのワイド・キャラクタのデータ型は、すべてのプラットフォームで常に4バイトですが、wchar_t
のサイズは実装とプラットフォームに依存します。Oracleのワイド・キャラクタのデータ型によって、ネイティブ・キャラクタは簡単に処理できる固定幅になるように正規化されます。これにより、Oracleのワイド・キャラクタ形式とネイティブ・キャラクタ形式の間でラウンドトリップ変換時にデータ消失が発生しないことが保証されます。
次の文字列操作が含まれます。
-
ネイティブ・キャラクタ形式とワイド・キャラクタ形式間の文字列の変換
-
文字の分類
-
大/小文字の変換
-
表示長の計算
-
比較、連結、検索などの一般的な文字列操作
表10-2に、OCI文字列操作関数を示します。
ノート:
表10-2では、マルチバイト文字列に言及している関数と説明は、ネイティブ・キャラクタ文字列に適用されます。
表10-2 OCI文字列操作関数
関数 | 説明 |
---|---|
|
ヌル文字で終了する文字列全体を |
|
文字列の一部を |
|
ヌル文字で終了するワイド・キャラクタ文字列全体をマルチバイト文字列に変換します。 |
|
ワイド・キャラクタ文字列の一部をマルチバイト書式に変換します。 |
|
|
|
|
|
2つのワイド・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 ノート: |
|
この関数は ノート: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2つのマルチバイト・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 |
|
2つのマルチバイト・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
文字列の一部をある文字セットから別の文字セットに変換します。 |
10.6 OCIでの文字の分類
表10-3に、OCIの文字の分類関数を示します。
表10-3 OCIの文字の分類関数
関数 | 説明 |
---|---|
|
ワイド・キャラクタが、アルファベット文字であるか10進数字であるかをテストします。 |
|
ワイド・キャラクタが、アルファベット文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、制御文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、10進数字であるかどうかをテストします。 |
|
ワイド・キャラクタが、図形文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、小文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、印字可能文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、句読点文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、スペース文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、大文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、16進数字であるかどうかをテストします。 |
|
|
10.7 OCIでの文字セットの変換
Oracle文字セットとUnicode (16ビット、固定幅のUnicodeエンコーディング)間の変換がサポートされています。UnicodeからOracle文字セットへの文字のマッピングが存在しない場合、置換文字が使用されます。したがって、変換して元の文字セットに戻す場合、データが失われる可能性があります。
表10-4に、OCIの文字セット変換関数を示します。
表10-4 OCI文字セット変換関数
関数 | 説明 |
---|---|
|
|
|
|
文字列をある文字セットから別の文字セットに変換します。 |
|
|
|
10.8 OCIメッセージ関数
ユーザー・メッセージAPIには、カートリッジ開発者のための簡易インタフェースが用意されています。これによって、Oracleメッセージと同様にユーザー自身のメッセージを取り出すことができます。
表10-5に、OCIメッセージ関数を示します。
表10-5 OCIメッセージ関数
関数 | 説明 |
---|---|
|
|
|
|
|
|
10.9 lmsgenユーティリティ
用途
lmsgen
ユーティリティは、テキスト・ベースのメッセージ・ファイル(.msg
)をバイナリ形式(.msb
)に変換します。これにより、ユーザーが提供するOracleメッセージとOCIメッセージを、必要な言語でOCI関数に戻すことができます。
サーバーが使用するメッセージは、$ORACLE_HOME/product_name/mesg
ディレクトリにあるバイナリ形式ファイル、あるいはそれに相当するオペレーティング・システム用ファイルに格納されます。このファイルには、次のファイル名規則に従って、サポート対象言語ごとに1バージョンずつ、複数のバージョンが存在します。
<product_id><language_abbrev>.msb
たとえば、ORA
は製品ID(<product_id
>)でF
はフランス語の略称(<language_abbrev
>)であるため、フランス語のサーバー・メッセージが含まれたファイルはoraf.msb
と呼ばれます。product_name
の値はrdbmsであるため、$ORACLE_HOME/rdbms/mesg
ディレクトリにあります。
構文
LMSGENtext_file
product
facility
[language
] [-i indir] [-o outdir]
text_file
は、メッセージ・テキスト・ファイルです。product
は、製品の名前です。facility
は、機能の名前です。language
は、NLS_LANG
パラメータで指定された言語に対応する、オプションのメッセージ言語です。メッセージ・ファイルに言語のタグが正しく付いていない場合は、言語パラメータが必要です。indir
は、テキスト・ファイルの場所を指定するオプション・ディレクトリです。indir
は、出力ファイルの場所を指定するオプション・ディレクトリです。
出力(.msb
)ファイルは、$ORACLE_HOME/product/mesg/
ディレクトリの下に生成されます。
テキスト・メッセージ・ファイル
テキスト・メッセージ・ファイルは、次のガイドラインに従う必要があります。
-
/
および//
で始まる行は内部コメントとして扱われ、無視されます。 -
メッセージ・ファイルに特定の言語のタグを付けるには、次のような行を含めます。
# CHARACTER_SET_NAME= Japanese_Japan.JA16EUC
-
各メッセージには、3つのフィールドがあります。
message_number
,warning_level
,message_text
- メッセージ番号は、メッセージ・ファイル内で一意であることが必要です。
- warning_levelは、現在使用されていません。
0
を使用してください。 - message_textは、511バイトを超えることはできません。
次に、Oracleメッセージ・テキスト・ファイルの例を示します。
/ Copyright (c) 2006 by Oracle. All rights reserved. / This is a test us7ascii message file # CHARACTER_SET_NAME= american_america.us7ascii / 00000, 00000, "Export terminated unsuccessfully\n" 00003, 00000, "no storage definition found for segment(%lu, %lu)"
例: テキスト・メッセージ・ファイルからのバイナリ・メッセージ・ファイルの作成
次の表に、lmsgen
パラメータのサンプル値を示します。
パラメータ | 値 |
---|---|
|
|
|
|
|
|
|
|
テキスト・メッセージ・ファイル内の1行は、次のとおりです。
00128,2, "Duplicate entry %s found in %s"
lmsgen
ユーティリティは、テキスト・メッセージ・ファイル(impus.msg
)をバイナリ形式のファイルimpus.msb
に変換します。$ORACLE_HOME/myapp/mesg
ディレクトリがすでに存在している必要があります。
% lmsgen impus.msg myapp imp AMERICAN
出力結果は、次のようになります。
Generating message file impus.msg --> $ORACLE_HOME/myapp/mesg/impus.msb