ホスト変数として使用できる C のデータ型は非常に限られています。また、ホスト変数の型には、対応する C の型がないものもあります。
sqlca.h ヘッダ・ファイルに定義されているマクロを使用すると、NCHAR、VARCHAR、NVARCHAR、LONGVARCHAR、LONGNVARCHAR、BINARY、LONGBINARY、DECIMAL、FIXCHAR、NFIXCHAR、DATETIME (SQLDATETIME)、BIT、BIGINT、または UNSIGNED BIGINT 型のホスト変数を宣言できます。マクロは次のように使用します。
EXEC SQL BEGIN DECLARE SECTION; DECL_NCHAR v_nchar[10]; DECL_VARCHAR( 10 ) v_varchar; DECL_NVARCHAR( 10 ) v_nvarchar; DECL_LONGVARCHAR( 32768 ) v_longvarchar; DECL_LONGNVARCHAR( 32768 ) v_longnvarchar; DECL_BINARY( 4000 ) v_binary; DECL_LONGBINARY( 128000 ) v_longbinary; DECL_DECIMAL( 30, 6 ) v_decimal; DECL_FIXCHAR( 10 ) v_fixchar; DECL_NFIXCHAR( 10 ) v_nfixchar; DECL_DATETIME v_datetime; DECL_BIT v_bit; DECL_BIGINT v_bigint; DECL_UNSIGNED_BIGINT v_ubigint; EXEC SQL END DECLARE SECTION; |
プリプロセッサは宣言セクション内のこれらのマクロを認識し、変数を適切な型として処理します。10 進数のフォーマットは独自フォーマットであるため、DECIMAL (DT_DECIMAL, DECL_DECIMAL) 型を使用しないことをおすすめします。
次の表は、ホスト変数で使用できる C 変数の型と、対応する Embedded SQL インタフェースのデータ型を示します。
C データ型 | Embedded SQL のインタフェースのデータ型 | 説明 | ||
---|---|---|---|---|
|
DT_SMALLINT | 16 ビット符号付き整数 | ||
|
DT_UNSSMALLINT | 16 ビット符号なし整数 | ||
|
DT_INT | 32 ビット符号付き整数 | ||
|
DT_UNSINT | 32 ビット符号なし整数 | ||
|
DT_BIGINT | 64 ビット符号付き整数 | ||
|
DT_UNSBIGINT | 64 ビット符号なし整数 | ||
|
DT_FLOAT | 4 バイト浮動小数点数 | ||
|
DT_DOUBLE | 8 バイト浮動小数点数 | ||
|
DT_STRING | CHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。この変数には、n-1 バイトと NULL ターミネータが保持されます。 | ||
|
DT_STRING | CHAR 文字セット内の NULL で終了する文字列。この変数は、最大 32766 バイトと NULL ターミネータを保持できる領域を指します。 | ||
|
DT_NSTRING | NCHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。この変数には、n-1 バイトと NULL ターミネータが保持されます。 | ||
|
DT_NSTRING | NCHAR 文字セット内の NULL で終了する文字列。この変数は、最大 32766 バイトと NULL ターミネータを保持できる領域を指します。 | ||
|
DT_VARCHAR | CHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。n の最大値は 32765 (バイト単位) です。 | ||
|
DT_NVARCHAR | NCHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。n の最大値は 32765 (バイト単位) です。 | ||
|
DT_LONGVARCHAR | CHAR 文字セット内の 4 バイトの長さフィールドを 3 つ持つ長い可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。 | ||
|
DT_LONGNVARCHAR | NCHAR 文字セット内の 4 バイトの長さフィールドを 3 つ持つ長い可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。 | ||
|
DT_BINARY | 2 バイトの長さフィールドを持つ可変長バイナリ・データ。n の最大値は 32765 (バイト単位) です。 | ||
|
DT_LONGBINARY | 4 バイトの長さフィールドを 3 つ持つ長い可変長バイナリ・データ。 | ||
|
DT_FIXCHAR | CHAR 文字セット内の固定長文字列。ブランクが埋め込まれますが、NULL で終了しません。n の最大値は 32767 (バイト単位) です。 | ||
|
DT_NFIXCHAR | NCHAR 文字セット内の固定長文字列。ブランクが埋め込まれますが、NULL で終了しません。n の最大値は 32767 (バイト単位) です。 | ||
|
DT_TIMESTAMP_STRUCT | SQLDATETIME 構造体 |
DT_FIXCHAR、DT_STRING、DT_VARCHAR、DT_LONGVARCHAR の場合、文字データはアプリケーションの CHAR 文字セット内にあります。この文字セットは、通常、アプリケーションのロケールの文字セットです。アプリケーションでは、CHARSET 接続パラメータを使用するか、db_change_char_charset 関数を呼び出すことで CHAR 文字セットを変更できます。
DT_NFIXCHAR、DT_NSTRING、DT_NVARCHAR、DT_LONGNVARCHAR の場合、文字データはアプリケーションの NCHAR 文字セット内にあります。デフォルトでは、アプリケーションの NCHAR 文字セットは CHAR 文字セットと同じです。アプリケーションでは、db_change_nchar_charset 関数を呼び出すことで NCHAR 文字セットを変更できます。
ロケールと文字セットの詳細については、ロケールの知識を参照してください。
CHAR 文字セットの変更の詳細については、CharSet 接続パラメータ [CS]またはdb_change_char_charset 関数を参照してください。
NCHAR 文字セットの変更の詳細については、db_change_nchar_charset 関数を参照してください。
使用している CHAR や NCHAR 文字セットに関係なく、すべてのデータ長はバイトで指定します。
サーバとアプリケーションの間で文字セットを変換する場合は、変換されたデータを処理するためのバッファが十分に確保されていることを確認し、データがトランケートされた場合に追加の GET DATA 文を発行するのはアプリケーション側の責任です。
「pointer to char」 (char * a) として宣言されたホスト変数は、データベース・インタフェースでは 32767 バイトの長さであると見なされます。pointer to char 型のホスト変数を使用してデータベースから情報を取り出す場合は、ポインタの指すバッファを、データベースから返ってくる可能性のある値を格納するのに十分な大きさにしてください。
これはかなりの危険性があります。プログラムが作成された後でデータベースのカラムの定義が変更され、カラムのサイズが大きくなっている可能性があるからです。そうなると、ランダム・メモリが破壊される可能性があります。関数のパラメータに pointer to char を渡す場合でも、配列を宣言して使用する方が安全です。この方法により、Embedded SQL 文で配列のサイズを知ることができます。
標準のホスト変数の宣言セクションは、C 変数を宣言できる通常の場所であれば、どこにでも記述できます。C の関数のパラメータの宣言セクションにも記述できます。C 変数は通常のスコープを持っています (定義されたブロック内で使用可能)。ただし、SQL プリプロセッサは C コードをスキャンしないため、C ブロックを重視しません。
SQL プリプロセッサに関しては、ホスト変数はソース・ファイルにおいてグローバルです。同じ名前のホスト変数は使用できません。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |