DB2 9.5 引入 DECFLOAT(十進制浮點數),結合 DECIMAL 精度與 FLOAT 效能優勢,專為精確十進制業務資料設計。REAL/DOUBLE 採二進制近似,不適合商業應用。DECFLOAT 提供兩種精度:
超越 DECIMAL(31) 31 位上限,可儲存超長精度浮點數。
| 精度(位) | 長度(字節) | 範圍 |
|---|---|---|
| 16 | 8 | ±1.0×10-383 至 ±9.999...×10384 |
| 34 | 16 | ±1.0×10-6143 至 ±9.999...×106144 |
CREATE TABLE EMPLOYEE (
SALARY DECFLOAT,
BONUS DECFLOAT(16),
COMMISSION DECFLOAT(34)
);
INSERT INTO EMPLOYEE VALUES (
1234567890123456789,
12345678901234,
1234567890123456789012345678901
);
超過 31 位數值須用字串建構函數:DECFLOAT('1234567890123456789012345678902')。精度不足時自動以科學記號顯示(如 BONUS 欄)。
CREATE TABLE EMPLOYEE (
SALARY DEC(14,2),
BONUS DECFLOAT(16),
COMMISSION DECFLOAT(34)
);
INSERT INTO EMPLOYEE VALUES (123456.78, 1234567890.12, 123456789012345678901234.56);
-- 插入更高精度值
INSERT INTO EMPLOYEE VALUES (123456.7891, 1234567890.1234, 123456789012345678901234.5678);
-- SALARY 遭截斷,BONUS/COMMISSION 完整保留
由資料庫層級 decflt_rounding 參數控制,應用程式無法變更,可用 CURRENT DECFLOAT ROUNDING MODE 查詢。支援 5 種 IEEE 標準模式:
| 模式 | 說明 | 12.345 範例 |
|---|---|---|
| ROUND_CEILING | 向正無窮大 | 12.35 |
| ROUND_DOWN | 向零截斷 | 12.34 |
| ROUND_FLOOR | 向負無窮大 | 12.34 |
| ROUND_HALF_EVEN | 銀行家捨入(預設) | 12.34 |
| ROUND_HALF_UP | 四捨五入 | 12.35 |
完整對照表見原文表 2。
InfoSphere Federation Server V9.7 引入 DECFLOAT 支援,實現本地/遠端 DECFLOAT 透明映射與操作。適用遠端資料庫:DB2 LUW V9.5+ 與 Oracle。
-- 遠端建表
CREATE TABLE T1 (c1 DECFLOAT(16));
CREATE TABLE T2 (c1 DECFLOAT(34)); -- 或 DECFLOAT
-- 本地建立別名
CREATE NICKNAME N1 FOR SERVER.SCHEMA.T1;
CREATE NICKNAME N2 FOR SERVER.SCHEMA.T2;
建立別名後可對含 DECFLOAT 的別名執行任何允許的 SQL 操作。
CREATE TABLE N1 (c1 DECFLOAT) OPTIONS(REMOTE_SERVER server_name, REMOTE_SCHEMA server_schema);
CREATE TABLE N1 (c1 DECFLOAT(34)) OPTIONS(...);
CREATE TABLE N1 (c1 DECFLOAT(16)) OPTIONS(...);
ALTER NICKNAME N1 ALTER COLUMN C1 LOCAL TYPE DECFLOAT;
-- 必須改為相容類型,否則報 SQL1357N
預設映射:遠端 DECFLOAT(16)↔本地 DECFLOAT(16),遠端 DECFLOAT(34)↔本地 DECFLOAT(34)。Oracle 無 DECFLOAT,需用 ALTER NICKNAME ALTER COLUMN TYPE DECFLOAT 將 NUMBER 映射為 DECFLOAT。
可用 CREATE TYPE MAPPING 自訂 Forward/Reverse 映射(如 DECFLOAT↔SMALLINT),超出目標範圍插入報 SQL0413N 溢位錯誤。
更新支援 DECFLOAT 的函數映射:
範例:SELECT C1, QUANTIZE(C1, DECFLOAT(0.01)) QUANT FROM N1。若本地/遠端捨入模式相同,整句 SQL 下推遠端執行。
遠端分區表有索引時,建立別名自動獲取索引資訊。索引異動或基於遠端視圖時,可用 SPECIFICATION ONLY 建立本地索引規範供優化器參考:CREATE INDEX NIDX1 ON NICK1(C1) SPECIFICATION ONLY。
支援在含 DECFLOAT 欄的別名上建立視圖,或對遠端視圖建立別名。
兩種模式:
CREATE PROCEDURE ... SOURCE ... FOR SERVER ...,CALL 執行DYNAMIC RESULT SETS 1 並 OPEN 游標,本地 WITH RETURN TO CLIENT ALL 建立對應程序新增 Server Option SAME_DECFLT_ROUNDING:
'Y':本地/遠端捨入模式相同'N':不同(預設,保守策略,受捨入影響操作不下推)設定方式:
CREATE SERVER S1 TYPE DB2/CS VERSION 10 WRAPPER W1 AUTHORIZATION "AUTHID" PASSWORD "PWD"
OPTIONS (DBNAME 'DBNAME', SAME_DECFLT_ROUNDING 'Y');
ALTER SERVER S1 OPTIONS (SET SAME_DECFLT_ROUNDING 'Y');
無效值(如 'B')報 SQL1882N。設 'Y' 使用者須自負責任,實際模式不同時會導致不準確結果。