31.10. SQL記述子領域の使用

SQL記述子領域は、SELECT文やFETCH文の結果を処理する、より洗練された手法です。 SQL記述子領域は、1行のデータをメタデータ項目と一緒に1つのデータ構造体としてグループ化します。 特に動的SQL文を実行する場合は結果列の性質が前もってわかりませんので、メタデータが有用です。

SQL記述子領域は、記述子全体に関する情報を持つヘッダと、基本的に結果行内の1つの列を記述する、1つ以上の項目記述子領域から構成されます。

SQL記述子領域を使用可能にするためには、それを以下のように割り当てなければなりません。

EXEC SQL ALLOCATE DESCRIPTOR identifier;

このidentifierは記述子領域の"変数名"として使用されます。 記述子が不要になったら、以下のように解放してください。

EXEC SQL DEALLOCATE DESCRIPTOR identifier;

記述子領域を使用するには、INTO句内の格納対象として、ホスト変数を列挙するのではなく、記述子領域を指定してください。

EXEC SQL FETCH NEXT FROM mycursor INTO DESCRIPTOR mydesc;

さて、どうやって記述子領域からデータを取り出すのでしょうか。 この記述子領域を名前付きフィールドを持つ構造体とみなすことができます。 ヘッダからフィールド値を取り出し、それをホスト変数に格納するには、以下のコマンドを使用します。

EXEC SQL GET DESCRIPTOR name :hostvar = field;

今のところ、COUNTというヘッダフィールドが1つだけ定義されています。 これは、記述子領域に存在する項目数を表すものです (つまり、結果内に含まれる列数です)。 このホスト変数は整数型でなければなりません。 項目記述子領域からフィールドを取り出すには、以下のコマンドを使用します。

EXEC SQL GET DESCRIPTOR name VALUE num :hostvar = field;

numはリテラル整数、もしくは整数を持つホスト変数をとることができます。 取り得るフィールドは以下の通りです。

CARDINALITY (整数)

結果集合内の行数です。

DATA

実際のデータ項目です (したがってこのフィールドのデータ型は問い合わせに依存します)。

DATETIME_INTERVAL_CODE (整数)

DATETIME_INTERVAL_PRECISION (整数)

未実装です。

INDICATOR (整数)

(NULL値や値の切り詰めを示す)指示子です。

KEY_MEMBER (整数)

未実装です。

LENGTH (整数)

データの文字数です。

NAME (文字列)

列名です。

NULLABLE (整数)

未実装です。

OCTET_LENGTH (整数)

データの文字表現のバイト長です。

PRECISION (整数)

numeric型用の)精度です。

RETURNED_LENGTH (整数)

データの文字数です。

RETURNED_OCTET_LENGTH (整数)

データの文字表現のバイト長です。

SCALE (整数)

numeric型用の)桁です。

TYPE (整数)

列のデータ型の数値コードです。