プログラムとデータベースサーバ間で情報を転送するには、それぞれのデータ項目についてデータ型を設定します。ホスト変数は、サポートされる任意のデータ型について作成できます。
ホスト変数として使用できる C のデータ型は非常に限られています。また、ホスト変数の型には、対応する C の型がないものもあります。
sqlca.h ヘッダファイルで定義されたマクロは、VARCHAR、FIXCHAR、BINARY、DECIMAL、または SQLDATETIME 型のホスト変数を宣言するのに使用できます。これらのマクロは次のように使用します。
EXEC SQL BEGIN DECLARE SECTION; DECL_VARCHAR( 10 ) v_varchar; DECL_FIXCHAR( 10 ) v_fixchar; DECL_BINARY( 4000 ) v_binary; DECL_DECIMAL( 10, 2 ) v_packed_decimal; DECL_DATETIME v_datetime; EXEC SQL END DECLARE SECTION; |
プリプロセッサは宣言セクション内のこれらのマクロを認識し、変数を適切な型として処理します。
次のデータ型が、Embedded SQL プログラミングインタフェースでサポートされます。
short int I; unsigned short int I; |
long int l; unsigned long int l; |
float f; |
double d; |
DECL_DECIMAL(p,s) typedef struct TYPE_DECIMAL { char array[1]; } TYPE_DECIMAL; |
char a[n]; /* n > 1 */ char *a; /* n = 2049 */ |
SQL プリプロセッサでは、「char のポインタ」は 2049 バイトの文字配列を指しており、この文字配列が 2048 文字と NULL ターミネータを十分に保持できるとみなされます。つまり、char* データ型は、CHAR(2048) SQL 型にマッピングされます。この制限を超えると、アプリケーションによるメモリ破損が発生する場合があります。
16 ビットコンパイラの場合、単純に 2049 バイトを確保するとプログラムのスタックオーバーフローを引き起こすこともあります。この問題を避けるため、宣言した配列を必要に応じて関数のパラメータとして使用し、SQL プリプロセッサに配列のサイズを通知するようにしてください。WCHAR と TCHAR も char と同じように機能します。
NULL で終了された Unicode、またはワイド文字列 文字ごとに 2 バイトの領域を占有するため、Unicode 文字を含めることができます。
WCHAR a[n]; /* n > 1 */ |
システムに依存し、NULL で終了された文字列 Unicode を使用するシステム (Windows Mobile など) では、TCHAR の文字セットは WCHAR と同じです。それ以外の場合、TCHAR は char と同じです。TCHAR データ型は、どちらかのシステムで文字列を自動的にサポートするように設計されています。
TCHAR a[n]; /* n > 1 */ |
char a; /* n = 1 */ DECL_FIXCHAR(n) a; /* n >= 1 */ |
2 バイトの長さフィールドを持つ可変長文字列 データベースサーバに情報を渡す場合は、長さフィールドを設定します。データベースサーバから情報をフェッチする場合は、サーバが長さフィールドを設定します (埋め込みは行われません)。
DECL_VARCHAR(n) a; /* n >= 1 */ typedef struct VARCHAR { a_sql_ulen len; TCHAR array[1]; } VARCHAR; |
2 バイトの長さフィールドを持つ可変長バイナリデータ データベースサーバに情報を渡す場合は、長さフィールドを設定します。データベースサーバから情報をフェッチする場合は、サーバが長さフィールドを設定します。
DECL_BINARY(n) a; /* n >= 1 */ typedef struct BINARY { a_sql_ulen len; unsigned char array[1]; } BINARY; |
タイムスタンプの各部分に対応するフィールドを持つ SQLDATETIME 構造体
DECL_DATETIME a; typedef struct SQLDATETIME { unsigned short year; /* for example: 1999 */ unsigned char month; /* 0-11 */ unsigned char day_of_week; /* 0-6, 0 = Sunday */ unsigned short day_of_year; /* 0-365 */ unsigned char day; /* 1-31 */ unsigned char hour; /* 0-23 */ unsigned char minute; /* 0-59 */ unsigned char second; /* 0-59 */ unsigned long microsecond; /* 0-999999 */ } SQLDATETIME; |
SQLDATETIME 構造体を介してデータベースに日付、時刻、またはタイムスタンプを入力しようとすると、day_of_year と day_of_week メンバーは無視されます。
DT_LONGVARCHAR 長い可変長文字データ。マクロによって、構造体が次のように定義されます。
#define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size+1];\ } |
32 KB を超えるデータには、DECL_LONGVARCHAR 構造体を使用できます。データは、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。データは、NULL で終了しません。
DT_LONGBINARY 長いバイナリデータ。マクロによって、構造体が次のように定義されます。
#define DECL_LONGBINARY( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size]; \ } |
32 KB を超えるデータには、DECL_LONGBINARY 構造体を使用できます。データは、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。
これらの構造体は %SQLANY16%\SDK\Include\sqlca.h ファイルに定義されています。VARCHAR 型、BINARY 型、TYPE_DECIMAL 型は、データ格納領域が長さ 1 の文字配列のため、ホスト変数の宣言には向いていません。しかし、動的な変数の割り付けや他の変数の型変換を行うのには有効です。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |