SQL 解説書

DESCRIBE

DESCRIBE ステートメントは、準備されたステートメントについての情報を入手します。 準備済みステートメントについては、PREPARE を参照してください。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に準備できない実行可能ステートメントです。

許可

権限は不要です。

構文

>>-DESCRIBE--statement-name--INTO--descriptor-name-------------><
 

説明

statement-name
その情報を入手する対象のステートメントを指定します。 DESCRIBE ステートメントを実行する時点で、 この名前はすでに準備済みのステートメントを指定するものでなければなりません。

INTO descriptor-name
SQL 記述子域 (SQLDA) を指定します (付録 C, SQL 記述子域 (SQLDA) を参照)。 DESCRIBE ステートメントを実行する前に、SQLDA 内の以下の変数を設定しておく必要があります。

SQLN
SQLVAR によって表示される変数の数を指定します。 (SQLVAR 配列の大きさは SQLN によって指定されます。) DESCRIBE ステートメントを実行する前に、SQLN にゼロ以上の値を設定する必要があります。

DESCRIBE ステートメントを実行すると、データベース・マネージャーは、 以下のように SQLDA の変数に値を割り当てます。

SQLDAID
最初の 6 バイトは 'SQLDA ' に設定されます (5 文字の英字の後、6 文字目はスペース文字です)。

第 7 バイト (SQLDOUBLED) は、 SQLDA において各選択リスト項目 (結果表の) につき SQLVAR 項目が 2 つずつ含まれている場合に、'2' に設定されます。 結果列として LOB、特殊タイプ、構造タイプ、または参照タイプを可能にするために、 このようになっています。 それ以外の場合、SQLDOUBLED はスペース文字に設定されます。

SQLDA の中に DESCRIBE の応答全体が入るだけのスペースがない場合、 ダブル・フラグはスペースに設定されます。

8 番目のバイトは、スペース文字に設定されます。

SQLDABC
SQLDA の長さ。

SQLD
もし作成済みステートメントが SELECT である場合は、 結果表の中の列数。それ以外の場合は 0。

SQLVAR
SQLD の値が 0 の場合、または SQLD の値が SQLN の値より大きい場合は、 SQLVAR のエレメントには値は割り当てられません。

SQLD の値が n (n は 0 より大きく、 SQLN の値以下) の場合、SQLVAR の最初のエレメントには結果表の最初の列に関する記述が入り、 SQLVAR の 2 番目のエレメントには結果表の 2 番目の列に関する記述が入るというように、 SQLVAR の最初の n 個のエレメントに値が割り当てられます。 1 つの列の記述は、 SQLTYPE、 SQLLEN、 SQLNAME、 SQLLONGLEN、 および SQLDATATYPE_NAME に割り当てられている値で構成されます。

基本 SQLVAR

SQLTYPE
列のデータ・タイプと、その列にヌル値が入るかどうかを示すコード。

SQLLEN
結果列のデータ・タイプによって決まる長さを示す値。 LOB データ・タイプの場合、SQLLEN は 0 になります。

SQLNAME
派生された列が単一の列参照でない場合、 sqlname には派生された列の選択リスト内での元の位置を表す ASCII 数値リテラル値が入ります。 それ以外の場合、sqlname には列の名前が入ります。

副次 SQLVAR

これらの変数は、LOB、特殊タイプ、構造タイプ、または参照タイプの列を含めることができるよう、 SQLVAR の項目の数が 2 倍にされた場合にのみ使用されます。

SQLLONGLEN
BLOB、CLOB、または DBCLOB の列の長さ属性。

SQLDATATYPE_NAME
データベース・マネージャーは、すべてのユーザー定義タイプ (特殊タイプまたは構造タイプ) の列で、 この名前を完全修飾ユーザー定義タイプ名に設定します。 また、参照タイプの列では、 この名前を参照のターゲット・タイプの完全修飾ユーザー定義タイプ名に設定します。 それ以外の場合、スキーマ名は SYSIBM となり、 タイプ名は SYSCAT.DATATYPES カタログ視点の TYPENAME 列に含まれている名前になります。

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;
  .
  .
  .


脚注:

91
上記の正の SQLCODE の戻り値は、 SQLWARN バインド・オプションが YES (正の SQLCODE を戻す) に設定されていることが前提となっています。 SQLWARN が NO に設定されている場合でも +238 が戻されて、 SQLVAR 項目の数が SQLD の戻り値の 2 倍でなければならないことを示します。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]