Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere Embedded SQL » ホスト変数の使用

 

C ホスト変数型

ホスト変数として使用できる 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 のインタフェースのデータ型 説明
short              si;
short int          si;
DT_SMALLINT 16 ビット符号付き整数
unsigned short int usi;
DT_UNSSMALLINT 16 ビット符号なし整数
long              l;
long int          l;
DT_INT 32 ビット符号付き整数
unsigned long int ul;
DT_UNSINT 32 ビット符号なし整数
DECL_BIGINT       ll;
DT_BIGINT 64 ビット符号付き整数
DECL_UNSIGNED_BIGINT ull;
DT_UNSBIGINT 64 ビット符号なし整数
float f;
DT_FLOAT 4 バイト浮動小数点数
double d;
DT_DOUBLE 8 バイト浮動小数点数
char a[n]; /*n>=1*/
DT_STRING CHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。この変数には、n-1 バイトと NULL ターミネータが保持されます。
char *a;
DT_STRING CHAR 文字セット内の NULL で終了する文字列。この変数は、最大 32766 バイトと NULL ターミネータを保持できる領域を指します。
DECL_NCHAR a[n]; /*n>=1*/
DT_NSTRING NCHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。この変数には、n-1 バイトと NULL ターミネータが保持されます。
DECL_NCHAR *a;
DT_NSTRING NCHAR 文字セット内の NULL で終了する文字列。この変数は、最大 32766 バイトと NULL ターミネータを保持できる領域を指します。
DECL_VARCHAR(n) a;
DT_VARCHAR CHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。n の最大値は 32765 (バイト単位) です。
DECL_NVARCHAR(n) a;
DT_NVARCHAR NCHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。n の最大値は 32765 (バイト単位) です。
DECL_LONGVARCHAR(n) a;
DT_LONGVARCHAR CHAR 文字セット内の 4 バイトの長さフィールドを 3 つ持つ長い可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。
DECL_LONGNVARCHAR(n) a;
DT_LONGNVARCHAR NCHAR 文字セット内の 4 バイトの長さフィールドを 3 つ持つ長い可変長文字列。文字列は NULL で終了せず、ブランクも埋め込まれない。
DECL_BINARY(n) a;
DT_BINARY 2 バイトの長さフィールドを持つ可変長バイナリ・データ。n の最大値は 32765 (バイト単位) です。
DECL_LONGBINARY(n) a;
DT_LONGBINARY 4 バイトの長さフィールドを 3 つ持つ長い可変長バイナリ・データ。
char            a; /*n=1*/ 
DECL_FIXCHAR(n) a;
DT_FIXCHAR CHAR 文字セット内の固定長文字列。ブランクが埋め込まれますが、NULL で終了しません。n の最大値は 32767 (バイト単位) です。
DECL_NCHAR       a; /*n=1*/
DECL_NFIXCHAR(n) a;
DT_NFIXCHAR NCHAR 文字セット内の固定長文字列。ブランクが埋め込まれますが、NULL で終了しません。n の最大値は 32767 (バイト単位) です。
DECL_DATETIME a;
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 プリプロセッサに関しては、ホスト変数はソース・ファイルにおいてグローバルです。同じ名前のホスト変数は使用できません。