3つの内部データベース・データ型に、各国語キャラクタ・セット・データを格納できます。この種のデータ型は、NCHAR、NCLOBおよびNVARCHAR2です(NCHAR VARYINGとも呼ばれます)。これらのデータ型を使用できるのは、リレーショナル列のみです。
各国語キャラクタ・セット・データを保持するホスト変数を指定するには、文字変数宣言に句CHARACTER SET [IS] NCHAR_CSを挿入します。これで、その変数に各国語キャラクタ・セット・データを格納できます。トークンISは省略してもかまいません。NCHAR_CSは、各国語キャラクタ・セットの名前です。
次に例を示します。
char character set is nchar_cs *str = "<Japanese_string>";
この例で、<Japanese_string>は、変数NLS_NCHARで定義されたように、各国語キャラクタ・セットAL16UTF16にあるUnicode文字で構成されています。
また、コマンドラインにNLS_CHAR=strと入力し、アプリケーションのコードを変更しても、同じ操作を実行できます。
char *str = "<Japanese_string>"
Pro*C/C++では、このように宣言された変数は、環境変数NLS_NCHARで指定されたキャラクタ・セットとして処理されます。NCHAR変数のサイズは、通常のCの変数と同様にバイト数で指定されます。
データをstrに入れるには、次の簡単な問合せを使用します。
EXEC SQL SELECT ENAME INTO :str FROM EMP WHERE DEPT = n'<Japanese_string1>';
また、strを次のSELECT文で使用することもできます。
EXEC SQL SELECT DEPT INTO :dept FROM DEPT_TAB WHERE ENAME = :str;
Pro*C/C++では、NLS_LOCAL=NOの場合に、データベース・サポートとともに各国語キャラクタ・セットがサポートされます。NLS_LOCAL=NOで、新規の環境変数NLS_NCHARが有効な各国語キャラクタ・セットに設定されていれば、データベース・サーバーでNCHARがサポートされます。『Oracle Databaseリファレンス』のNLS_NCHARに関する項を参照してください。
NLS_NCHARでは、各国語キャラクタ・セット・データ(NCHAR、NVARCHAR2、NCLOB)に使用するキャラクタ・セットを指定します。キャラクタ・セットを指定しない場合は、定義済、あるいはNLS_LANGで間接的に定義済のキャラクタ・セットが使用されます。
NLS_NCHARには、プリコンパイル時と実行時に、有効な各国語キャラクタ・セット(言語名ではなく、NLS_LANGで設定)を指定する必要があります。SQLLIBでは、最初のSQL文の実行時にランタイム・チェックが実行されます。プリコンパイル時と実行時のキャラクタ・セットが異なっていると、SQLLIBからエラー・コードが戻されます。
EXEC SQL VAR文を使用すると、ホスト変数をOracleの外部データ型に同値化して、デフォルトの割当てを上書きできます。これはホスト変数の同値化と呼ばれます。
EXEC SQL VAR文には、オプション句CONVBUFSZ (<size>)
を使用できます。Oracleランタイム・ライブラリ内で、指定したホスト変数をキャラクタ・セット間で変換するためのバッファのサイズ<size>
をバイト単位で指定します。
新しい構文は、次のいずれかです。
EXEC SQL VAR host_variable IS datatype [CONVBUFSZ [IS] (size)] ;
または
EXEC SQL VAR host_variable [CONVBUFSZ [IS] (size)];
datatypeは次のとおりです。
type_name [ ( { length | precision, scale } ) ]
関連項目:
すべてのキーワード、例および変数の詳細は、VAR(Oracle埋込みSQLディレクティブ)を参照してください。
埋込みSQL文中のマルチバイト文字列は、その文字列をマルチバイトとして識別する文字リテラルと、後続の文字列で構成されます。文字列は、通常の一重引用符(')で囲みます。
たとえば、次のような埋込みSQL文があるとします。
EXEC SQL SELECT empno INTO :emp_num FROM emp WHERE ename = N'<Japanese_string>';
このSQL文には、マルチバイト文字列が含まれています(<Japanese_string>は、実際には漢字の可能性があります)。つまり、文字列の直前に文字リテラルNが付いているため、これはマルチバイト文字列として識別されます。Oracleでは大/小文字が区別されないため、この例ではnとNのどちらを使用してもかまいません。