この章では、グローバル環境でのOCIプログラミングについて説明します。この章の内容は、次のとおりです。
多くのOCI NLS関数では、次のいずれかを受け入れます。
環境ハンドル
ユーザー・セッション・ハンドル
OCI環境ハンドルは、クライアントNLS環境に関連付けられており、クライアントNLS環境変数によって初期化されます。サーバーに対してALTER
SESSION
文が使用されても、この環境は変わりません。環境ハンドルに関連付けられているキャラクタ・セットは、クライアント・キャラクタ・セットです。
OCIセッション・ハンドルは、サーバー・セッション環境に関連付けられています。ALTER
SESSION
文よってセッション環境が変更されると、このNLS設定も変更されます。セッション・ハンドルに関連付けられているキャラクタ・セットは、データベース・キャラクタ・セットです。
OCIセッション・ハンドルは、そのセッションで最初のトランザクションが始まるまで、どのNLS設定とも関連付けられていません。SELECT
文では、トランザクションは始まりません。
関連項目: OCI NLS関数の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
OCI環境の作成時にOCIEnvNlsCreate
関数を使用して、クライアント側データベースと各国語キャラクタ・セットを指定します。この関数を使用すると、NLS_LANG
およびNLS_NCHAR
初期化パラメータの設定に関係なく、アプリケーションでキャラクタ・セット情報を動的に設定できます。また、1つのアプリケーションで、同じサーバー環境内で異なるクライアント環境に使用する複数の環境ハンドラを初期化できます。
AL16UTF16を除くOracleキャラクタ・セットIDを指定するには、OCIEnvNlsCreate
関数を通じてメタデータ、SQL CHAR
データおよびSQL NCHAR
データのエンコーディングを指定します。UTF-16データを指定するには、OCIEnvNlsCreate
関数でOCI_UTF16ID
を使用します。
関連項目: OCIEnvNlsCreate 関数の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
Oracleのロケールは、言語、地域およびキャラクタ・セットの定義で構成されています。ロケールによって、日付、時刻、数字および通貨の書式と、曜日名、月名などの規則が定義されます。国際化されたアプリケーションは、ユーザーのロケール設定と文化的な慣習に従って動作します。たとえば、ロケールがドイツ語に設定されている場合、曜日名と月名はドイツ語で表示されます。
OCINlsGetInfo()
関数を使用すると、次のロケール情報を取得できます。
表10-1に、ロケール情報を戻すOCI関数を示します。
表10-1 ロケール情報を戻すOCI関数
関数 | 説明 |
---|---|
ロケール情報を戻します。前述の説明を参照してください。 |
|
指定されたOracleキャラクタ・セット名のOracleキャラクタ・セットIDを戻します。 |
|
指定されたキャラクタ・セットIDのOracleキャラクタ・セット名を戻します。 |
|
最大文字サイズなど、指定された数値情報を戻します。 |
|
|
関連項目: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
OCINlsNameMap
関数は、Oracleキャラクタ・セット名、言語名および地域名と、Internet Assigned Numbers Authority (IANA)名および国際標準化機構(ISO)名の間のマッピングを行います。
文字列操作では、次の2種類のデータ構造がサポートされています。
ネイティブ・キャラクタ文字列
ワイド・キャラクタ文字列
ネイティブ・キャラクタ文字列は、Oracleのネイティブ・キャラクタ・セットでエンコードされます。ネイティブ・キャラクタ文字列を処理する関数は、その文字列の長さをバイト単位で計算して1単位として扱います。ワイド・キャラクタ(wchar
)文字列関数は、文字列操作の柔軟性を高めます。この種の関数は、文字列の長さを文字数で計算し、文字ベースと文字列ベースの操作をサポートします。
ワイド・キャラクタのデータ型はOracle固有のデータ型です。ANSI/ISOのC規格で定義されているwchar_t
データ型と混同しないでください。Oracleのワイド・キャラクタのデータ型は、すべてのプラットフォームで常に4バイトですが、wchar_t
のサイズは、実装とプラットフォームに依存します。Oracleのワイド・キャラクタのデータ型によって、ネイティブ・キャラクタは簡単に処理できる固定幅になるように正規化されます。これにより、Oracleのワイド・キャラクタ形式とネイティブ・キャラクタ形式の間でラウンドトリップ変換時にデータ消失が発生しないことが保証されます。
次の文字列操作が含まれます。
ネイティブ・キャラクタ形式とワイド・キャラクタ形式間の文字列の変換
文字の分類
大/小文字の変換
表示長の計算
比較、連結、検索などの一般的な文字列操作
表10-2に、OCI文字列操作関数を示します。
表10-2 OCI文字列操作関数
関数 | 説明 |
---|---|
ヌル文字で終了する文字列全体を |
|
文字列の一部を |
|
ヌル文字で終了するワイド・キャラクタ文字列全体をマルチバイト文字列に変換します。 |
|
ワイド・キャラクタ文字列の一部をマルチバイト書式に変換します。 |
|
|
|
|
|
2つのワイド・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 注意: |
|
この関数は 注意: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2つのマルチバイト・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 |
|
2つのマルチバイト・キャラクタ文字列を、バイナリ、言語または大/小文字を区別しない比較方法で比較します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
文字列の一部をあるキャラクタ・セットから別のキャラクタ・セットに変換します。 |
関連項目: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
表10-3に、OCIの文字の分類関数を示します。
表10-3 OCIの文字の分類関数
関数 | 説明 |
---|---|
ワイド・キャラクタが、アルファベット文字であるか10進数字であるかをテストします。 |
|
ワイド・キャラクタが、アルファベット文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、制御文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、10進数字であるかどうかをテストします。 |
|
ワイド・キャラクタが、図形文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、小文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、印字可能文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、句読点文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、スペース文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、大文字であるかどうかをテストします。 |
|
ワイド・キャラクタが、16進数字であるかどうかをテストします。 |
|
|
関連項目: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
Oracleキャラクタ・セットとUnicode(16ビットの固定幅Unicodeエンコーディング)間の変換がサポートされています。UnicodeからOracleキャラクタ・セットへのマッピングがない場合は、置換文字が使用されます。したがって、データ消失なしで元のキャラクタ・セットへ戻る変換が常に可能なわけではありません。
表10-4に、OCIのキャラクタ・セット変換関数を示します。
表10-4 OCIキャラクタ・セット変換関数
関数 | 説明 |
---|---|
|
|
|
|
文字列をあるキャラクタ・セットから別のキャラクタ・セットに変換します。 |
|
|
ユーザー・メッセージAPIには、カートリッジ開発者のための簡易インタフェースが用意されています。これによって、Oracleメッセージと同様にユーザー自身のメッセージを取り出すことができます。
表10-5に、OCIメッセージ関数を示します。
表10-5 OCIメッセージ関数
関数 | 説明 |
---|---|
|
|
|
|
|
関連項目: 『Oracle Databaseデータ・カートリッジ開発者ガイド』 |
用途
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
は製品名です。fasility
は機能名です。language
は、NLS_LANG
パラメータで指定した言語に対応するオプションのメッセージ言語です。languageパラメータは、メッセージ・ファイルが言語に正しくタグ付けされていない場合に必要です。indir
は、テキスト・ファイルの場所を指定するためのオプション・ディレクトリです。outdir
は、出力ファイルの場所を指定するためのオプション・ディレクトリです。出力(.msb
)ファイルは、$ORACLE_HOME/product/mesg/
ディレクトリの下に生成されます。
テキスト・メッセージ・ファイル
テキスト・メッセージ・ファイルは、次のガイドラインに従う必要があります。
/
および//
で始まる行は内部コメントとして扱われ、無視されます。
メッセージ・ファイルを特定の言語でタグ付けするには、次のような1行を追加します。
# CHARACTER_SET_NAME= Japanese_Japan.JA16EUC
各メッセージには、次の3つのフィールドがあります。
message_number
,warning_level
,message_text
0
(ゼロ)を使用してください。次に、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
パラメータのサンプル値を示します。
パラメータ | 値 |
---|---|
product |
myapp |
facility |
imp |
language |
AMERICAN |
text_file |
impus.msg |
テキスト・メッセージ・ファイル内の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 NLS Binary Message File Generation Utility: Version 10.2.0.1.0 - Production Copyright (c) Oracle 1979, 2006. All rights reserved. CORE 10.2.0.1.0 Production