SQL記述子領域の使用

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 29章ECPG - C言語による埋め込みSQL | 早送り | 次のページ

# 29.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)

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

前のページ | ホーム | 次のページ
動的 SQL | 上に戻る | エラーの扱い