DB2 Version 9.7 for Linux, UNIX, and Windows

NUMBER データ・タイプ

NUMBER データ・タイプは、Oracle NUMBER データ・タイプを使用するアプリケーションをサポートするために導入されました。

NUMBER はデータベース・レベルでサポートされるため、サポートが必要なデータベースを作成する前に有効にする必要があります。 その場合は、DB2_COMPATIBILITY_VECTOR レジストリー変数に適切な値を設定します。NUMBER を有効にしてデータベースを作成すると、データベース構成パラメーター number_compat が ON に設定されます。NUMBER のサポートを有効にしてデータベースを作成した場合は、DB2_COMPATIBILITY_VECTOR レジストリー変数をリセットしても、そのデータベースについて NUMBER のサポートを無効にすることはできません。同様に、NUMBER のサポートを有効にせずに作成されたデータベースでは、DB2_COMPATIBILITY_VECTOR レジストリー変数を設定しても、NUMBER のサポートを有効にすることはできません。

使用可能化

NUMBER データ・タイプのサポートは、データベースを作成する前に DB2_COMPATIBILITY_VECTOR レジストリー変数のビット位置番号 5 (0x10) を設定することで有効になります。これらの DB2® 互換性フィーチャーを最大限に活用するには、値を ORA に設定します。これは推奨される設定です。インスタンスを停止し、再始動するまで、レジストリー変数の新規設定は 反映されません。

使用法

number_compat データベース構成パラメーターが ON に設定されている DB2 データベースでは、以下のサポートが有効になります。

SQL ステートメント内で NUMBER データ・タイプが明示的に指定されていた場合は、以下のように暗黙的にマップされます。
  • NUMBER に精度属性とスケール属性が指定されていない場合は、DECFLOAT(16) にマップされます。
  • NUMBER(p) が指定されている場合は、DECIMAL(p) にマップされます。
  • NUMBER(p,s) が指定されている場合は、DECIMAL(p,s) にマップされます。

サポートされている最大の精度は 31 であり、スケールは精度の値以下の正の値である必要があります。この暗黙的なマップの結果、メッセージは NUMBER ではなくデータ・タイプ DECFLOAT および DECIMAL を参照し、列またはルーチンのデータ・タイプを記述する演算子は、NUMBER ではなく DECIMAL または DECFLOAT のいずれかを戻します。DECFLOAT(16) は、Oracle NUMBER データ・タイプよりも最大精度の値が小さいことに注意してください。表に数値を保管するために 16 桁を超える精度が必要な場合は、該当する列を DECFLOAT(34) として明示的に定義する必要があります。

number_compat 構成パラメーターが ON に設定されている DB2 データベースでも、数値リテラルのサポートは変更されません。整数、10 進数、および浮動小数点定数の規則が引き続き適用されます。それによって、10 進リテラルが 31 桁に、浮動小数点リテラルがバイナリー倍精度浮動小数点値の範囲に制限されます。 DECFLOAT(34) キャストに対するストリング (CAST 仕様または DECFLOAT 関数を使用) は、DECIMAL または DOUBLE の範囲を超えて、DECFLOAT(34) の範囲までの値に対して使用することができます。

NUMBER データ値が (CAST 仕様あるいは VARCHAR または CHAR スカラー関数を使用して) 文字ストリングにキャストされると、すべての先行ゼロが結果から削除されます。

それぞれ 64 ビットのバイナリー浮動小数点値および 32 ビットのバイナリー浮動小数点値を表す、末尾が D または F である数値リテラルは、現在サポートされていません。E を含む数値リテラルにはデータ・タイプ DOUBLE があり、CAST 仕様またはキャスト関数 REAL を使用して、REAL にキャストすることができます。

number_compat 構成パラメーターが ON に設定されている DB2 データベースでは、CREATE SEQUENCE ステートメントの順序値で使用されるデフォルトのデータ・タイプは、INTEGER ではなく DECIMAL(27) になります。

number_compat 構成パラメーターが ON に設定されている DB2 データベースでは、DECIMAL または DECFLOAT データ・タイプを含むすべての算術演算子と算術または数学関数は、10 進浮動小数点を使用して正しく実行され、データ・タイプ DECFLOAT(34) の値が戻されます。これは、両方のオペランドに DECIMAL または DECFLOAT(16) データ・タイプが含まれる算術演算子にも適用されます。これは、「DB2 SQL リファレンス」の 10 進演算の説明とは異なっています(『式』の『算術演算子がある式』を参照してください)。さらに、整数データ・タイプ (SMALLINT、INTEGER、BIGINT) しか含まないすべての除算演算子は、10 進浮動小数点を使用して正しく実行でき、整数データ・タイプではなく、データ・タイプが DECFLOAT(34) である値が戻されます (整数オペランドを使用してゼロによる除算を行うと、無限大が戻され、エラーではなく警告が表示されます)。

解決処理中にデータ・タイプ DECIMAL の引数が DECFLOAT 値と見なされるように、関数解決も変更されます。これにより、関数解決を目的として、NUMBER(p[,s]) データ・タイプに対応する引数を持つ関数が、引数のデータ・タイプが NUMBER である場合と同様に、正しく処理されます。

引数の数が可変であり、結果データ・タイプが引数のデータ・タイプ・セットに基づく関数のセットにはデータ・タイプが、このような関数解決の変更は適用されません。このセットには、以下の関数が含まれています。
  • COALESCE
  • DECODE
  • GREATEST
  • LEAST
  • MAX (scalar)
  • MIN (scalar)
  • NVL
  • VALUE
number_compat 構成パラメーターを ON に設定すると、結果データ・タイプの規則は、DECIMAL 結果データ・タイプの精度が 31 を超えた場合に、DECFLOAT(34) が結果データ・タイプになるように拡張されます。これらの規則は、セット演算子 (UNION、EXCEPT(MINUS)、INTERSECT)、IN 述部の IN リストの式値、および複数行の VALUES 節内の対応する式に含まれる、対応する列にも適用されます。
データベース・サーバー上の割り当ておよびキャストに使用される丸めモードは、関連するデータ・タイプによって異なります。場合によっては切り捨てが行われます。 ターゲットがバイナリー浮動小数点値 (REAL または DOUBLE) である場合は、通常どおり最も近い偶数への丸めが使用されます。その他の場合 (一般的に DECIMAL または DECFLOAT 値を使用する場合) には、丸めは decflt_rounding データベース構成パラメーターの値に基づいて行われます。このパラメーターのデフォルトは最も近い偶数への丸めですが、Oracle の丸めモードに従って四捨五入に設定することもできます。以下の表に、さまざまな数値の割り当てとキャストに使用される丸め方法を示します。
表 1. 数値割り当ておよびキャストの丸め方法
ソース・データ・タイプ ターゲット・データ・タイプ
整数タイプ DECIMAL DECFLOAT REAL/DOUBLE
整数タイプ 適用外 適用外 decflt_rounding 最も近い偶数への丸め
DECIMAL decflt_rounding decflt_rounding decflt_rounding 最も近い偶数への丸め
DECFLOAT decflt_rounding decflt_rounding decflt_rounding 最も近い偶数への丸め
REAL/DOUBLE 切り捨て decflt_rounding decflt_rounding 最も近い偶数への丸め
ストリング (キャストのみ) 適用外 decflt_rounding decflt_rounding 最も近い偶数への丸め

DB2 10 進浮動小数点値は、IEEE 754R 標準に基づいています。DECFLOAT データの取得、および DECFLOAT データの文字ストリングへのキャストを行うと、小数点以下のゼロがすべて削除されます。

クライアント/サーバーの互換性に関する考慮事項

制約事項

NUMBER データ・タイプのサポートには、以下の制限事項があります。
  • 31 を超える精度属性、精度属性を示すアスタリスク (*)、精度属性を超えるスケール属性、または負のスケール属性を持つ NUMBER データ・タイプはサポートされません。このようなデータ・タイプを指定しても、対応する DECIMAL 精度およびスケールはサポートされません。
  • 三角関数および DIGITS スカラー関数を、精度 (DECFLOAT) が指定されていない NUMBER データ・タイプの引数によって呼び出すことはできません。
  • NUMBER という名前で特殊タイプを作成することはできません。