IBM InfoSphere Federation Server V9.7 中 DECFLOAT 数据类型及相关语义支持
2010-01-20 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

DB2 9.7 提供了许多新的 SQL 功能:包括新的 SQL 数据操纵语句,以及 DECFLOAT(十进制浮点小数)、NUMBER、VARCHAR2 和 TIMPSTAMP 等新的数据类型在 IBM InfoSphere Federation Server 上的应用。本文主要是介绍一下 IBM InfoSphere Federation Server 对十进制浮点数(DECFLOAT)的支持。
DECFLOAT 简介
DECFLOAT 是 DB2 9.5 引入的一种新的数据类型,它是一种十进制浮点数据类型,适合处理精确的十进制业务数据。浮点数据类型例如 REAL 和 DOUBLE 类型都只是通过二进制近似方式来处理十进制数据,所以它们不适合大部分使用十进制数据的商业应用。
DECFLOAT 合并了 DECIMAL 类型的精度和 FLOAT 类型的一些性能优势,所以它是一种结果精确而且处理高效的数据类型。
DECFLOAT 提供 16 位和 34 位两种精度的浮点数据类型。分别为表示为 DECFLOAT(16) 和 DECFOAT(34)。如果没有指明精度,DECFLOAT 默认为 DECFLOAT(34)。这两种精度的数据分别存储在 8 字节和 16 字节的空间里。
表 1. DECFLOAT 类型数据表示范围
精度(位) | 长度(字节) | 范围 |
16 | 8 | -9.999999999999999 x 10384to -1.0 x 10-383: 1.0 x 10-383to 9.999999999999999 x 10384 |
34 | 16 | -9.999999999999999999999999999999999 x 106144to -1.0 x 10-6143: 1.0 x 10-6143to 9.999999999999999999999999999999999 x 106144 |
DECFLOAT 使用
下面通过一些例子,简单地描述以下 DECFLOAT 类型的基本用法。我们首先创建一个包含 DECFLOAT 类型的表,往表中插入一些数据。
CREATE TABLE EMPLOYEE
(
SALARY DECFLOAT,
BONUS DECFLOAT(16),
COMMISSION DECFLOAT(34)
);
INSERT INTO EMPLOYEE VALUES
(
1234567890123456789,
12345678901234,
1234567890123456789012345678901
);
SELECT * FROM EMPLOYEE;
SALARY | BONUS | COMMISSION |
1234567890123456789 | 12345678901234 | 1234567890123456789012345678901 |
在 DB2 9.5 之前,我们最多只能往数据库中插入由 DECIMAL 类型支持的 31 位长的浮点数据。然而,由于 DB2 9.5 引入了 DECFLOAT 数据类型,我们可以插入超过 31 位长的浮点数据。
DELETE FROM EMPLOYEE;
INSERT INTO EMPLOYEE VALUES
(
1234567890123456789,
DECFLOAT('1234567890123456789012345678902'),
DECFLOAT('1234567890123456789012345678901234')
);
SELECT * FROM EMPLOYEE;
SALARY | BONUS | COMMISSION |
1234567890123456789 | 1.234567890123457E+30 | 1234567890123456789012345678901234 |
注:由于 DECFLOAT(16) 类型没有足够的位来显示整个数据,BONUS 列的数据采用指数类型表示。
DECFLOAT(16) 占用 8 字节空间而 DECFLOAT(34) 占用 16 字节空间。DEC(31,0) 占用的空间必须在软件层面计算出来,而 DECFLOAT 在硬件层面就已经潜在地表示为 16 字节数据。
TBNAME | NAME | COLTYPE | LENGTH | SCALE |
EMPLOYEE | BONUS | DECFLOAT | 8 | 0 |
EMPLOYEE | COMMISSION | DECFLOAT | 16 | 0 |
EMPLOYEE | SALARY | DECFLOAT | 16 | 0 |
我们再通过下面这个例子来说明 DECFLOAT 类型和 DECIMAL 类型的不同。
DROP TABLE EMPLOYEE;
CREATE TABLE EMPLOYEE
(
SALARY DEC(14,2),
BONUS DECFLOAT(16),
COMMISSION DECFLOAT(34)
);
INSERT INTO EMPLOYEE VALUES
(
123456.78,
1234567890.12,
123456789012345678901234.56
);
SELECT * FROM EMPLOYEE;
SALARY | BONUS | COMMISSION |
123456.78 | 1234567890.12 | 123456789012345678901234.56 |
如果我们插入精度更大的数据,对于 BONUS 和 COMMISSION 这两列,我们不需要作任何更改,而对于 SALARY 列,那就需要修剪数据使得数据符合 DECIMAL 列指明的精度。
INSERT INTO EMPLOYEE VALUES
(
123456.7891,
1234567890.1234,
123456789012345678901234.5678
);
SELECT * FROM EMPLOYEE;
SALARY | BONUS | COMMISSION |
123456.78 | 1234567890.1234 | 123456789012345678901234.5678 |
DECFLOAT 舍入模式
DECFLOAT 数据类型允许使用不同形式的舍入模式(rounding)。舍入模式是指当数据值超过数据类型的精度时,应该如何舍入数据。DB2 通过 decflt_rounding 配置参数来控制舍入模式,这是在数据库级上实现的。一个应用程序是无法改变舍入模式的,但是可以通过 CURRENT DECFLOAT ROUNDING MODE 命令来查询当前的舍入模式。
DB2 支持五种符合 IEEE 标准的十进制浮点数舍入模式。舍入模式指定在计算结果超过精度时如何舍入结果。所有舍入模式的定义如下所示:
ROUND_CEILING
向正无穷大方向舍入。如果删除的所有位都是零,或者符号为负号,那么结果不变。 否则,结果系数应增加 1(向上舍入)。12.456 和 12.451 舍入后为 12.46。
ROUND_DOWN
朝着 0 的方向舍入(截断),忽略被废弃的位。12.456 和 12.451 舍入后为 12.45。
ROUND_FLOOR
向负无穷大方向舍入。如果删除的所有位都是零,或者符号为正号, 那么结果不变。否则,如果符号为负号,那么结果系数应增加 1。12.456 和 12.451 舍入后为 12.45。 和 ROUND_DOWN 不同的是,对于负数例如 -12.456,舍入后为 -12.46,而 ROUND_DOWN 模式舍入后为 -12.45。
ROUND_HALF_EVEN
舍入为最接近的整数。如果向上舍入与向下舍入是等距的,那么按照使得最后一位为偶数的目标来进行舍入;如果被废弃的位大于它左边位置中值 1 的一半(0.5),那么结果系数应增加 1(向上舍入);如果它们小于一半,那么不会调整结果系数,即忽略被废弃的位。否则,如果结果系数最右边的一位是偶数,在它们表示刚好一半的情况下,结果系数不会改变;如果结果系数最右边的一位是奇数,那么结果系数应增加 1(向上舍入),以使它变成偶数位。根据 IEEE 十进制浮点数规范,此舍入模式是缺省舍入模式,并且它是 DB2 产品中的缺省舍入模式。12.456 舍入后为 12.46。12.445 舍入后为 12.44。
ROUND_HALF_UP
舍入为最接近的整数。如果向上舍入与向下舍入是等距的,那么向上舍入并使结果系数增加 1;如果被删除的位大于或等于它左边位置中值 1 的一半(0.5),那么结果系数应增加 1(向上舍入)。否则,将忽略被删除的位(小于或等于 0.5)。12.456 舍入后为 12.46,12.451 舍入后为 12.45。
如果没有特别的设置指明,DB2 默认的舍入模式为 ROUND_HALF_EVEN。
表 2. DECFLOAT 类型数据在不同舍入模式下的结果
舍入模式 | 12.341 | 12.345 | 12.349 | 12.355 | -12.345 |
ROUND_CEILING | 12.35 | 12.35 | 12.35 | 12.36 | -12.34 |
ROUND_FLOOR | 12.34 | 12.34 | 12.34 | 12.35 | -12.35 |
ROUND_HALF_UP | 12.34 | 12.35 | 12.35 | 12.36 | -12.35 |
ROUND_HALF_EVEN | 12.34 | 12.34 | 12.35 | 12.36 | -12.34 |
ROUND_DOWN | 12.34 | 12.34 | 12.34 | 12.35 | -12.34 |
Federation DECFLOAT 支持
前面我们说过 DB2 v9.5 引入了 DECFLOAT 这种新的数据类型。而后 IBM InfoSphere Federation Server v9.7 也引入 DECFLOAT 数据类型,使得 DECFLOAT 可以支持联邦数据库环境。这就意味着,当远程数据库中有一个 DECFLOAT 数据,在联邦数据库环境下,本地数据库也有一个 DECFLOAT 数据与之相对应,可以实现远程的与本地的 DECFLOAT 类型的数据映射。因此,我们通过 IBM InfoSphere Federation Server 来透明地访问和控制远程 DECFLOAT 类型的数据。
IBM InfoSphere Federation Server v9.7 对于 DECFLOAT 的支持只适用于远程数据库为 DB2 LUW V9.5 及以上版本和 Oracle 的应用情况。
Federation DECFLOAT 使用
由于 IBM InfoSphere Federation Server 支持 DECFLOAT 数据类型,因此我们可以在包含 DECFLOAT 类型的远程对象(表或是视图)上创建昵称(NICKNAME)。例如,假设在远程创建下列 DB2/LUW 表:
创建一个包含 16 位 DECFLOAT 类型列的表:
CREATE TABLE T1 (c1 DECFLOAT(16))
创建一个包含 34 位 DECFLOAT 类型列的表:
CREATE TABLE T1 (c1 DECFLOAT(34)) or CREATE TABLE T1 (c1 DECFLOAT)
在 IBM InfoSphere Federation Server 上,用户可以基于上面的表创建相对应的昵称:
创建基于 16 位 DECFLOAT 类型列的远程表的昵称 N1:
CREATE NICKNAME N1 FOR SERVER.SCHEMA.T1
创建基于 34 位 DECFLOAT 类型列的远程表的昵称 N1:
CREATE NICKNAME N2 FOR SERVER.SCHEMA.T2
一旦创建了昵称,那就可以对包含 DECFLOAT 类型的昵称进行昵称所允许的任何 SQL 操作。
昵称(Nickname)
创建基于 DECFLOAT 数据的昵称
CREATE TABLE t1 (c1 DECFLOAT);
CREATE NICKNAME N1 for server.schema.t1;
Transparent DDL
CREATE TABLE N1 (c1 DECFLOAT)
OPTIONS(REMOTE_SERVER server_name, REMOTE_SCHEMA server_schema)
OR
CREATE TABLE N1 (c1 DECFLOAT(34))
OPTIONS(REMOTE_SERVER server_name, REMOTE_SCHEMA server_schema)
CREATE TABLE N1 (c1 DECFLOAT(16))
OPTIONS(REMOTE_SERVER server_name, REMOTE_SCHEMA server_schema)
Alter Nickname Alter Column
ALTER NICKNAME N1 ALTER COLUMN C1 LOCAL TYPE DECFLOAT
如果你改变一个列的数据类型,必须改为数据源相对应列的数据类型相兼容的数据类型。否则改为不兼容的类型将导致系统报错。例如,一个用户将类型为 DATE 的远程数据列的本地类型改为 DECFLOAT,系统就会报出 SQL1357N 的错。
ALTER NICKNAME N1 ALTER COLUMN C1 LOCAL TYPE DECFLOAT
DB21034E The command was processed as an SQL statement because it was not a valid
Command Line Processor command. During SQL processing it returned:
SQL1357N The specified data type is invalid as the local data type for a data type
mapping from a data source. Reason code = "3". Altering the local type to the
specified data type is not allowed. SQLSTATE=42815
类型映射(Type Mapping)
IBM InfoSphere Federation Server 会为 DECFLOAT 类型提供一组默认的类型映射。下面的表格列出了 DECFLOAT 可用的一些类型映射:
表 3. DECFLOAT 类型映射
远程类型名 | 远程精度 | 本地映射类型 | 本地映射精度 |
DECFLOAT | 16 | DECFLOAT | 16 |
DECFLOAT | 34 | DECFLOAT | 34 |
以上表所示的类型映射是适用于远程数据源为 DB2 LUW V9.5 及以上版本的应用情况,而对于远程数据源为 ORACLE 的情况,由于 ORACLE 没有 DECFLOAT 类型,而有 NUMBER 数值类型,所以我们采用 ALTER NICKNAME ALTER COLUMN TYPE 为 DECFLOAT 类型的方式,也就是将 ORACLE NUMBER 类型的默认本地映射类型更改为 DECFLOAT 的方式来支持本地 DECFLOAT 与 ORACLE NUMBER 的类型映射。
用户可以通过 CREATE TYPE MAPPING 和 CREATE NICKNAME 语句来改变默认的类型映射。
创建一个 Forward 类型映射:
CREATE TYPE MAPPING TM1 FROM LOCAL TYPE DECFLOAT TO SERVER TYPE db2/cs
REMOTE TYPE SMALLINT
创建一个昵称 N1:
CREATE NICKNAME N1 FOR SERVER.SCHEMA.T1
创建昵称后,系统会自动将远程 SMALLINT 类型在本地映射成 DECFLOAT 类型。注意:当我们在本地昵称 N1 上插入一个超过 SMALLINT(-32,768 到 +32,767) 范围的值时,系统会返回一个 SQL0413N 的错,指明插入的值溢出。
同理,用户可以创建一个 Reverse 类型映射:
CREATE TYPE MAPPING TM2 FROM SERVER TYPE db2/cs REMOTE TYPE DECFLOAT
TO LOCAL TYPE SMALLINT
同样创建一个昵称 N2:
CREATE NICKNAME N2 FOR SERVER.SCHEMA.T2
创建昵称后,系统会自动将远程 DECFLOAT 类型在本地映射成 SMALLINT 类型。注意:当我们在本地昵称 N2 上插入一个超过 SMALLINT(-32,768 到 +32,767) 范围的值时,系统会返回一个 SQL0413N 的错,指明插入的值溢出。
另外,前面我们说过,用户也可以通过 ALTER NICKNAME 语句来改变默认的类型映射。
ALTER NICKNAME N2 ALTER COLUMN C1 LOCAL TYPE SMALLINT
更改昵称后,系统会自动将远程 DECFLOAT 类型在本地映射成 SMALLINT 类型。注意:当我们在本地昵称上插入一个超过 SMALLINT(-32,768 到 +32,767) 范围的值时,系统同样会返回一个 SQL0413N 的错,指明插入的值溢出。
函数映射(Function Mapping)
我们在 IBM InfoSphere Federation Server v9.7 中更新了下列函数的函数映射,因此它们可以支持 DECFLOAT 数据类型。
聚集函数 (Aggregate Functions)
AVG (sysibm)
CORRELATION (sysibm)
COUNT (sysibm)
COUNT_BIG (sysibm)
COVARIANCE (sysibm)
GROUPING (sysibm)
MAX (sysibm)
MIN (sysibm)
Regression functions (sysibm)
STDDEV (sysibm)
SUM (sysibm)
VARIANCE (sysibm)
标量函数(Scalar Functions)
BIGINT (sysibm)
DATE (sysibm)
DECIMAL (sysibm)
DOUBLE (sysibm) (sysfun)
FLOAT (sysibm)
INTEGER (sysibm)
REAL (sysibm)
SMALLINT (sysibm)
ABS or ABSVAL (sysibm)
CHAR (sysibm) (sysfun)
EXP (sysfun)
LN (sysfun)
LOG (sysfun)
LOG10 (sysfun)
MOD (sysfun)
POWER (sysfun)
ROUND (sysibm) (sysfun)
SQRT (sysfun)
CEILING or CEIL (sysibm) (sysfun)
COALESCE (sysibm)
DEGREES (sysfun)
FLOOR (sysibm) (sysfun)
HEX (sysibm)
LENGTH (sysibm)
NULLIF (sysibm)
RADIANS (sysfun)
SIGN (unknown)
TRUNCATE or TRUNC (sysibm) (sysfun)
VALUE (sysibm)
另外,我们还在 IBM InfoSphere Federation Server 中加入一些函数映射,用以支持 DECFLOAT 数据类型:
DECFLOAT
QUANTIZE
TOTALORDER
COMPARE_DECFLOAT
NORMALIZE_DECFLOAT
因此,我们可以使用上述函数来对 DECFLOAT 数据进行查询:
SELECT C1, QUANTIZE(C1, DECFLOAT(0.01)) QUANT FROM N1
对于上述这个例子,假设本地联邦数据库和远程数据源具有相同舍入模式,那么整个 SQL 语句都将会被下推到远程数据源执行。
索引(Index)
IBM InfoSphere Federation Server v9.7 对于 DECFLOAT 的支持同样体现在联邦数据库环境下创建索引上。例如,远程数据源有表 T1,T2,并有索引 IDX1,IDX2。
CREATE TABLE T1 (C1 DECFLOAT(16))
CREATE INDEX IDX1 ON T1(C1)
CREATE TABLE T2 (C1 DECFLOAT)
CREATE INDEX IDX2 ON T2(C1)
在 T1,T2 上创建昵称,同时本地联邦数据库服务器就取得了昵称对应的远程表的相关信息,包括远程索引信息。但是当创建昵称后昵称相应的远程表上的索引被更改了或者是昵称是基于远程视图的情况下,那就可以在昵称上创建索引,并使用 SPECIFICATION ONLY 指明索引规范,以便 IBM InfoSphere Federation Server 优化器利用索引提高效率。
CREATE INDEX NIDX1 ON NICK1(C1) SPECIFICATION ONLY
CREATE INDEX NIDX2 ON NICK2(C2) SPECIFICATION ONLY
视图(View)
在 IBM InfoSphere Federation Server v9.7 中,我们可以通过 CREATE VIEW 语句在昵称上创建视图,且昵称中含有 DECFLOAT 类型列。
在昵称 N1 上创建视图 V1,N1 中的列 C1 是 DECFLOAT 类型:
CREATE VIEW V1 AS SELECT * FROM N1 WHERE C1 > 10000.0;
SELECT * FROM V1;
另外,可以在远程数据源上的表 T2 上创建视图 V2:
CREATE TABLE T2 (C1 DECFLOAT);
CREATE VIEW V2 AS SELECT * FROM T2 WHERE C1 > 10000.0;
然后在本地联邦数据库服务器上对 V2 创建昵称 N2:
CREATE NICKNAME N2 FOR SERVER.SCHEMA.V2;
SELECT * FROM N2;
存储过程(Stored Procedure)
在 IBM InfoSphere Federation Server v9.7 中,我们可以创建存储过程,用于访问和控制 DECFLOAT 类型数据,这主要有以下两种应用情况:
只使用 IN 和 OUT 参数,并且没有结果输出的存储过程:
在远程数据源上创建包含 DECFLOAT 类型列的表:
DROP TABLE SP@
CREATE TABLE SP(
PARAM CHAR(1),
COLDFP DECFLOAT)@
在远程数据源上创建使用 IN 和 OUT 参数的存储过程 SP_DFP_IO,使用输入参数 ARGI 来更新远程表 SP,并查询 SP,将得到的结果赋值给输出参数 ARGO:
CREATE PROCEDURE SP_DFP_IO (IN ARGI DECFLOAT, OUT ARGO DECFLOAT)
LANGUAGE SQL
BEGIN
UPDATE SP
SET COLDFP = ARGI
WHERE PARAM = 'I';
SELECT COLDFP
INTO ARGO
FROM SP
WHERE PARAM = 'O';
END@
在 IBM InfoSphere Federation Server 上创建基于远程数据源上的存储过程的过程 PROCEDURE:
CREATE PROCEDURE SP_DFP_IO SOURCE SCHEMA.SP_DFP_IO FOR SERVER S1@
在本地联邦数据库服务器上调用存储过程 SP_DFP_IO:
CALL SP_DFP_IO (50.125,?)
没有使用输入输出参数,并且有结果返回的存储过程:
在远程数据源上创建包含 DECFLOAT(16) 类型列的表:
DROP TABLE SP16@
CREATE TABLE SP16(
PARAM CHAR(1),
COLDFP DECFLOAT(16))@
在远程数据源上创建存储过程 SP_DFP_RS,没有使用输入参数,并返回结果:
CREATE PROCEDURE SP_DFP_RS() DYNAMIC RESULT SETS 1
LANGUAGE SQL
READS SQL DATA
BEGIN
BEGIN DECLARE clientcur CURSOR WITH RETURN TO CLIENT
FOR SELECT *
FROM SP16;
OPEN clientcur;
END;
END
在本地联邦数据库服务器上创建基于远程数据源上的存储过程的过程 PROCEDURE: CREATE PROCEDURE SP_DFP_RS SOURCE SCHEMA.SP_DFP_RS FOR SERVER S1 WITH RETURN TO CLIENT ALL
在本地联邦数据库服务器上调用存储过程 SP_DFP_RS:
CALL SP_DFP_RS ()
Federation DECFLOAT 舍入模式
由于 DECFLOAT 数据类型支持五种符合 IEEE 标准的十进制浮点数舍入模式,在 IBM InfoSphere Federation Server v9.7 中,如果远程数据源有 DECFLOAT 类型数据且本地服务器会对远程 DECFLOAT 数据进行查询和计算的情况下,为了在本地服务器和远程数据源间获得一致性结果,我们引入一个新的 Server Option:SAME_DECFLT_ROUNDING,用于指明远程数据源和本地联邦数据库服务器是否具有相同的舍入模式。 SAME_DECFLT_ROUNDING 有两个有效值:
'Y' : 指明远程数据源和本地联邦数据库服务器的舍入模式相同。
'N' : 指明远程数据源和本地联邦数据库服务器的舍入模式不同。
SAME_DECFLT_ROUNDING 的默认值为’ N ’。也就是说,如果 SAME_DECFLT_ROUNDING 没有被重设,那么我们认为本地服务器和远程数据源之间的舍入模式是不同的。这是一种比较保守的方式,这样可以使得一些受舍入模式影响的操作不被下推到远程数据源执行,从而保证结果的准确性。
如果远程数据源的舍入模式和本地联邦数据库服务器的舍入模式不同,DECFLOAT 类型数据的计算结果超过定义的 DECFLOAT 类型的精度时,那么有关 DECFLOAT 数据计算的操作就不能够下推到远程数据源进行处理。反之,如果两者的舍入模式相同,为了提高本地联邦数据库访问和操作远程 DECFLOAT 数据的效率,可以采用两种方式来设置 SAME_DECFLT_ROUNDING:
在 CREATE SERVER 时指定 SAME_DECFLT_ROUNDING 值为’ Y ’
创建一个 SERVER S1,指明为相同的舍入模式。
CREATE SERVER S1 TYPE DB2/CS VERSION 10 WRAPPER W1 AUTHORIZATION "AUTHID" PASSWORD "PWD"
OPTIONS (DBNAME 'DBNAME', SAME_DECFLT_ROUNDING ‘ Y ’ );
通过 ALTER SERVER 语句来重设 SAME_DECFLT_ROUNDING 为’ Y ’。
创建一个 SERVER S1,指明为不同的舍入模式。
CREATE SERVER S1 TYPE DB2/CS VERSION 10 WRAPPER W1 AUTHORIZATION "AUTHID" PASSWORD "PWD"
OPTIONS (DBNAME 'DBNAME', SAME_DECFLT_ROUNDING ‘ N ’ );
修改 S1 的设置,重设舍入参数,指明为相同的舍入模式。
ALTER SERVER S1 OPTIONS (SET SAME_DECFLT_ROUNDING ‘ Y ’ );
如果使用除’ Y ’或’ N ’之外的无效值来设置 SAME_DECFLT_ROUNDING,系统会返回一个 SQL1882N 的错误信息。
ALTER SERVER S1 OPTIONS (SET SAME_DECFLT_ROUNDING 'B')
DB21034E The command was processed as an SQL statement because it was not a valid
Command Line Processor command. During SQL processing it returned:
SQL1882N The "SERVER" option "SAME_DECFLT_ROUNDING" cannot be set to "B" for "S1".
SQLSTATE=428EF
注意:设置 SAME_DECFLT_ROUNDING 为’ Y ’的用户必须为这个操作所导致的后果负责。如果本地服务器和远程数据源间实际的舍入模式不同,那么重置操作将导致得到不准确的结果。
结束语
我们在联邦数据库环境下引入 DECFLOAT 数据类型的支持,使得 IBM InfoSphere Federation Server 可以透明访问和操作远程的 DECFLOAT 数据类型。具体功能概括如下:
使用 DB2 提供 16 位和 34 位两种精度的 DECFLOAT 浮点数据类型,进一步增强了 IBM InfoSphere Federation Server 精确处理的十进制浮点数据的能力,并且大大提高计算十进制浮点数据的性能。
对于远程的 16 位和 34 位两种精度的 DECFLOAT 浮点数据类型的表和视图,IBM InfoSphere Federation Server 可以通过创建昵称,作相应的类型映射和函数映射,来透明地访问和操作远程的 DECFLOAT 类型数据,并最大化地提高 DECFLOAT 数据查询的效率。
提供对 DECFLOAT 类型数据舍入模式的控制,使得 IBM InfoSphere Federation Server 在处理本地和远程的 DECFLOAT 数据时,舍入操作得到的结果一致。
总之,上述功能使得 IBM InfoSphere Federation Server 处理本地和远程数据源上的 DECFLOAT 数据的交互变为可能,并且更为简单快捷。
Tags:IBM InfoSphere Federation
编辑录入:爽爽 [复制链接] [打 印]- ››IBM WebSphere常见问题解答
- ››IBM WebSphere Studio V5相关认证资料
- ››IBM WebSphere应用服务器发展趋势
- ››IBM WebSphere Application Server诊断和调优(一...
- ››IBM WebSphere Application Server诊断和调优(二...
- ››IBM WebSphere Performance Pack服务器
- ››IBM WebSphere软件概述
- ››IBM PowerVM 实战手册,第 3 部分 : VIO server 配...
- ››IBM PowerVM 实战手册,第 2 部分 : VIO server 准...
- ››IBM p 系列服务器系统固件升级攻略
- ››IBM PowerVM 概述
- ››InfoSphere Guardium:IBM 新的数据库安全和监视软...
更多精彩
赞助商链接