SQL 解説書

フィールドの説明

SQLDA は、4 つの変数と、 その後に SQLVAR と総称して呼ばれる変数の任意の数のオカレンスによって構成されています。 OPEN、FETCH、 EXECUTE、および CALL では、 SQLVAR の各オカレンスによってホスト変数が記述されます。 DESCRIBE と PREPARE では、 SQLVAR の各オカレンスによって結果表の列が記述されます。 SQLVAR の項目には、次の 2 つのタイプがあります。

  1. 基本 SQLVAR: これらの項目は常に存在します。 これらの項目には、データ・タイプのコード、長さ属性、列名、ホスト変数のアドレス、 および標識変数アドレスなどの列またはホスト変数に関する基本的な情報が入れられます。
  2. 副次 SQLVAR: これらの項目は、上記で概説した規則に従って SQLVAR 項目の数が 2 倍になった場合にのみ存在します。 ユーザー定義タイプ (特殊または構造) の場合は、ユーザー定義タイプ名が入ります。 参照タイプの場合は、参照のターゲット・タイプが入れられます。 LOB の場合は、ホスト変数の長さ属性と、 実際の長さの入っているバッファーを指すポインターが入れられます。 113 ロケーターまたはファイル参照変数を使用して LOB を示す場合、 これらの項目は必要ありません。

SQLDA に上記 2 つのタイプの項目が両方とも含まれる場合、 基本 SQLVAR は副次 SQLVAR のブロックの前のブロックに入れられます。 それぞれの場合において、 項目の数は SQLD の値で示されます (副次 SQLVAR 項目の多くは使用されない場合があります)。

DESCRIBE によって SQLVAR 項目が設定される環境については、 SQLDA に対する DESCRIBE の効果に示されています。

SQLDA ヘッダーのフィールド


表 36. SQLDA ヘッダーのフィールド
C での名前 SQL データ・タイプ DESCRIBE および PREPARE を使用する場合 (SQLN を除き、データベース・マネージャーが設定) FETCH、OPEN、EXECUTE、および CALL で使用する場合 (ステートメントの実行前にアプリケーションにより設定)
sqldaid CHAR(8) このフィールドの 7 番目のバイトは、SQLDOUBLED という名前のフラグ・バイトです。 データベース・マネージャーは、それぞれの列に対して 2 つの SQLVAR 項目が 作成された場合は SQLDOUBLED を文字 '2' に設定し、 その他の場合はブランク (ASCII では X'20'、 EBCDIC では X'40') に設定します。 SQLDOUBLED がいつ設定されるかについては、 SQLDA に対する DESCRIBE の効果を参照してください。 このフィールドの 7 番目のバイトは、SQLVAR の数が 2 倍になった場合に使用されます。 これは SQLDOUBLED という名前のフィールドです。 記述されるホスト変数が構造タイプ、BLOB、CLOB、または DBCLOB の場合、 この 7 番目のバイトは文字 '2' に設定され、 それ以外の場合は任意の文字に設定できます (ブランクの使用をお勧めします)。

CALL ステートメントを使用し、 1 つまたは複数の SQLVAR でデータ・フィールドを FOR BIT DATA として定義する場合には、 6 番目のバイトを '+' の文字に、 それ以外の場合は任意の文字に設定できます (ブランクの使用を勧めします)。

sqldabc INTEGER 32 ビットの場合、SQLDA の長さ = SQLN*44+16。 64 ビットの場合、SQLDA の長さ = SQLN*56+16。 32 ビットの場合、SQLDA の長さ >= SQLN*44+16。 64 ビットの場合、SQLDA の長さ >= SQLN*56+16。
sqln SMALLINT データベース・マネージャーはこれを変更しません。 DESCRIBE ステートメントを実行する前に、 ゼロまたはゼロより大きい値を設定する必要があります。 これは、SQLVAR のオカレンスの合計数を示します。 SQLDA の SQLVAR のオカレンスの合計。 SQLN には、ゼロまたはゼロより大きい値を設定する必要があります。
sqld SMALLINT データベース・マネージャーによって、 結果表の列の数 (記述するステートメントが選択ステートメントでない場合はゼロ) に設定されます。 SQLVAR のオカレンスにより記述されるホスト変数の数

基本 SQLVAR のオカレンスのフィールド


表 37. 基本 SQLVAR のフィールド
資料名 データ・タイプ DESCRIBE および PREPARE で使用する場合 FETCH、OPEN、EXECUTE、および CALL で使用する場合
sqltype SMALLINT 列のデータ・タイプと、その列がヌル値可能かどうかを示します。 表 39 は、 許される値とその意味をリストしています。

特殊タイプまたは参照タイプの場合は、 その基本タイプのデータ・タイプがこのフィールドに入れられます。 構造タイプの場合は、 そのタイプの変換グループ (CURRENT DEFAULT TRANSFORM GROUP 特殊レジスターに基づく) の FROM SQL 変換関数が入れられます。 基本 SQLVAR には、 それがユーザー定義タイプまたは参照タイプの記述の一部であるかどうかを示す標識はありません。

ホスト変数の場合と同じ。 日付 / 時刻の値のホスト変数は、文字ストリング変数でなければなりません。 FETCH の場合、日付 / 時刻のタイプ・コードは、固定長文字ストリングを意味します。 sqltype が偶数値の場合、sqlind フィールドは無視されます。
sqllen SMALLINT 列の長さ属性。 日付 / 時刻の列の場合は、値のストリング表記の長さ。 表 39 を参照してください。

ラージ・オブジェクト・ストリングの場合、この値は 0 に設定されます。 その長さ属性が 2 バイト整数に入る小さいものであっても、設定値はやはり 0 になります。

ホスト変数の長さ属性。 表 39 を参照してください。

CLOB、DBCLOB、および BLOB の列の場合、 データベース・マネージャーはこの値を無視します。 代わりに、副次 SQLVAR の len.sqllonglen フィールドが使用されます。

sqldata ポインター 文字ストリング SQLVAR の場合、FOR BIT DATA 属性で列を定義すると、sqldata は 0 になります。 列に FOR BIT DATA 属性が指定されていない場合、値はデータのエンコードによって異なります。 1 バイト SBCS エンコード・データの場合、sqldata はその SBCS コード・ページになります。 混合 DBCS エンコード・データの場合は、 sqldata は、複合 DBCS コード・ページに関連付けられた SBCS コード・ページになります。 日本語または中国語 (繁体字) EUC エンコード・データの場合には、 sqldata は複合 EUC コード・ページになります。

他のすべてのタイプの列の場合、sqldata は未定義です。

ホスト変数のアドレスを含みます (取り出したデータを保管する場所)。
sqlind ポインター 文字ストリング SQLVAR の場合、sqlind は 0 になります。 ただし、sqlind が複合 DBCS コード・ページに関連付けられた DBCS コード・ページの場合の、 混合 DBCS エンコード・データは例外です。

他のすべてのタイプの列の場合、sqlind は未定義です。

関連する標識変数があれば、そのアドレスが入ります。 それ以外の場合は、使用されません。 sqltype が偶数値の場合、sqlind フィールドは無視されます。
sqlname VARCHAR(30) 非修飾の列名。

システムが生成した名前を持つ列 (結果列は単一の列から直接得られたものでなく、 AS 文節を使用して名前を指定していない) の場合、 13 バイト目は X'FF' に設定されます。 AS 文節によって列名が指定された場合は、このバイトは X'00' になります。

DRDA アプリケーション・サーバーへのアクセスに CALL ステートメントで使用する場合、 FOR BIT DATA ストリングを指定するには、sqlname を次のように設定します。
  • sqlname の長さは 8
  • sqlname の最初の 4 バイトは X'00000000'
  • sqlname の残りのバイトは予約済み (現在は無視される)

さらに、sqltype は CHAR、 VARCHAR、または LONG VARCHAR を示すものでなければならず、 sqldaid フィールドの 6 バイト目は文字 '+' に設定されます。

この手法は、OPEN および EXECUTE で、 DB2 コネクトを使用してサーバーにアクセスする際に使用できます。

副次 SQLVAR のオカレンスのフィールド


表 38. 副次 SQLVAR のフィールド
資料名 データ・タイプ DESCRIBE および PREPARE で使用する場合 FETCH、OPEN、EXECUTE、および CALL で使用する場合
len.sqllonglen INTEGER BLOB、CLOB、または DBCLOB の列の長さ属性。 BLOB、CLOB、または DBCLOB ホスト変数の長さ属性。 データベース・マネージャーは、 それらのデータ・タイプに対しては基本 SQLVAR の SQLLEN フィールドを無視します。 長さ属性は、BLOB または CLOB ではバイト数、DBCLOB では文字数になります。
reserve2 32 ビットの場合は CHAR(3)、64 ビットの場合は CHAR(11)。 使用されません。 使用されません。
sqlflag4 CHAR(1) SQLVAR の表している参照タイプが sqldatatype_name に指定されたターゲット・タイプに関連付けられたものである場合、 この値は X'01' になります。 SQLVAR の表している構造タイプで、 sqldatatype_name にユーザー定義タイプ名が指定されている場合、値は X'12' になります。 それ以外の場合は、値は X'00' です。 SQLVAR の表している参照タイプが sqldatatype_name に指定されたターゲット・タイプに関連付けられたものである場合、 X'01' に設定されます。 SQLVAR の表している構造タイプで、 sqldatatype_name にユーザー定義タイプ名が指定されている場合、X'12' に設定されます。 それ以外の場合は、値は X'00' です。
sqldatalen ポインター 使用されません。 BLOB、CLOB、および DBCLOB ホスト変数でのみ使用されます。

このフィールドが NULL (ヌル値) の場合は、 データの直前に実際の長さ (文字単位) を 4 バイトで保管し、 SQLDATA はフィールド長の最初のバイトを指すようにする必要があります。

このフィールドが NULL (ヌル値) でない場合は、 対応する基本 SQLVAR 内の SQLDATA フィールドの指すバッファー内の データの実際の長さ (バイト単位、 DBCLOB の場合も含む) の入っている 4 バイト長のバッファーを指すポインターが入れられます。

このフィールドを使用するか否かに関係なく、 len.sqllonglen フィールドは設定する必要があります。

sqldatatype_name VARCHAR(27) ユーザー定義タイプの列の場合、 データベース・マネージャーはこれを完全修飾ユーザー定義タイプ名に設定します。 1 参照タイプの場合は、 データベース・マネージャーはこれを参照のターゲット・タイプの完全修飾タイプ名に設定します。 構造タイプの場合、 表の注1 で示されている形式の完全修飾ユーザー定義タイプ名に設定されます。
予約済み CHAR(3) 使用されません。 使用されません。
注:
  1. 最初の 8 バイトには、 タイプのスキーマ名が入れられます (必要に応じて右側にスペースが入れられます)。 バイト 9 はドット文字 (.) です。 バイト 10 〜 27 には、タイプ名のうちの下位部分が入れられます。 それは、右側にスペースを入れて拡張することはできません

このフィールドの主な目的は、タイプの名前を入れることですが、 IBM の定義済みデータ・タイプ用に設定することもできます。 この場合、スキーマ名は SYSIBM、 名前の下位部分は DATATYPES カタログ視点の TYPENAME 列に保管されている名前になります。 たとえば、次のとおりです。

type name        length   sqldatatype_name
---------        ------   ----------------
A.B              10       A       .B
INTEGER          16       SYSIBM  .INTEGER
"Frank's".SMINT  13       Frank's .SMINT
MY."type  "      15       MY      .type

関連情報:


脚注:

113
特殊タイプと LOB の情報が重なり合うことはないので、 DESCRIBE においては、SQLVAR 項目を 3 倍にしなくても、LOB に基づく特殊タイプを使用できます。


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