SQLDA (SQL 記述子域)
SQLDA は、SQL DESCRIBE ステートメントの実行に必要な変数の集まりです。
SQLDA 変数は、PREPARE、OPEN、FETCH、 および EXECUTE ステートメントでは、オプションとして使用できます。 SQLDA は、動的 SQL との間で情報を伝えます。 これは、DESCRIBE ステートメントで使用され、ホスト変数のアドレスで変更して、 FETCH または EXECUTE ステートメントで再び使用することができます。
SQLDA は、すべての言語についてサポートされます。 ただし、事前定義宣言は、C、REXX、FORTRAN、および COBOL 専用に用意されています。
SQLDA 内の情報の意味は、その用途によって異なります。 PREPARE および DESCRIBE では、SQLDA はアプリケーション・プログラムに準備済みステートメントに関する情報を提供します。 OPEN、EXECUTE、および FETCH の場合、SQLDA はホスト変数を記述します。
- 3 つの VARCHAR の列と 1 つの INTEGER の列の入っている表を記述する場合、 SQLVAR 項目は 4 つになります。
- 2 つの VARCHAR の列と 1 つの CLOB の列、 および 1 つの INTEGER の列の入っている表を記述する場合には、 SQLVAR 項目は 8 つになります。
EXECUTE、FETCH、および OPEN において、 記述する変数のいずれかが LOB タイプ (LOB ロケーターおよびファイル参照変数では、 2 倍の SQLDA は必要ありません) または構造化タイプの場合、 SQLDA 全体の SQLVAR 項目の数を 2 倍にする必要があります。 (特殊タイプと参照タイプは、これらの場合には関係ありません。 これは、それらのタイプの場合、 データベースが 2 倍の数の項目の追加情報を必要とはしないためです。EXECUTE、FETCH、および OPEN ステートメント内の SQLDA 変数として、配列、カーソル、および行タイプはサポートされていません。)
SQLDA フィールド記述
- 基本 SQLVAR: これらの項目は常に存在します。 これらの項目には、データ・タイプのコード、長さ属性、列名、ホスト変数のアドレス、 および標識変数アドレスなどの列、パラメーター・マーカー、またはホスト変数に関する基本的な情報が入れられます。
- 2 次 SQLVAR: これらの項目は、上記で概説した規則に従って SQLVAR 項目の数が 2 倍になった場合にのみ存在します。 ユーザー定義タイプ (参照タイプを除く) の場合は、ユーザー定義タイプ名が入ります。 参照タイプの場合は、参照のターゲット・タイプが入れられます。 LOB の場合は、ホスト変数の長さ属性と、 実際の長さの入っているバッファーを指すポインターが入れられます。 (特殊タイプと LOB の情報が重なり合うことはないので、 DESCRIBE においては、SQLVAR 項目を 3 倍にしなくても、LOB に基づく特殊タイプを使用できます。) ロケーターまたはファイル参照変数を使用して LOB を示す場合、 これらの項目は必要ありません。
SQLVAR 項目が DESCRIBE によって設定される状況について詳しくは、 SQLDA での DESCRIBE の効果を参照してください。
SQLDA ヘッダーのフィールド
C での名前 | SQL データ・タイプ | DESCRIBE および PREPARE で 使用する場合 (SQLN を除き、 データベース・マネージャーで 設定) | FETCH、OPEN、および EXECUTE で使用する場合 (ステートメントの 実行前にアプリケーションで 設定) |
---|---|---|---|
sqldaid | CHAR(8) | このフィールドの 7 番目のバイトは、SQLDOUBLED という名前のフラグ・バイトです。 データベース・マネージャーは、それぞれの列に対して 2 つの SQLVAR 項目が作成された場合は SQLDOUBLED を文字「2」に設定し、その他の場合はブランク (ASCII では X'20'、EBCDIC では X'40' に設定します)。 SQLDOUBLE がいつ設定されるかについて詳しくは、 SQLDA への DESCRIBE の影響 を参照してください。 |
このフィールドの 7 番目のバイトは、SQLVAR の数が 2 倍になった場合に使用されます。 これは SQLDOUBLED という名前のフィールドです。 記述されるホスト変数が構造化タイプ、BLOB、CLOB、または DBCLOB の場合、この 7 番目のバイトは文字「2」に設定され、それ以外の場合は任意の文字に設定できます (ブランクの使用をお勧めします)。 |
sqldabc | INTEGER | 32 ビットの場合、SQLDA の長さ = SQLN*44+16。 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 のオカレンスのフィールド
名前 | データ・タイプ | DESCRIBE および PREPARE で使用する場合 | FETCH、OPEN、および EXECUTE で使用する場合 |
---|---|---|---|
sqltype | SMALLINT | 列のデータ・タイプと、その列またはパラメーター・マーカーが NULL 可能能かどうかを示します。 (パラメーター・マーカーは常に NULL 可能と見なされます。) 表 4 に、許容値とその意味をリストします。 特殊、配列、カーソル、行、または参照タイプの場合は、その基本タイプのデータ・タイプがこのフィールドに入れられます。 構造化タイプの場合は、 そのタイプの変換グループ (CURRENT DEFAULT TRANSFORM GROUP 特殊レジスターに基づく) の FROM SQL 変換関数が入れられます。 基本 SQLVAR には、 それがユーザー定義タイプまたは参照タイプの記述の一部であるかどうかを示す標識はありません。 |
ホスト変数の場合と同じ。 日付/時刻の値のホスト変数は、文字ストリング変数でなければなりません。 FETCH の場合、日付/時刻のタイプ・コードは、固定長文字ストリングを意味します。 sqltype が偶数値の場合、sqlind フィールドは無視されます。 |
sqllen | SMALLINT | 列またはパラメーター・マーカーの長さ属性。 日付/時刻の列またはパラメーター・マーカーの場合は、値のストリング表記の長さ。 表 4を参照してください。 ラージ・オブジェクト・ストリングの場合、この値は 0 に設定されます。 その長さ属性が 2 バイト整数に入る小さいものであっても、設定値はやはり 0 になります。 |
ホスト変数の長さ属性。 表 4を参照してください。 CLOB、DBCLOB、および BLOB の列の場合、 データベース・マネージャーはこの値を無視します。 代わりに、2 次 SQLVAR の len.sqllonglen フィールドが使用されます。 |
sqldata | ポインタ | ストリング SQLVARS の場合、
sqldata にはコード・ページが組み入れられます。 文字ストリング SQLVAR の場合、FOR BIT DATA 属性で列を定義すると、sqldata は 0 になります。 ほかの文字ストリング SQLVARS の場合、sqldata には、SBCS データの SBCS コード・ページか、MBCS データの複合 MBCS コード・ページに関連付けられた SBCS コード・ページのいずれかが入っています。 日本語の EUC、中国語 (繁体字) の EUC、
および Unicode の UTF-8 文字ストリング SQLVARS では、
sqldata にそれぞれ 954、964、および 1208 が組み入れられます。 他のすべてのタイプの列の場合、sqldata は未定義です。 |
ホスト変数のアドレスが入っています (取り出したデータを保管するロケーション)。 |
sqlind | ポインタ | 文字ストリング SQLVARS の場合、sqlind は 0 になります。
ただし、sqlind が複合 DBCS コード・ページに関連付けられた DBCS コード・ページの場合の、
MBCS データは例外です。 他のすべてのタイプの場合、sqlind は未定義です。 |
関連する標識変数があれば、そのアドレスが入ります。 それ以外の場合は、使用されません。 sqltype が偶数値の場合、sqlind フィールドは無視されます。 |
sqlname | VARCHAR (30) | 非修飾の列名またはパラメーター・マーカー名。 システム生成の名前を持つ列およびパラメーター・マーカーの場合、 30 番目のバイトが X'FF' に設定されます。 AS 節によって列名が指定された場合は、このバイトは X'00' になります。 |
ホスト・データベースに接続する場合、FOR BIT DATA ストリングを指定するには、sqlname を以下のように設定します。
XML データを処理する場合、XML サブタイプを指定するには、sqlname を以下のように設定します。
|
2 次 SQLVAR のオカレンスのフィールド
名前 | データ・タイプ | DESCRIBE および PREPARE で使用する場合 | FETCH、OPEN、および EXECUTE で使用する場合 |
---|---|---|---|
len.sqllonglen | INTEGER | BLOB、CLOB、または DBCLOB の列またはパラメーター・マーカーの長さ属性。 | BLOB、CLOB、または DBCLOB ホスト変数の長さ属性。 データベース・マネージャーは、 それらのデータ・タイプに対しては基本 SQLVAR の SQLLEN フィールドを無視します。 長さ属性は、BLOB または CLOB ではバイト数、DBCLOB では 2 バイト文字の数になります。 |
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 値の場合は、 データの直前に実際の長さ (2 バイト文字単位) を 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 列に保管されている名前になります。 以下に例を示します。
|
SQLDA に対する DESCRIBE の効果
DESCRIBE OUTPUT または PREPARE OUTPUT INTO ステートメントの場合、 データベース・マネージャーは、常に SQLD を結果セットの列の数、 または出力パラメーター・マーカーの数に設定します。 DESCRIBE INPUT または PREPARE INPUT INTO ステートメントの場合、 データベース・マネージャーは、 常に SQLD をステートメント内の入力パラメーター・マーカーの数に設定します。 CALL ステートメント内の INOUT パラメーターに対応するパラメーター・マーカーは、 入力記述子と出力記述子の両方で記述されるので注意してください。
- SQLN >= SQLD で、しかも LOB、ユーザー定義タイプ、または参照タイプの項目がない
最初の SQLD SQLVAR 項目が設定され、SQLDOUBLED はブランクに設定されます。
- SQLN >= 2*SQLD で、しかも少なくとも 1 つの項目が LOB、 ユーザー定義タイプ、または参照タイプである
2 倍の数の SQLD SQLVAR 項目が設定され、SQLDOUBLED は「
2
」に設定されます。 - SQLD < = SQLN < 2*SQLD で、しかも少なくとも 1 つの項目が特殊、配列、カーソル、行、 または参照タイプで、LOB の項目または構造化タイプの項目はない
最初の SQLD SQLVAR 項目が設定され、SQLDOUBLED はブランクに設定されます。 SQLWARN BIND オプションが YES の場合は、 警告 SQLCODE +237 (SQLSTATE 01594) が出されます。
- SQLN < SQLD で、しかも LOB、ユーザー定義タイプ、
または参照タイプの項目がない
SQLVAR 項目は設定されず、SQLDOUBLED はブランクに設定されます。 SQLWARN BIND オプションが YES の場合は、 警告 SQLCODE +236 (SQLSTATE 01005) が出されます。
DESCRIBE が正常に実行される場合には、SQLD 個の SQLVAR が割り振られます。
- SQLN < SQLD で、しかも少なくとも 1 つの項目が特殊、配列、カーソル、行、または参照タイプで、LOB の項目または構造化タイプの項目はない
SQLVAR 項目は設定されず、SQLDOUBLED はブランクに設定されます。 SQLWARN BIND オプションが YES の場合は、 警告 SQLCODE +239 (SQLSTATE 01005) が出されます。
特殊、配列、カーソル、および行タイプ名および参照タイプのターゲット・タイプを組み込まれた DESCRIBE が正常に実行されると、2*SQLD 個の SQLVAR が割り振られます。
- SQLN < 2*SQLD で、
しかも少なくとも 1 つの項目が LOB または構造化タイプである
SQLVAR 項目は設定されず、SQLDOUBLED はブランクに設定されます。 (SQLWARN BIND オプションの設定に関係なく) 警告 SQLCODE +238 (SQLSTATE 01005) が出されます。
DESCRIBE が正常に実行される場合には、2*SQLD 個の SQLVAR が割り振られます。
上記リストで「LOB 項目」と示すものには、 ソース・タイプが LOB タイプである特殊タイプの項目も含まれます。
DESCRIBE (または PREPARE INTO) から警告 SQLCODE +236、+237、+239 を戻すかどうかを制御するには、 BIND または PREP コマンドの SQLWARN オプションを使用します。 使用するアプリケーション・コードでは、 これらの SQLCODE がいつ戻されてもよいようにしておいてください。 選択リストに LOB または構造化タイプの項目が入っていて、 SQLDA の中の SQLVAR が不足している場合には、 常に警告 SQLCODE +238 が戻されます。 これは、 結果セット内に LOB または構造化タイプの項目があるために SQLVAR 数を 2 倍にする必要があることをアプリケーションに認識させる唯一の方法です。
構造化タイプの項目を記述しようとしているものの、FROM SQL トランスフォームが定義されていない場合 (CURRENT DEFAULT TRANSFORM GROUP 特殊レジスターを使用した TRANSFORM GROUP の指定が行われていない (SQLSTATE 42741) か、またはその名前グループが FROM SQL トランスフォーム関数を定義していない (SQLSTATE 42744) ため))、DESCRIBE はエラーを戻します。 このエラーは、構造化タイプの項目がある表の DESCRIBE で戻されるエラーと同じです。
データベース・マネージャーが SQLDA に保管できるよりも長い ID を戻す場合、ID は切り捨てられ、警告が戻されます (SQLSTATE 01665)。しかし、構造化タイプの名前が切り捨てられるときには、エラーが戻されます (SQLSTATE 42622)。 ID の長さの制限については、『SQL と XQuery の制限値
』を参照してください。
SQLTYPE および SQLLEN
SQLTYPE | DESCRIBE および PREPARE INTO の場合の 列のデータ・タイプ | DESCRIBE および PREPARE INTO の場合の SQLLEN | FETCH、OPEN、および EXECUTE の場合の ホスト変数のデータ・タイプ | FETCH、OPEN、および EXECUTE の場合の SQLLEN |
---|---|---|---|---|
384/385 | 日付 | 10 | 日付の固定長文字ストリング表示 | ホスト変数の長さ属性 |
388/389 | 時間 | 8 | 時刻の固定長文字ストリング表示 | ホスト変数の長さ属性 |
392/393 | タイム・スタンプを取る | TIMESTAMP(0) に 19、 それ以外は TIMESTAMP(p) に 20+p | タイム・スタンプの固定長文字ストリング表示 | ホスト変数の長さ属性 |
400/401 | 該当なし | 該当なし | NULL 終了 GRAPHIC ストリング | ホスト変数の長さ属性 |
404/405 | BLOB | 0 * | BLOB | 使用されません。* |
408/409 | CLOB | 0 * | CLOB | 使用されません。* |
412/413 | DBCLOB | 0 * | DBCLOB | 使用されません。* |
448/449 | 可変長文字ストリング | 列の長さ属性 | 可変長文字ストリング | ホスト変数の長さ属性 |
452/453 | 固定長文字ストリング | 列の長さ属性 | 固定長文字ストリング | ホスト変数の長さ属性 |
456/457 | 長形式可変長文字ストリング | 列の長さ属性 | 長形式可変長文字ストリング | ホスト変数の長さ属性 |
460/461 | 適用外 | 適用外 | NULL 終了文字ストリング | ホスト変数の長さ属性 |
464/465 | 可変長 GRAPHIC ストリング | 列の長さ属性 | 可変長 GRAPHIC ストリング | ホスト変数の長さ属性 |
468/469 | 固定長 GRAPHIC ストリング | 列の長さ属性 | 固定長 GRAPHIC ストリング | ホスト変数の長さ属性 |
472/473 | 長形式可変長 GRAPHIC ストリング | 列の長さ属性 | 長形式 GRAPHIC ストリング | ホスト変数の長さ属性 |
480/481 | 浮動小数点 | 倍精度の場合は 8、単精度の場合は 4 | 浮動小数点 | 倍精度の場合は 8、単精度の場合は 4 |
484/485 | パック 10 進数 | バイト 1 は精度、バイト 2 は位取り | パック 10 進数 | バイト 1 は精度、バイト 2 は位取り |
492/493 | 64 ビット整数 | 8 | 64 ビット整数 | 8 |
496/497 | 長精度整数 | 4 | 長精度整数 | 4 |
500/501 | 短精度整数 | 2 | 短精度整数 | 2 |
908/909 | 可変長バイナリー・ストリング | 列の長さ属性 | 可変長バイナリー・ストリング | ホスト変数の長さ属性 |
912/913 | 固定長バイナリー・ストリング | 列の長さ属性 | 固定長バイナリー・ストリング | ホスト変数の長さ属性 |
916/917 | 適用外 | 適用外 | BLOB ファイル参照変数 | 267 |
920/921 | 適用外 | 適用外 | CLOB ファイル参照変数 | 267 |
924/925 | 適用外 | 適用外 | DBCLOB ファイル参照変数 | 267 |
960/961 | 適用外 | 適用外 | BLOB ロケーター | 4 |
964/965 | 適用外 | 適用外 | CLOB ロケーター | 4 |
968/969 | 適用外 | 適用外 | DBCLOB ロケーター | 4 |
988/989 | XML | 0 | 該当なし。代わりに、XML AS <ストリングまたはバイナリーの LOB タイプ> ホスト変数を使用します。 | 使用されない |
996 | 10 進浮動小数点数 | DECFLOAT(16) の場合 8、DECFLOAT(34) の場合 16 | 10 進浮動小数点数 | DECFLOAT(16) の場合 8、DECFLOAT(34) の場合 16 |
2440/2441 | 行 | 適用外 | 行 | 使用されない |
2440/2441 | カーソル (cursor) | 適用外 | 行 | 使用されない |
注:
|
認識されない非サポート SQLTYPE
SQLDA の SQLTYPE フィールドに表示される値は、 データの送信側および受信側で使用可能なデータ・タイプ・サポートのレベルによって異なります。 これは、新しいデータ・タイプが製品に追加される場合に特に重要です。
新しいデータ・タイプは、データの送信側または受信側にサポートされることもあれば、 サポートされないこともあり、データの送信側や受信側に認識されないことさえあります。 状況に応じて、新しいデータ・タイプが戻されたり、 送信側と受信側の両方が認めた互換データ・タイプが戻されたり、 あるいは結果としてエラーが発生したりします。
送信側と受信側が互換データ・タイプの使用に同意する場合、 以下の表に示すマッピングが実行されます。 このマッピングは、 送信側または受信側の少なくともどちらかが指定データ・タイプをサポートしない場合に実行されます。 非サポート・データ・タイプは、 アプリケーションまたはデータベース・マネージャーのどちらかによって提供されます。
データ・タイプ | 互換データ・タイプ |
---|---|
BIGINT | DECIMAL(19, 0) |
ROWID | VARCHAR(40) FOR BIT DATA |
SQLDA では、データ・タイプが置換されたことは示されないので注意してください。
パック 10 進数
パック 10 進数は、一種のバイナリー・コードによる 10 進数 (BCD) 表記で保管されます。 BCD においては、1 ニブル (4 ビット) で 10 進数の 1 桁が表されます。 例えば、0001 0111 1001 は 179 を表します。 したがって、パック 10 進数の値はニブルごとに読む必要があります。 値の保管はバイト単位で行い、16 進数表記としてそれらのバイトを読み、 それを 10 進数に戻します。 例えば、0001 0111 1001 は、バイナリー表記では 00000001 01111001 となります。 この数値を 16 進数として読むと、0179 になります。
小数点は、位取りによって決まります。 例えば、DEC(12,5) の列の場合、小数点より右側に 5 桁あることになります。
符号は、桁数を表すニブルの右側のニブルで示します。 正符号または負符号は、以下のように示します。
符号 | バイナリー表現 | 10 進表記 | 16 進表記 |
---|---|---|---|
正符号 (+) | 1100 | 12 | C |
負符号 (-) | 1101 | 13 | D |
- 値を保管するためには、p/2+1 バイトを割り振ります。p は精度です。
- 値を表すために、ニブルを左から右へ割り当てます。 数値の精度が偶数の場合は、最初にゼロのニブルを追加します。 この割り当てには、先行 (無効な) ゼロと後続 (有効な) ゼロの桁が入ります。
- 符号ニブルは、最後のバイトの第 2 ニブルになります。
以下に例を示します。
列 | 値 | バイトごとにグループにした 16 進のニブル |
---|---|---|
DEC(8,3) | 6574.23 | 00 65 74 23 0C |
DEC(6,2) | -334.02 | 00 33 40 2D |
DEC(7,5) | 5.2323 | 05 23 23 0C |
DEC(5,2) | -23.5 | 02 35 0D |
10 進数の SQLLEN フィールド
SQLLEN フィールドには、 10 進数の列の精度 (第 1 バイト) と位取り (第 2 バイト) が入れられます。 アプリケーションを移植可能にするには、 精度のバイトと位取りのバイトを短精度整数として一度に設定するのではなく、 個々に設定するようにしてください。 これによって、整数のバイト反転の問題が回避されます。
((char *)&(sqlda->sqlvar[i].sqllen))[0] = precision;
((char *)&(sqlda->sqlvar[i].sqllen))[1] = scale;