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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー プログラミング » Embedded SQL

 

Embedded SQL のデータ型

プログラムとデータベースサーバー間で情報を転送するには、それぞれのデータについてデータ型を設定します。Embedded SQL データ型定数の前には DT_ が付けられ、sqldef.h ヘッダーファイル内にあります。ホスト変数はサポートされるどのデータ型についても作成できます。これらのデータ型は、データをデータベースと受け渡しするために SQLDA 構造体で使用することもできます。

これらのデータ型の変数を定義するには、sqlca.h にリストされている DECL_ マクロを使用します。たとえば、変数が BIGINT 値を保持する場合は DECL_BIGINT と宣言できます。

次のデータ型が、Embedded SQL プログラミングインターフェイスでサポートされます。

  • DT_BIT   8 ビット符号付き整数

  • DT_SMALLINT   16 ビット符号付き整数

  • DT_UNSSMALLINT   16 ビット符号なし整数

  • DT_TINYINT   8 ビット符号付き整数。

  • DT_BIGINT   64 ビット符号付き整数

  • DT_UNSBIGINT   64 ビット符号なし整数

  • DT_INT   32 ビット符号付き整数

  • DT_UNSINT   32 ビット符号なし整数

  • DT_FLOAT   4 バイト浮動小数点数。

  • DT_DOUBLE   8 バイト浮動小数点数。

  • DT_DECIMAL   パック 10 進数 (独自フォーマット)
    typedef struct TYPE_DECIMAL {
      char array[1];
    } TYPE_DECIMAL;

  • DT_STRING   CHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。

  • DT_NSTRING   NCHAR 文字セット内の NULL で終了する文字列。データベースがブランクを埋め込まれた文字列で初期化されると、文字列にブランクが埋め込まれます。

  • DT_DATE   有効な日付データを含み、NULL で終了する文字列

  • DT_TIME   有効な時間データを含み、NULL で終了する文字列

  • DT_TIMESTAMP   有効なタイムスタンプを含み、NULL で終了する文字列

  • DT_FIXCHAR   CHAR 文字セット内のブランクが埋め込まれた固定長文字列。最大長は 32767 で、バイト単位で指定します。データは、NULL で終了しません。

  • DT_NFIXCHAR   NCHAR 文字セット内のブランクが埋め込まれた固定長文字列。最大長は 32767 で、バイト単位で指定します。データは、NULL で終了しません。

  • DT_VARCHAR   CHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。最大長は 32765 バイトです。データを送信する場合は、長さフィールドに値を設定してください。データをフェッチする場合は、データベースサーバーが長さフィールドに値を設定します。データは NULL で終了せず、ブランクも埋め込まれません。
    typedef struct VARCHAR {
     a_sql_ulen len;
     char       array[1];
    } VARCHAR;

  • DT_NVARCHAR   NCHAR 文字セット内の 2 バイトの長さフィールドを持つ可変長文字列。最大長は 32765 バイトです。データを送信する場合は、長さフィールドに値を設定してください。データをフェッチする場合は、データベースサーバーが長さフィールドに値を設定します。データは NULL で終了せず、ブランクも埋め込まれません。
    typedef struct NVARCHAR {
     a_sql_ulen len;
     char       array[1];
    } NVARCHAR;

  • DT_LONGVARCHAR   CHAR 文字セット内の長い可変長文字列
    typedef struct LONGVARCHAR {
     a_sql_uint32 array_len;  /* number of allocated bytes in array */
     a_sql_uint32 stored_len; /* number of bytes stored in array
                               * (never larger than array_len) */
     a_sql_uint32 untrunc_len;/* number of bytes in untruncated expression
                               * (may be larger than array_len) */
     char         array[1];   /* the data */
    } LONGVARCHAR, LONGNVARCHAR, LONGBINARY;

    32767 バイトを超えるデータには、LONGVARCHAR 構造体を使用できます。このように大きいデータの場合は、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバーに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。データは NULL で終了せず、ブランクも埋め込まれません。

  • DT_LONGNVARCHAR   NCHAR 文字セット内の長い可変長文字列。マクロによって、構造体が次のように定義されます。
    typedef struct LONGVARCHAR {
     a_sql_uint32 array_len;  /* number of allocated bytes in array */
     a_sql_uint32 stored_len; /* number of bytes stored in array
                               * (never larger than array_len) */
     a_sql_uint32 untrunc_len;/* number of bytes in untruncated expression
                               * (may be larger than array_len) */
     char         array[1];   /* the data */
    } LONGVARCHAR, LONGNVARCHAR, LONGBINARY;

    32767 バイトを超えるデータには、LONGNVARCHAR 構造体を使用できます。このように大きいデータの場合は、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバーに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。データは NULL で終了せず、ブランクも埋め込まれません。

  • DT_BINARY   2 バイトの長さフィールドを持つ可変長バイナリデータ。最大長は 32765 バイトです。データベースサーバーに情報を渡す場合は、長さフィールドを設定してください。データベースサーバーから情報をフェッチする場合は、サーバーが長さフィールドを設定します。
    typedef struct BINARY {
     a_sql_ulen len;
     char       array[1];
    } BINARY;

  • DT_LONGBINARY   長いバイナリデータ。マクロによって、構造体が次のように定義されます。
    typedef struct LONGVARCHAR {
     a_sql_uint32 array_len;  /* number of allocated bytes in array */
     a_sql_uint32 stored_len; /* number of bytes stored in array
                               * (never larger than array_len) */
     a_sql_uint32 untrunc_len;/* number of bytes in untruncated expression
                               * (may be larger than array_len) */
     char         array[1];   /* the data */
    } LONGVARCHAR, LONGNVARCHAR, LONGBINARY;

    32767 バイトを超えるデータには、LONGBINARY 構造体を使用できます。このように大きいデータの場合は、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバーに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。

  • DT_TIMESTAMP_STRUCT   タイムスタンプの各部分に対応するフィールドを持つ SQLDATETIME 構造体


    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 構造体は、型が DATE、TIME、TIMESTAMP (または、いずれかの型に変換できるもの) のフィールドを取り出すのに使用できます。アプリケーションは、日付に関して独自のフォーマットで処理をすることがありますが、この構造体を使ってデータをフェッチすると、以後の操作が簡単になります。この構造体の中のデータをフェッチすると、このデータを簡単に操作できます。また、型が DATE、TIME、TIMESTAMP のフィールドは、文字型であれば、どの型でもフェッチと更新が可能です。

    SQLDATETIME 構造体を介してデータベースに日付、時刻、またはタイムスタンプを入力しようとすると、day_of_year と day_of_week メンバーは無視されます。

  • DT_VARIABLE   NULL で終了する文字列。文字列は SQL 変数名です。その変数の値をデータベースサーバーが使用します。このデータ型はデータベースサーバーにデータを与えるときにだけ使用されます。データベースサーバーからデータをフェッチするときには使用できません。

これらの構造体は sqlca.h ファイルに定義されています。VARCHAR、NVARCHAR、BINARY、DECIMAL、LONG の各データ型は、データ格納領域が長さ 1 の文字配列のため、ホスト変数の宣言には向いていません。しかし、動的な変数の割り付けや他の変数の型変換を行うのには有効です。

 データベースの DATE 型と TIME 型
 参照