NUMBER データ・タイプ

NUMBER データ・タイプは、Oracle NUMBER データ・タイプを使用するアプリケーションをサポートします。

有効化

データベース・レベルで NUMBER のサポートを有効にしてから、このサポートを必要とするデータベースを作成します。 このサポートを有効にするには、DB2_COMPATIBILITY_VECTOR レジストリー変数を 16 進値 0x10 (ビット位置 5) に設定してから、インスタンスを停止し再始動して、新しい設定を有効にします。
db2set DB2_COMPATIBILITY_VECTOR=10
db2stop
db2start
Oracle アプリケーションの Db2® 互換フィーチャーを最大限に活用するには、 DB2_COMPATIBILITY_VECTOR の設定を ORA にすることをお勧めします。これにより、すべての互換性ビットが設定されます。

NUMBER のサポートを有効にしてデータベースを作成すると、number_compat データベース構成パラメーターは ON に設定されます。

NUMBER のサポートを有効にしてデータベースを作成した場合は、DB2_COMPATIBILITY_VECTOR レジストリー変数をリセットしても、そのデータベースについて NUMBER サポートを無効にすることはできません。 同様に、NUMBER サポートを無効にしてデータベースを作成した場合は、DB2_COMPATIBILITY_VECTOR レジストリー変数を設定しても、そのデータベースについて NUMBER サポートを後から有効にすることはできません。

効果

number_compat データベース構成パラメーターを ON に設定すると、次のような効果があります。

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) として明示的に定義してください。

数値リテラルのサポートに変更はありません。整数、10 進数、および浮動小数点定数の規則が引き続き適用されます。 こうした規則によって、10 進リテラルが 31 桁に、浮動小数点リテラルがバイナリー倍精度浮動小数点値の範囲に制限されます。 必要な場合には、(CAST 仕様または DECFLOAT 関数による) ストリングから DECFLOAT(34) へのキャストは、DECIMAL または DOUBLE の範囲を超えて、DECFLOAT(34) の範囲までの値に対して使用できます。 末尾が D (64 ビットのバイナリー浮動小数点値を表す)、および末尾が F (32 ビットのバイナリー浮動小数点値を表す) である数値リテラルは、現在サポートされていません。 E を含む数値リテラルはデータ・タイプ DOUBLE であり、CAST 仕様またはキャスト関数 REAL を使用して、REAL にキャストすることができます。

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

CREATE SEQUENCE ステートメントの順序値で使用されるデフォルトのデータ・タイプは、INTEGER ではなく DECIMAL(27) になります。

DECIMAL または DECFLOAT データ・タイプを含むすべての算術演算と算術関数または数学関数は、10 進浮動小数点を使用して正しく実行され、データ・タイプ DECFLOAT(34) の値が戻されます。 このタイプのパフォーマンスは、両方のオペランドのデータ・タイプが DECIMAL または DECFLOAT (16) である算術演算にも適用されます。これは、 の「 算術演算子を使用する式 」セクションの 10 進数演算の説明とは異なります。 また、整数データ・タイプ (SMALLINT、INTEGER、BIGINT) しか含まないすべての除算演算子は、10 進浮動小数点を使用して正しく実行できます。 こうした演算では、整数データ・タイプではなく、データ・タイプが DECFLOAT(34) である値が戻されます。 整数オペランドを使用してゼロによる除算を行うと、無限大が戻され、エラーではなく警告が表示されます。

解決処理中にデータ・タイプ DECIMAL の引数が DECFLOAT 値と見なされるように、関数解決も変更される場合があります。 さらに、NUMBER(p[,s]) データ・タイプに対応する引数を持つ関数は、引数のデータ・タイプが NUMBER である場合と同様に、正しく処理されます。 ただし、引数の数が可変であり、結果データ・タイプが引数のデータ・タイプ・セットに基づく関数のセットにはデータ・タイプが、このような関数解決の変更は適用されません。 このセットには、次のような関数が含まれています。
  • COALESCE
  • DECODE
  • GREATEST
  • LEAST
  • MAX (scalar)
  • MIN (scalar)
  • NVL
  • 価値
数値関数に対する一般的な変更に加えて、MOD 関数には、さらに特殊な考慮事項が適用されます。 MOD 関数の第 2 引数が 0 の場合、この関数は最初の引数の値を返します。
結果データ・タイプの規則が拡張され、DECIMAL 結果データ・タイプの精度を超える場合に結果データ・タイプを 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 データの文字ストリングへのキャストを行うと、小数点以下のゼロがすべて削除されます。

Db2 バージョン 10.5 フィックスパック 4 以降、 NUMBER サポートが有効になっているデータベースでは、整数入力を持つ組み込み関数 STDDEV、VAR、および VARIANCE は DOUBLE ではなく DECFLOAT を返します。 この関数に依存する結果タイプを持つビュー列またはマテリアライズ照会表 (MQT) 列は、そのビューまたは MQT が再生成または再作成されるまで、引き続き古い結果タイプを返します。 MQT の場合、以前 MQT にルーティングされていた照会があれば、再作成されるまで MQT にルーティングされなくなります。

クライアント/サーバーの互換性

NUMBER データ・タイプがサポートされている Db2 データベース・サーバーと共に作動しているクライアント・アプリケーションでは、サーバーから NUMBER データ・タイプを受信することはありません。 Oracle サーバーから NUMBER を報告する列または式は、 Db2 データベース・サーバーから DECIMAL または DECFLOAT を報告します。

Oracle 環境では丸めモードに四捨五入を使用するため、クライアントの丸めモードがサーバーの丸めモードに一致していることが重要です。 これは、db2cli.ini ファイルの設定が decflt_rounding データベース構成パラメーターの値に一致しなければならないことを意味します。 Oracle の丸めモードに最も近くするには、データベース構成パラメーターで ROUND_HALF_UP を指定してください。

制約事項

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