SQL 解説書

SQLTYPE と SQLLEN

表 39 に、 SQLDA の SQLTYPE フィールドと SQLLEN フィールドに現れる値を示します。 DESCRIBE と PREPARE INTO においては、 SQLTYPE の値が偶数ならその列ではヌル値 (NULL) が使えないこと、 また奇数ならその列でヌル値が可能であることを意味しています。 FETCH、OPEN、EXECUTE、および CALL において、 SQLTYPE の値が偶数の場合には標識変数がないこと、 奇数の場合には SQLIND に標識変数のアドレスが入れられていることを意味しています。

表 39. SQLTYPE と SQLLEN の値 (DESCRIBE、FETCH、OPEN、EXECUTE、および CALL の場合)

DESCRIBE および PREPARE INTO の場合 FETCH、OPEN、EXECUTE、および CALL の場合
SQLTYPE 列のデータ・タイプ SQLLEN ホスト変数のデータ・タイプ SQLLEN
384/385 日付 10 日付の固定長文字ストリング表示 ホスト変数の長さ属性
388/389 時刻 8 時刻の固定長文字ストリング表示 ホスト変数の長さ属性
392/393 タイム・スタンプ 26 タイム・スタンプの固定長文字ストリング表示 ホスト変数の長さ属性
396/397 DATALINK 列の長さ属性 DATALINK ホスト変数の長さ属性
400/401 適用外 適用外 NUL 文字で終了する漢字ストリング ホスト変数の長さ属性
404/405 BLOB 0 * BLOB 使用されません。*
408/409 CLOB 0 * CLOB 使用されません。*
412/413 DBCLOB 0 * DBCLOB 使用されません。*
448/449 可変長文字ストリング 列の長さ属性 可変長文字ストリング ホスト変数の長さ属性
452/453 固定長文字ストリング 列の長さ属性 固定長文字ストリング ホスト変数の長さ属性
456/457 長形式可変長文字ストリング 列の長さ属性 長形式可変長文字ストリング ホスト変数の長さ属性
460/461 適用外 適用外 NUL 文字で終了する文字ストリング ホスト変数の長さ属性
464/465 可変長漢字ストリング 列の長さ属性 可変長漢字ストリング ホスト変数の長さ属性
468/469 固定長漢字ストリング 列の長さ属性 固定長漢字ストリング ホスト変数の長さ属性
472/473 長形式可変長漢字ストリング 列の長さ属性 長形式漢字ストリング ホスト変数の長さ属性
480/481 浮動小数点数 倍精度の場合は 8、単精度の場合は 4 浮動小数点数 倍精度の場合は 8、単精度の場合は 4
484/485 パック 10 進数 バイト 1 は精度、バイト 2 は位取り パック 10 進数 バイト 1 は精度、バイト 2 は位取り
492/493 大整数 8 大整数 8
496/497 大整数 4 大整数 4
500/501 小整数 2 小整数 2
916/917 該当なし 該当なし BLOB ファイル参照変数 267
920/921 該当なし 該当なし CLOB ファイル参照変数 267
924/925 該当なし 該当なし DBCLOB ファイル参照変数 267
960/961 該当なし 該当なし BLOB ロケーター 4
964/965 該当なし 該当なし CLOB ロケーター 4
968/969 該当なし 該当なし DBCLOB ロケー ター 4
注:
  • 副次 SQLVAR の len.sqllonglen フィールドに、列の長さ属性が入れられます。
  • SQLTYPE は、DB2 での移行性のために旧バージョンから変更されました。 旧バージョンの値 (旧バージョンの SQL 解説書を参照) は、引き続きサポートされています。

認識されない非サポート SQLTYPE

SQLDA の SQLTYPE フィールドに表示される値は、 データの送信側および受信側で使用可能なデータ・タイプ・サポートのレベルによって異なります。 これは、新しいデータ・タイプが製品に追加される場合に特に重要です。

新しいデータ・タイプは、データの送信側または受信側にサポートされることもあれば、 サポートされないこともあり、データの送信側や受信側に認識されないことさえあります。 状況に応じて、新しいデータ・タイプが戻されたり、 送信側と受信側の両方が認めた互換データ・タイプが戻されたり、 あるいは結果としてエラーが発生したりします。

送信側と受信局が互換データ・タイプの使用に同意する場合、 以下に示すマッピングが実行されます。 このマッピングは、 送信側または受信側の少なくともどちらかが指定データ・タイプをサポートしない場合に実行されます。 非サポート・データ・タイプは、 アプリケーションまたはデータベース・マネージャーのどちらかによって提供されます。
データ・タイプ 互換データ・タイプ
BIGINT DECIMAL(19, 0)
ROWID VARCHAR(40) FOR BIT DATA114

SQLDA では、データ・タイプが置換されたことは示されないので注意してください。

パック 10 進数

パック 10 進数は、一種の 2 進コードによる 10 進数 (BCD) 表記で保管されます。 BCD においては、1 ニブル (4 ビット) で 10 進数の 1 桁が表されます。 たとえば、0001 0111 1001 は 179 を表します。 したがって、パック 10 進数の値はニブルごとに読む必要があります。 値の保管はバイト単位で行い、16 進数表記としてそれらのバイトを読み、 それを 10 進数に戻します。 たとえば、0001 0111 1001 は、2 進表記では 00000001 01111001 となります。 この数値を 16 進数として読むと、0179 になります。

小数点は、位取りによって決まります。 たとえば、DEC(12,5) の列の場合、小数点より右側に 5 桁あることになります。

符号は、桁数を表すニブルの右側のニブルで示します。 正記号または負記号は、以下のように示します。

表 40. パック 10 進数の符号標識の値
符号 表記
2 進 10 進 16 進
正符号 (+) 1100 12 C
負符号 (-) 1101 13 D

まとめ:

  1. 値を保管するときは、p /2+1 個のバイトを割り振ります (p は精度)。
  2. 値を表すために、ニブルを左から右へ割り当てます。 数値の精度が偶数の場合は、最初にニブルを追加します。 この割り当てには、先行 (無効な) ゼロと後続 (有効な) ゼロの桁が含まれます。
  3. 符号ニブルは、最後のバイトの第 2 ニブルになります。

パック 10 進数を変換するもう 1 つの方法があります。 CHAR を参照してください。

たとえば、次のとおりです。
バイトごとにグループにした 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 バイト) が入れられます。 アプリケーションを移植可能にするには、 精度のバイトと位取りのバイトを短整数として一度に設定するのではなく、 個々に設定するようにしてください。 これによって、整数のバイト逆転の問題が回避されます。

たとえば、C の場合には以下のようにします。

  ((char *)&(sqlda->sqlvar[i].sqllen))[0] = precision;
  ((char *)&(sqlda->sqlvar[i].sqllen))[1] = scale;

関連情報:


脚注:

114
ROWID は DB2 ユニバーサル・データベース (OS/390 版) バージョン 6 でサポートされています。


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