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はリテラル整数、もしくは、整数を持つホスト変数をとることができます。 とり得るフィールドは以下の通りです。
結果集合内の行数です。
実際のデータ項目です。 (従ってこのフィールドのデータ型は問い合わせに依存します。)
?
未実装です。
(NULL値や値の切り詰めを示す)指示子です。
未実装です。
データの文字数です。
列名です。
未実装です。
データの文字表現のバイト長です。
(numeric型用の)精度です。
データの文字数です。
データの文字表現のバイト長です。
(numeric型用の)桁です。
列のデータ型の数値コードです。