30.8. 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 (integer)

結果集合内の行数です。

DATA

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

DATETIME_INTERVAL_CODE (integer)

?

DATETIME_INTERVAL_PRECISION (integer)

未実装です。

INDICATOR (integer)

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

KEY_MEMBER (integer)

未実装です。

LENGTH (integer)

データの文字数です。

NAME (string)

列名です。

NULLABLE (integer)

未実装です。

OCTET_LENGTH (integer)

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

PRECISION (integer)

(numeric型用の)精度です。

RETURNED_LENGTH (integer)

データの文字数です。

RETURNED_OCTET_LENGTH (integer)

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

SCALE (integer)

(numeric型用の)桁です。

TYPE (integer)

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