DESCRIBE ステートメントは、準備されたステートメントについての情報を入手します。 準備済みステートメントについては、PREPARE を参照してください。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に準備できない実行可能ステートメントです。
許可
権限は不要です。
構文
>>-DESCRIBE--statement-name--INTO--descriptor-name-------------><
説明
DESCRIBE ステートメントを実行すると、データベース・マネージャーは、 以下のように SQLDA の変数に値を割り当てます。
第 7 バイト (SQLDOUBLED) は、 SQLDA において各選択リスト項目 (結果表の列) につき SQLVAR 項目が 2 つずつ含まれている場合に、'2' に設定されます。 結果列として LOB、特殊タイプ、構造タイプ、または参照タイプを可能にするために、 このようになっています。 それ以外の場合、SQLDOUBLED はスペース文字に設定されます。
SQLDA の中に DESCRIBE の応答全体が入るだけのスペースがない場合、 ダブル・フラグはスペースに設定されます。
8 番目のバイトは、スペース文字に設定されます。
SQLD の値が n (n は 0 より大きく、 SQLN の値以下) の場合、SQLVAR の最初のエレメントには結果表の最初の列に関する記述が入り、 SQLVAR の 2 番目のエレメントには結果表の 2 番目の列に関する記述が入るというように、 SQLVAR の最初の n 個のエレメントに値が割り当てられます。 1 つの列の記述は、 SQLTYPE、 SQLLEN、 SQLNAME、 SQLLONGLEN、 および SQLDATATYPE_NAME に割り当てられている値で構成されます。
基本 SQLVAR
副次 SQLVAR
これらの変数は、LOB、特殊タイプ、構造タイプ、または参照タイプの列を含めることができるよう、 SQLVAR の項目の数が 2 倍にされた場合にのみ使用されます。
SQLDA とともにロケーターとファイル参照変数を使用する方法の詳細については、 アプリケーション開発の手引き を参照してください。
方式 1: アプリケーションで処理する必要のある選択リストが入るだけの十分な数の SQLVAR のオカレンスを含む SQLDA を割り振ります。 表に LOB、特殊タイプ、構造タイプ、または参照タイプの列が含まれている場合には、 SQLVAR の数を最大列数の 2 倍にしてください。 それ以外の場合は、その数を最大列数と同じにします。 割り振りを行ったなら、アプリケーションでこの SQLDA を繰り返し使用できるようになります。
このテクニックでは、大量の記憶域を使用し、 その記憶域のほとんどが特定の選択リストで使用されるわけではない場合でも決して割り振り解除されることがありません。
方式 2: 選択リストを処理するたびに、以下の 2 つのステップを繰り返し実行します。
この方式では、方式 1 よりも記憶域を効率的に管理できます。 しかし、DESCRIBE ステートメントの数は 2 倍になります。
方式 3: 選択リストのほとんど (そしておそらくは全部) が入るほどの ある程度の大きさではあるが、適度に小さい SQLDA を割り振ります。 DESCRIBE を実行して SQLD 値を調べます。 必要なら、SQLVAR のオカレンス数として SQLD 値を使用することにより、 もっと大きな SQLDA を割り振ります。
この方式は、最初の 2 つの方式の折衷方式です。 その効果は、元の SQLDA サイズを適切に選択することに依存しています。
例
C プログラムの中で、SQLVAR オカレンスのない SQLDA を指定して DESCRIBE ステートメントを実行します。 SQLD が 0 より大きい場合、 その値を使って必要な数の SQLVAR のオカレンスを含む SQLDA を割り振り、 その SQLDA を使って DESCRIBE ステートメントを実行します。
EXEC SQL BEGIN DECLARE SECTION; char stmt1_str[200]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLDA; EXEC SQL DECLARE DYN_CURSOR CURSOR FOR STMT1_NAME; ... /* code to prompt user for a query, then to generate */ /* a select-statement in the stmt1_str */ EXEC SQL PREPARE STMT1_NAME FROM :stmt1_str; ... /* code to set SQLN to zero and to allocate the SQLDA */ EXEC SQL DESCRIBE STMT1_NAME INTO :sqlda; ... /* code to check that SQLD is greater than zero, to set */ /* SQLN to SQLD, then to re-allocate the SQLDA */ EXEC SQL DESCRIBE STMT1_NAME INTO :sqlda; ... /* code to prepare for the use of the SQLDA */ /* and allocate buffers to receive the data */ EXEC SQL OPEN DYN_CURSOR; ... /* loop to fetch rows from result table */ EXEC SQL FETCH DYN_CURSOR USING DESCRIPTOR :sqlda; . . .