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 はホスト変数を記述します。

DESCRIBE および PREPARE において、 記述する列のいずれかが LOB タイプ (LOB ロケーターおよびファイル参照変数では、 2 倍の SQLDA は必要ありません)、参照タイプ、またはユーザー定義タイプの場合、 SQLDA 全体の SQLVAR 項目の数を 2 倍にする必要があります。 以下に例を示します。
  • 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 フィールド記述

SQLDA は、4 つの変数と、 その後に SQLVAR と総称して呼ばれる変数の任意の数のオカレンスによって構成されています。 OPEN、FETCH、 および EXECUTE では、 SQLVAR の各オカレンスによってホスト変数が記述されます。 DESCRIBE と PREPARE では、 SQLVAR の各オカレンスによって結果表またはパラメーター・マーカーの列が記述されます。 SQLVAR の項目には、以下の 2 つのタイプがあります。
  • 基本 SQLVAR: これらの項目は常に存在します。 これらの項目には、データ・タイプのコード、長さ属性、列名、ホスト変数のアドレス、 および標識変数アドレスなどの列、パラメーター・マーカー、またはホスト変数に関する基本的な情報が入れられます。
  • 2 次 SQLVAR: これらの項目は、上記で概説した規則に従って SQLVAR 項目の数が 2 倍になった場合にのみ存在します。 ユーザー定義タイプ (参照タイプを除く) の場合は、ユーザー定義タイプ名が入ります。 参照タイプの場合は、参照のターゲット・タイプが入れられます。 LOB の場合は、ホスト変数の長さ属性と、 実際の長さの入っているバッファーを指すポインターが入れられます。 (特殊タイプと LOB の情報が重なり合うことはないので、 DESCRIBE においては、SQLVAR 項目を 3 倍にしなくても、LOB に基づく特殊タイプを使用できます。) ロケーターまたはファイル参照変数を使用して LOB を示す場合、 これらの項目は必要ありません。
SQLDA に上記 2 つのタイプの項目が両方とも入っている場合、 基本 SQLVAR は 2 次 SQLVAR のブロックの前のブロックに入れられます。 それぞれの場合において、 項目の数は SQLD の値で示されます (2 次 SQLVAR 項目の多くは使用されない場合があります)。

SQLVAR 項目が DESCRIBE によって設定される状況について詳しくは、 SQLDA での DESCRIBE の効果を参照してください。

SQLDA ヘッダーのフィールド

表 1. 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 のオカレンスのフィールド

表 2. 基本 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 を以下のように設定します。
  • SQLDA ヘッダー内の SQLDAID の 6 番目のバイトを「+」に設定します。
  • sqlname の長さを 8 にします。
  • sqlname の最初の 2 バイトを X'0000' にします。
  • sqlname の 3 番目と 4 番目のバイトを X'0000' にします。
  • sqlname の残りの 4 バイトは予約済みであり、X'00000000' に設定します。
XML データを処理する場合、XML サブタイプを指定するには、sqlname を以下のように設定します。
  • sqlname の長さを 8 にします。
  • sqlname の最初の 2 バイトを X'0000' にします。
  • sqlname の 3 番目と 4 番目のバイトを X'0000' にします。
  • sqlname の 5 番目のバイトを X'01' にします。
  • sqlname の残りの 3 バイトは予約済みであり、X'000000' に設定します。

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

表 3. 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 列に保管されている名前になります。 以下に例を示します。
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

SQLDA に対する DESCRIBE の効果

DESCRIBE OUTPUT または PREPARE OUTPUT INTO ステートメントの場合、 データベース・マネージャーは、常に SQLD を結果セットの列の数、 または出力パラメーター・マーカーの数に設定します。 DESCRIBE INPUT または PREPARE INPUT INTO ステートメントの場合、 データベース・マネージャーは、 常に SQLD をステートメント内の入力パラメーター・マーカーの数に設定します。 CALL ステートメント内の INOUT パラメーターに対応するパラメーター・マーカーは、 入力記述子と出力記述子の両方で記述されるので注意してください。

SQLDA の SQLVAR は、以下の場合に設定されます。
  • 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) が出されます。

SQLDA の SQLVAR は、 以下の場合には設定されません (さらに多くのスペースの割り振りと別の DESCRIBE が必要)。
  • 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

表 4 は、SQLDA の SQLTYPE および SQLLEN フィールドに表示される可能性のある値を示しています。 DESCRIBE と PREPARE INTO においては、 SQLTYPE の値が偶数ならその列では NULL 値が使えないこと、 また奇数ならその列で NULL 値が可能であることを意味しています。 FETCH、OPEN、および EXECUTE において、 SQLTYPE の値が偶数の場合には標識変数がないこと、 奇数の場合には SQLIND に標識変数のアドレスが入れられていることを意味しています。
表 4. SQLTYPE と SQLLEN の値 (DESCRIBE、FETCH、OPEN、および EXECUTE の場合)
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) 適用外 使用されない
注:
  • 2 次 SQLVAR の len.sqllonglen フィールドに、列の長さ属性が入れられます。
  • SQLTYPE は、移植性のために旧バージョンから変更されました。 旧バージョンの値 (旧バージョンの SQL リファレンスを参照) は、引き続きサポートされています。

認識されない非サポート 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 桁あることになります。

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

表 5. パック 10 進数の符号標識の値
符号 バイナリー表現 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 バイト) が入れられます。 アプリケーションを移植可能にするには、 精度のバイトと位取りのバイトを短精度整数として一度に設定するのではなく、 個々に設定するようにしてください。 これによって、整数のバイト反転の問題が回避されます。

例えば、C の場合には以下のようにします。
  ((char *)&(sqlda->sqlvar[i].sqllen))[0] = precision;
  ((char *)&(sqlda->sqlvar[i].sqllen))[1] = scale;