SQLGetTypeInfo - データ・タイプ情報の入手

SQLGetTypeInfo() は、Db2 for i CLI に関連付けられたデータベース管理システム (DBMS) でサポートされているデータ型に関する情報を返します。 その情報は、SQL 結果セットに戻されます。 照会を処理するのに使うのと同じ関数を使って、 列を受け取ることができます。

対応する Unicode (UTF-16) 関数: この関数は Unicode (UTF-16) 文字セットでも使用できます。 対応する Unicode 関数は SQLGetTypeInfoW( です。) DB2® CLI の Unicode サポートの詳細については、 Db2 for i CLI の Unicode を参照してください。

構文

SQLRETURN   SQLGetTypeInfo   (SQLHSTMT          StatementHandle,
                              SQLSMALLINT       DataType);

関数引数

表 1. SQLGetTypeInfo の引数
データ・タイプ 引数 Use 説明
SQLHSTMT StatementHandle 入力 ステートメント・ハンドル
SQLSMALLINT DataType 入力 照会対象の SQL データ・タイプ。 サポートされているタイプは以下のとおりです。
  • SQL_ALL_TYPES
  • SQL_BIGINT
  • SQL_BINARY
  • SQL_BLOB
  • SQL_BOOLEAN
  • SQL_CHAR
  • SQL_CLOB
  • SQL_DATE
  • SQL_DBCLOB
  • SQL_DECFLOAT
  • SQL_DECIMAL
  • SQL_DOUBLE
  • SQL_FLOAT
  • SQL_GRAPHIC
  • SQL_INTEGER
  • SQL_NUMERIC
  • SQL_REAL
  • SQL_SMALLINT
  • SQL_TIME
  • SQL_TIMESTAMP
  • SQL_VARBINARY
  • SQL_VARCHAR
  • SQL_VARGRAPHIC

SQL_ALL_TYPES を指定すると、 サポートされているデータ・タイプに関するすべての情報が、 TYPE_NAME 別の昇順で戻されます。 結果セットには、 サポートされていないどのデータ・タイプも入っていません。

使用法

SQLGetTypeInfo() は、結果セットを生成しますが、 照会の実行と同じなので、カーソルを生成してトランザクションを開始します。 このステートメント・ハンドル上で別のステートメントを準備作成して処理するには、このカーソルをクローズしなければなりません。

SQLGetTypeInfo() が無効な DataType を指定して呼び出されると、空の結果セットが戻されます。

この関数によって生成される結果セットの列は、以下の表に示すとおりである。

今後のリリースでは、新しい列が追加されたり、 既存の列が変更されたりする可能性はありますが、 現行列の位置は変更されません。 戻されるデータ・タイプは、 CREATE TABLE、ALTER TABLE、DDL ステートメント内で使用できるものです。 非持続データ・タイプは、戻される結果セット内には含まれません。 ユーザー定義のデータ・タイプも戻されません。

表 2. SQLGetTypeInfo によって戻される列
列番号/列名 データ・タイプ 説明
1 TYPE_NAME VARCHAR(128) NOT NULL SQL データ・タイプ名の文字による表示 (例: VARCHAR、DATE、INTEGER)。
2 DATA_TYPE SMALLINT NOT NULL SQL データ・タイプ定義値 (例: SQL_VARCHAR、SQL_DATE、SQL_INTEGER)。
3 COLUMN_SIZE INTEGER データ・タイプが文字または 2 進ストリングの場合、この列には、 バイト数の最大長が入ります。また、グラフィック (DBCS) ストリングの場合は、 この列の 2 バイト文字数になります。

日付、時刻、タイム・スタンプのデータ・タイプの場合、これは、 文字への変換後に値を表示するのに必要な合計文字数になります。

数値データ・タイプの場合、これは、合計桁数になります。

4 LITERAL_PREFIX VARCHAR(128) DB2 がこのデータ・タイプのリテラルの接頭部として認識する文字。 リテラルの接頭部が適用されない場合、 この列のデータ・タイプは NULL になります。
5 LITERAL_SUFFIX VARCHAR(128) DB2 がこのデータ・タイプのリテラルの接尾部として認識する文字。 リテラルの接頭部が適用されない場合、 この列のデータ・タイプは NULL になります。
6 CREATE_PARAMS VARCHAR(128) この列のテキストには、コンマで区切られたキーワード・リストが入ります。それらのキーワードは、アプリケーション・プログラムが、SQL におけるデータ・タイプとして TYPE_NAME 列内の名前を使うときに、小括弧で囲んで指定できる各パラメーターに対応します。 このリスト内のキーワードは、LENGTH、PRECISION、SCALE のいずれかになります。 キーワードは、 SQL 構文に定められている使用順序で並んでいます。

データ・タイプ定義 (INTEGER など) 用のパラメーターがない場合、 NULL 標識が戻されます。

注: CREATE_PARAMS の目的は、アプリケーションが DDL ビルダーのインターフェースをカスタマイズできるようにすることです。 アプリケーション・プログラムは、これを使うときは、 データ・タイプを定義するのに必要な引数の数を指定したり、 編集制御にラベルを付けるのに使用できるローカライズされたテキストを備えたりすることしかできないことを承知しておく必要があります。
7 NULLABLE SMALLINT NOT NULL データ・タイプに NULL 値を使用できるかどうかを示します。
  • NULL 値を禁止するには SQL_NO_NULLS に設定します。
  • NULL 値を許可するには SQL_NULLABLE に設定します。
  • NULL 値が許可されているかどうかが分からない場合は、 SQL_NULLABLE_UNKNOWN に設定します。
8 CASE_SENSITIVE SMALLINT NOT NULL データ・タイプを、照合目的で大文字小文字の区別があるものとして扱えるかどうかを示します。有効な値は SQL_TRUE または SQL_FALSE です。
9 SEARCHABLE SMALLINT NOT NULL WHERE 文節内でのデータ・タイプの使用法を示します。 有効な値は以下のとおりです。
  • SQL_UNSEARCHABLE - WHERE 文節内でデータ・タイプが使用できない場合。
  • SQL_LIKE_ONLY - LIKE 述部を付けた場合にのみ、WHERE 文節内でデータ・タイプを使用できる場合。
  • SQL_ALL_EXCEPT_LIKE - LIKE 以外のすべての比較演算子と一緒に WHERE 文節内でデータ・タイプを使用できる場合。
  • SQL_SEARCHABLE - どの比較演算子と一緒でも WHERE 文節内でデータ・タイプを使用できる場合。
10 UNSIGNED_ATTRIBUTE SMALLINT データ・タイプが符号なしかどうかを示します。 有効値は SQL_TRUE、SQL_FALSE、または NULL です。 この属性が適用されないデータ・タイプの場合、NULL 標識が戻されます。
11 FIXED_PREC_SCALE SMALLINT NOT NULL データ・タイプが、厳密な数値であって、常に同じ精度と位取りをもつ場合、値 SQL_TRUE が入ります。そうでなければ、SQL_FALSE が入ります。
12 AUTO_UNIQUE_VAL SMALLINT 行の挿入時に、このデータ・タイプの列が自動的に固有値に設定される場合は、SQL_TRUE が入ります。そうでなければ、SQL_FALSE が入ります。
13 LOCAL_TYPE_NAME VARCHAR(128)

この列には、 データ・タイプの通常名とは異なるローカライズされた任意のデータ・タイプ名が入ります。 ローカライズされた名前がない場合、この列は NULL になります。

この列は表示用でしかありません。 ストリングの文字セットはロケールに準じますが、 通常は、データベースのデフォルトの文字セットになります。

14 MINIMUM_SCALE INTEGER SQL データ・タイプの最小の位取り。 データ・タイプに固定の位取りがある場合、 MINIMUM_SCALE 列と MAXIMUM_SCALE 列の両方に同じ値が入ります。 位取りが該当しない場合は、NULL が戻されます。
15 MAXIMUM_SCALE INTEGER SQL データ・タイプの最大の位取り。 位取りが該当しない場合は、NULL が戻されます。 最大の位取りを DBMS に別個に定義せずに、 列の最大長と同じ値で定義する場合、 この列には COLUMN_SIZE 列と同じ値が入ります。
16 SQL_DATA_TYPE SMALLINT NOT NULL 記述子の SQL_DESC_TYPE フィールドに現れるとおりの、SQL データ・タイプの値。 この列は DATA_TYPE 列と同じです (ただし、 Db2 for i CLI がサポートしていない間隔および日時のデータ・タイプを除きます)。
17 SQL_DATETIME_SUB SMALLINT このフィールドは常に NULL です (Db2 for i CLI は、間隔データ・タイプおよび日時データ・タイプをサポートしません)。
18 NUM_PREC_RADIX INTEGER データ・タイプが推定の数値タイプである場合、 この列には値 2 が入り、COLUMN_SIZE がビットの数値を指定することを示します。 厳密な数値タイプである場合、 この列には値 10 が入り、 COLUMN_SIZE が 10 進数の数値を指定することを示します。 それ以外の場合、この列は NULL です。
19 INTERVAL_PRECISION SMALLINT このフィールドは常に NULL です (Db2 for i CLI は間隔データ・タイプをサポートしません)。

戻りコード

  • SQL_SUCCESS
  • SQL_ERROR
  • SQL_INVALID_HANDLE

エラー状況

テーブル3。 SQLGetTypeInfo SQLSTATE
SQLSTATE 説明 説明
24000 カーソル状態が無効 カーソルは、ステートメント・ハンドル上ですでにオープンしています。 StatementHandle はまだクローズされていません。
40003 08S01 通信リンク障害 関数の完了前に、アプリケーション・プログラムとデータ・ソースの間の通信リンクに障害が起こりました。
HY001 メモリーの割り振りの失敗 Db2 for i CLI は、関数の処理または完了をサポートするために必要なメモリーを割り振ることができません。
HY004 SQL データ・タイプが範囲外 無効な DataType が指定されています。
HY010 年 関数シーケンス・エラー data-at-processing (SQLParamData()SQLPutData()) の操作中に関数を呼び出しました。

HY021

内部記述子が無効

内部記述子がアドレッシングできない、割り振れない、または無効な値を持っています。

HYT00 タイムアウト満了  

制約事項

以下の ODBC 指定の SQL データ・タイプ (およびそれに対応する DataType 定義値) は、どの IBM® RDBMS でもサポートされていません。
データ・タイプ DataType
TINY INT SQL_TINYINT
BIT SQL_BIT

注: コード例を使用すると、 コード・ライセンスおよび特記事項の条件に同意したことになります。
/* From CLI sample typeinfo.c */
/* ... */
    rc = SQLGetTypeInfo(hstmt, SQL_ALL_TYPES);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 1, SQL_C_CHAR, (SQLPOINTER) typename.s, 128, &typename.ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 2, SQL_C_DEFAULT, (SQLPOINTER) & datatype,
                    sizeof(datatype), &datatype_ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 3, SQL_C_DEFAULT, (SQLPOINTER) & precision,
                    sizeof(precision), &precision_ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 7, SQL_C_DEFAULT, (SQLPOINTER) & nullable,
                    sizeof(nullable), &nullable_ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 8, SQL_C_DEFAULT, (SQLPOINTER) & casesens,
                    sizeof(casesens), &casesens_ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    printf("Datatype                  Datatype Precision  Nullable   Case\n");
    printf("Typename                   (int)                       Sensitive\n");
    printf("------------------------- -------- ---------- -------- ---------\n");
    /* LONG VARCHAR FOR BIT DATA      99  2147483647   FALSE    FALSE */
    /* Fetch each row, and display */
    while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) {
        printf("%-25s ", typename.s);
        printf("%8d ", datatype);
        printf("%10ld ", precision);
        printf("%-8s ", truefalse[nullable]);
        printf("%-9s\n", truefalse[casesens]);
    }                           /* endwhile */
 
    if ( rc != SQL_NO_DATA_FOUND )
       CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 

参照