首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

IBM InfoSphere Federation Server V9.7 DECFLOAT 資料類型完整支援指南

     編輯:DB2 教學

DECFLOAT 概觀

DB2 9.5 引入 DECFLOAT(十進制浮點數),結合 DECIMAL 精度與 FLOAT 效能優勢,專為精確十進制業務資料設計。REAL/DOUBLE 採二進制近似,不適合商業應用。DECFLOAT 提供兩種精度:

  • DECFLOAT(16):16 位精度,8 字節儲存
  • DECFLOAT(34):34 位精度,16 字節儲存(預設)

超越 DECIMAL(31) 31 位上限,可儲存超長精度浮點數。

數值表示範圍

精度(位)長度(字節)範圍
168±1.0×10-383 至 ±9.999...×10384
3416±1.0×10-6143 至 ±9.999...×106144

DECFLOAT 基本用法

建表與插入

CREATE TABLE EMPLOYEE (
  SALARY DECFLOAT,
  BONUS DECFLOAT(16),
  COMMISSION DECFLOAT(34)
);

INSERT INTO EMPLOYEE VALUES (
  1234567890123456789,
  12345678901234,
  1234567890123456789012345678901
);

超過 31 位數值須用字串建構函數:DECFLOAT('1234567890123456789012345678902')。精度不足時自動以科學記號顯示(如 BONUS 欄)。

DECFLOAT vs DECIMAL 差異

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。

聯邦環境 DECFLOAT 支援

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 操作。

透明 DDL 與 ALTER NICKNAME

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 的函數映射:

  • 聚合函數:AVG, CORRELATION, COUNT, COUNT_BIG, COVARIANCE, GROUPING, MAX, MIN, 回歸函數, STDDEV, SUM, VARIANCE
  • 純量函數:BIGINT, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, REAL, SMALLINT, ABS, CHAR, EXP, LN, LOG, LOG10, MOD, POWER, ROUND, SQRT, CEILING, COALESCE, DEGREES, FLOOR, HEX, LENGTH, NULLIF, RADIANS, SIGN, TRUNCATE, VALUE
  • 新增 DECFLOAT 專用:DECFLOAT, QUANTIZE, TOTALORDER, COMPARE_DECFLOAT, NORMALIZE_DECFLOAT

範例:SELECT C1, QUANTIZE(C1, DECFLOAT(0.01)) QUANT FROM N1。若本地/遠端捨入模式相同,整句 SQL 下推遠端執行。

索引與視圖

遠端分區表有索引時,建立別名自動獲取索引資訊。索引異動或基於遠端視圖時,可用 SPECIFICATION ONLY 建立本地索引規範供優化器參考:CREATE INDEX NIDX1 ON NICK1(C1) SPECIFICATION ONLY。

支援在含 DECFLOAT 欄的別名上建立視圖,或對遠端視圖建立別名。

預存程序支援

兩種模式:

  1. IN/OUT 參數無結果集:遠端建表/建預存程序,本地 CREATE PROCEDURE ... SOURCE ... FOR SERVER ...,CALL 執行
  2. 無輸入參數有結果集:遠端預存程序宣告 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' 使用者須自負責任,實際模式不同時會導致不準確結果。

總結

  • 16/34 位 DECFLOAT 強化十進制浮點精確處理與計算效能
  • 別名、類型/函數映射實現遠端 DECFLOAT 透明存取,最大化查詢效率
  • 捨入模式控制確保本地/遠端計算結果一致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved