1. 數據類型的改進
1.1 新數據類型 DECFLOAT 及其對 NUMBER 類型的支持
DECFLOAT( 十進制浮點數 ) 是 DB2 數據庫產品中的一個內置 SQL 數據類型。在 IBM InfoSphere Federation Server V9.7 中引入了對該數據類型的支持,這意味著將在遠程數據源的 DECFLOAT 與本地聯邦數據庫中的 DECFLOAT 建立起類型映射,它使得我們可以通過聯邦數據庫透明訪問和操作遠程的 DECFLOAT 類型。
借助於 DECFLOAT 數據類型,IBM InfoSphere Federation Server V9.7 中進一步添加了對 NUMBER 數據類型的支持,通過設置 DB2 數據庫為 NUMBER 兼容模式,我們可以在 SQL 語法中靈活使用 NUMBER 數據類型。
對 NUMBER 數據類型的支持,本地聯邦數據庫有兩種運行模式:
默認模式:該模式下不支持 NUMBER 數據類型;
NUMBER 兼容模式:該模式下支持 NUMBER 數據類型
可以在創建數據庫之前,通過設置系統變量 DB2_COMPATIBILITY_VECTOR,指定該數據庫的 NUMBER 兼容性,具體如下:
DB2_COMPATIBILITY_VECTOR=10
對 NUMBER 數據類型的支持,遠程數據源可以是 DB2 LUW V9.5 及之後版本或者 Oracle 。在本地聯邦數據庫,引入了服務器變量 NUMBER_COMPAT,用於指示遠程數據源是否具有 NUMBER 兼容性。變量的有效值為“ Y ”和“ N ”,默認值為“ N ”,該變量僅在 IBM InfoSphere Federation Server V9.7 及之後有效。
這樣在本地聯邦數據庫和遠程數據源之間就形成了四種組合運行模式,如圖 1 所示,分別為:
非 NUMBER 兼容的聯邦數據庫與非 NUMBER 兼容的遠程數據源相連;
非 NUMBER 兼容的聯邦數據庫與 NUMBER 兼容的遠程數據源相連;
NUMBER 兼容的聯邦數據庫與非 NUMBER 兼容的遠程數據源相連;
NUMBER 兼容的聯邦數據庫與 NUMBER 兼容的遠程數據源相連。
其中需要注意到是,(a)(b) 運行模式在 IBM InfoSphere Federation Server V9.7 之前就已經存在了,所不同的是 (b) 模式在遠程兼容數據源上擴展了兼容 NUMBER 的 DB2 LUW ;而 (c) 和 (d) 模式則是新加入的兩種運行模式。
圖 1. 聯邦數據庫與遠程數據源在 NUMBER 兼容上的組合運行模式
1.2 新數據類型 DECFLOAT 及其對 NUMBER 類型的支持
VARCHAR2 是 IBM InfoSphere Federation Server V9.7 中提供的一個新數據類型,該類型在 DB2 V9.5 中已經存在,它實際上是 VARCHAR 的同義詞,在內部表示上與 VARCHAR 是一致的。 VARCHAR2 類型的引入使得我們可以在聯邦數據庫 SQL 語句中方便的使用該類型。
我們知道,CHAR 的長度是固定的,當字符的存儲長度小於其定義的長度時,多余存儲位將用空格補齊。而 VARCHAR2 則不同,它並不做空格的補齊,因此其長度是變化的,實際存儲的長度因字符集的不同而不同。
IBM InfoSphere Federation Server V9.7 中的 VARCHAR2 在字符串語義上與 Oracle 中的 VARCHAR2 是類似的,它們將數據庫中 VARCHAR 列可以存儲空字符串的特性改為存儲 NULL 值,這點與 CHAR 數據類型的性質也是一樣的。因此當一個標量函數返回 0 長度的 CHAR 或者 VARCHAR 時,實際上將被當作 NULL 值處理。
對 VARCHAR2 語義的支持,本地聯邦數據庫有兩種運行模式:
默認模式:該模式下不支持 VARCHAR2 語義;
VARCHAR2 語義兼容模式:該模式下支持 VARCHAR2 語義
可以在創建數據庫之前,通過設置系統變量 DB2_COMPATIBILITY_VECTOR,指定該數據庫的 NUMBER 兼容性,具體如下:
db2set DB2_COMPATIBILITY_VECTOR=20
支持 VARCHAR2 的遠程數據源可以是 DB2 LUW V9.5 及之後版本或者 Oracle 。在本地聯邦數據庫中,通過引入服務器變量 VARCHAR2_COMPAT,指示遠程數據源是否具有 VARCHAR2 兼容性。同時還引入了另一個服務器變量 NO_EMPTY_STRING,用於指示遠程數據源的列是否包含空字符串,以更方便的進行 SQL 語句本地或遠端執行的 PUSHDOWN 分析。
結合本地聯邦數據庫和遠程數據源之間各自是否具有 VARCHAR2 語義兼容的模式,它們的連接有四種可能組合,如圖 2 所示,分別為:
非 VARCHAR2 語義兼容的聯邦數據庫與非 VARCHAR2 語義兼容的遠程數據源相連;
非 VARCHAR2 語義兼容的聯邦數據庫與 VARCHAR2 語義兼容的遠程數據源相連;
VARCHAR2 語義兼容的聯邦數據庫與非 VARCHAR2 語義兼容的遠程數據源相連;
VARCHAR2 語義兼容的聯邦數據庫與 VARCHAR2 語義兼容的遠程數據源相連。
其中需要注意到是,(a)(b) 運行模式在 IBM InfoSphere Federation Server V9.7 之前就已經存在了,所不同的是 (b) 模式現在可以支持 DB2 VARCHAR2 語義兼容的數據源;而 (c) 和 (d) 模式則是新加入的兩種運行模式。
IBM InfoSphere Federation Server V9.7 中對 VARCHAR2 語義的支持主要體現在當與遠程數據源連接時的一些基於字符的操作上。本地聯邦數據庫與遠程數據源的 VARCHAR2 語義是否一致將影響包含字符相關操作的 SQL 語句在本地或遠端執行的 PUSHDOWN 分析。
圖 2. 聯邦數據庫與遠程數據源在 VARCHAR2 兼容上的組合運行模式
1.3 TIMESTAMP(p) 數據類型增強及其對 DATE 類型的支持
TIMESTAMP 是一個由七部分組成的值 ( 年、月、日、小時、分鐘、秒和微秒 ),而 TIMESTAMP(p) 則是對 TIMESTAMP 的微秒部分加入了精度的設置,其中 p 代表精度,用於表示微秒的小數位數,參數 p 的可選值為 [0,12] 。當不指定 p 參數時,TIMESTAMP 的默認精度為 6,即 TIMESTAMP(6) 。當前 , IBM InfoSphere Federation Server V9.7 的函數全面支持 TIMESTAMP 的參數化類型 TIMESTAMP(p) 。
IBM InfoSphere Federation Server V9.7 中 TIMESTAMP(p) 參數化類型的引入使得我們可以在具有不同精度的遠程數據源和本地聯邦數據庫的 TIMESTAMP 之間建立起類型映射,而且映射的精度是可以靈活指定的,系統會自動對其進行適當的填充或截斷處理,也就是說,它使得我們可以通過聯邦數據庫透明訪問和操作遠程的 TIMESTAMP 類型。
隨著 TIMESTAMP(p) 參數化類型的引入,IBM InfoSphere Federation Server V9.7 中進一步增強了 DATE 數據類型,通過設置 DB2 數據庫為 DATE 兼容模式,系統將使用 TIMESTAMP(0) 對 DATE 進行內部的表示。可以在創建數據庫之前,通過設置數據庫的系統變量 DB2_COMPATIBILITY_VECTOR,指定該數據庫的 DATE 兼容性,具體如下:
db2set DB2_COMPATIBILITY_VECTOR=40
那麼根據是否對 DATE 類型具有兼容性,本地聯邦數據庫有兩種運行模式:
默認模式:該模式下不兼容 DATE 數據類型;
DATE 兼容模式:該模式下兼容 DATE 數據類型。
對於遠程數據源,聯邦數據庫也引入了新的服務器變量 DATE_COMPAT,用於指示遠程數據源是否具體 DATE 兼容性。變量的有效值為“ Y ”和“ N ”,默認為“ N ”,該變量僅在 IBM InfoSphere Federation Server V9.7 及之後有效。
當在本地聯邦數據庫和遠程數據源建立連接時,綜合本地和遠程的 DATE 是否兼容性特性,可以形成如下的四種組合運行模式。如圖 3 所示,分別為:
非 DATE 兼容的聯邦數據庫與非 DATE 兼容的遠程數據源相連;
非 DATE 兼容的聯邦數據庫與 DATE 兼容的遠程數據源相連;
DATE 兼容的聯邦數據庫與非 DATE 兼容的遠程數據源相連;
DATE 兼容的聯邦數據庫與 DATE 兼容的遠程數據源相連。
其中需要注意到是,(a)(b) 運行模式在 IBM InfoSphere Federation Server V9.7 之前就已經存在了,所不同的是 (b) 模式在遠程兼容數據源上擴展了兼容 DATE 的 DB2 LUW ;而 (c) 和 (d) 模式則是新加入的兩種運行模式。
本地聯邦數據庫與遠程數據源的 DATE 兼容性是否一致將影響包含 TIMESTAMP 或 DATE 的 SQL 語句在本地或遠端執行的 PUSHDOWN 分析。
圖 3. 聯邦數據庫與遠程數據源在 DATE 兼容上的組合運行模式
1.4 隱式類型轉換支持
DB2 倡導弱類型定義語言。所謂弱類型,是指一種類型可以被忽略的語言,這樣對象的類型將由它的使用環境決定,不同的使用環境將對應不同的對象類型。為了方便用戶的透明使用,在對象類型的確定過程中,將不可避免的發生隱式類型的轉換。例如,兩個類型不匹配的對象在發生比較或賦值操作時,其中一個對象的類型將參考另一對象類型尋求合理的類型解釋,這一解釋過程即隱式類型轉換。
在 DB2 V9.7 中,已經提供了隱式類型轉換的較全面支持,通過該支持既方便了用戶的使用,同時也減少了發生 SQL 遷移時語句修改的工作量。根據 DB2 V9.7 的隱式類型轉換規則,在 IBM InfoSphere Federation Server V9.7 中對隱式類型轉換支持做了進一步的增強。這些增強主要體現在:
當查詢中需要發生隱式轉換時,聯邦數據庫將在內部自動為其轉換,並對轉換結果進行本地或遠端執行的 PUSHDOWN 分析;
在 number 和 string,date 和 timestamp 等數據類型之間,添加了更多的轉換支持;
為了使更多的語句 PUSHDOWN 到遠程執行,從而提高性能,對於 UDB 數據源的 CAST 轉換函數,添加了更多的遠程默認函數映射。
通過這些隱式類型轉換增強,SQL 語法變得更加的易用和強大,同時也保持了與 DB2 V9.7 弱類型定義語言的一致性。
1.5 Teradata LOB 類型的支持
Teradata LOB 類型的支持主要是針對 Teradata 的 CLOB 和 BLOB 這兩個大對象類型進行支持,該支持使得通過聯邦數據庫可以讀遠程的 Teradata 大對象類型和創建包含大對象類型列的表。
在 IBM InfoSphere Federation Server V9.7 之前,對 Teradata 支持的最大數據類型長度最多僅可達 64000 字節,而對於大對象類型 CLOB 和 BLOB 並不支持;在 V9.7 中,如圖 4 所示,我們對 Teradata 遠程數據源加入大對象類型的支持,該支持主要體現在如下幾個方面:
在本地和遠程的大對象類型之間加入了默認的前向 / 反向類型映射;
修改了數據定義語言 (DDL), 使得可以方便的對遠程 Teradata 數據源中的包含大對象列的表創建昵稱 (Create Nickname) ;
可以通過 Nickname 從遠程 Teradata 數據源檢索包含大對象列的數據;
修改了 Transparent DDL 語法 , 以支持遠程 Teradata 數據源的大對象類型。
需要注意的是,當前對 Teradata LOB 類型的支持僅是一個初步的嘗試,對遠程 Teradata LOB 類型的操作具有如下的局限性:
通過 Nickname 還不能對遠程的大對象類型列進行添加 / 更新 / 刪除 (I/U/D) ;
在 passthru 模式下,當前對遠程 Teradata LOB 類型列的查詢是不允許的。
圖 4. IBM InfoSphere Federation Server V9.7 對遠程 Teradata LOB 的支持
查看原圖(大圖)
2. Wrapper 的改進
2.1 JDBC Wrapper
目前一些數據庫廠商並不提供 ODBC 驅動,或僅在部分平台上提供 ODBC 驅動;一些廠商提供的 ODBC 驅動不支持一些新的數據庫技術,比如說兩階段提交等。同時,目前許多數據庫僅支持 JDBC 客戶端,比如說 Cloudscape(Derby), Universal Data 。因此,IBM InfoSphere Federation Server V9.7 增加了 JDBC Wrapper,以提供給用戶更多的選擇。
相對於 ODBC 連接 , 使用 JDBC 連接具有如下的優勢:
更易於跨平台移植和部署;
支持一些最新的數據庫技術,如兩階段提交等;
客戶端配置更簡單,只需要指定數據庫連接字符串和 CLASSPATH 。
和其它 Wrapper 一樣,使用 JDBC Wrapper 進行遠程數據庫連接時需要進行一系列的配置,具體如下:
首先,我們需要在聯邦數據庫裡面創建一個 JDBC Wrapper 對象:
CREATE WRAPPER jdbc;
如果 Wrapper 對象的名字為 jdbc,聯邦存儲器會自動定位到默認的 JDBC Wrapper 庫。用戶也可以自己指定庫名:
CREATE WRAPPER jdbc_wrapper1 LIBRARY 'libdb2rcjdbc.a';
需要注意的是,在不同的平台上 JDBC Wrapper 對應的庫名是不一樣的。
接下來,需要在聯邦數據庫中為通過 JDBC Wrapper 訪問的數據源創建一個服務器對象:
CREATE SERVER jdbc_server_cs1 type JDBC version 3.0 Wrapper jdbc_wrapper1 options (
driver_class 'org.apache.derby.jdbc.ClIEntDriver',
url ‘ jdbc:derby://iiregr01.cn.ibm.com:1527/testdb9;create=true; ’ ,
driver_package ‘ /wsdb/v10/bldsupp/ALL/jdbc_driver/derbyclIEnt.jar ’ ,
jdbc_log ‘ Y ’ );
為 JDBC Wrapper 新增加的各服務器選項意義說明如下 :
driver_class ( 必須 ): JDBC 驅動的類名;
url ( 必須 ): JDBC 連接字符串,包括驅動類型、數據庫服務器地址、端口以及數據庫名等信息;
driver_package ( 可選 ): JDBC 驅動所在的 Jar 包,如果沒有指定,JDBC Wrapper 會在系統 CLASSPATH 中查找;
jdbc_log ( 可選 ): 是否需要紀錄 JDBC 日志。
創建完 JDBC Wrapper 的服務器對象以後,接下來的操作就跟聯邦數據庫的其它 Wrapper 一樣了,可以進行昵稱創建,昵稱查詢等一系列聯邦數據庫操作。
2.2 對 Oracle Wrapper 支持聯邦存儲過程返回多個結果集
聯邦存儲過程是聯邦數據庫中一個非常重要的特性,它駐留在聯邦數據庫中,能夠透明地訪問遠程數據源 ( 如 Oracle,Sybase 和 SQL Server 等 ) 上的存儲過程。 IBM InfoSphere Federation Server V9.7 中增強了聯邦存儲過程的能力,使其能夠獲取遠端 Oracle 存儲過程返回的所有數據 ( 包括輸出參數值,返回值,輸出的結果集 ) 。
聯邦存儲過程的執行方式與 DB2 存儲過程一樣通過 call 語句進行調用,並且新版本聯邦存儲過程的結果集可以被指定返回到調用端或客戶端 ( 與 DB2 存儲過程結果集的屬性一致 ) 。如圖 5 是聯邦存儲過程的一個簡單工作流程,聯邦存儲過程可以直接被應用程序調用 ( 去掉圖中的虛線框 ),也可以被 DB2 存儲過程調用 ( 這種調用方式也稱為嵌套存儲過程 ) 。
圖 5. 聯邦存儲過程工作流程
IBM InfoSphere Federation Server V9.7 對聯邦存儲過程語法進行了增強。通過增加新的字句 (WITH RETURN TO CLIENT ( … )),用戶在設計聯邦存儲過程時可以指定其結果集返回到客戶端,剩余的結果集則自動返回到調用端。關於新子句的介紹,請參考下面的鏈接:
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.JSP?topic=/com.ibm.db2.luw.sql.ref.doc/doc/r0023603.Html
IBM InfoSphere Federation Server V9.7 支持基於 Oracle Wrapper 的聯邦存儲過程返回多個結果集,並且這些結果集能夠被交叉訪問。所謂交叉訪問即應用程序或聯邦存儲過程的調用者可以以任意的次序訪問這些結果集。例如,首先訪問第三個結果集,然後訪問第一個,接著訪問第四個,最後還可以回來訪問第三個。
IBM InfoSphere Federation Server V9.7 中的聯邦存儲過程在使用過程中有一些限制 :
目前聯邦存儲過程僅支持從 Oracle 存儲過程返回多個結果集,在後續的版本中將會支持其他數據源,並提供用戶修改現有聯邦存儲過程定義,如修改結果集的屬性(客戶端或調用端)。
當遠程數據源的存儲過程定義發生變化時,不能直接使用“ ALTER PROCEDURE …”修改聯邦存儲過程的定義。必須首先刪除現有的聯邦存儲過程,然後再創建新的聯邦存儲過程,或者使用新的語法“ CREATE OR REPLACE …”創建新的聯邦存儲過程。
3. SQL 的改進
3.1 對存儲過程返回結果集進行連接操作的支持
對用戶來說,如何把存儲過程返回的結果集和本地的表或其他數據庫對象進行連接,是一個很常見的需求。然而,目前 DB2 沒有提供 SQL 語法支持直接連接存儲過程返回的結果集,IBM InfoSphere Federation Server V9.7 中我們提供了連接存儲過程返回的結果集的功能。
IBM InfoSphere Federation Server V9.7 中新增了自動化工具 db2fedgentf,該工具可用於幫助用戶自動創建表函數映射到存儲過程返回的結果集上,然後用戶再用這些表函數進行連接操作。除了為聯邦存儲過程創建相應的表函數,我們也可以使用 db2fedgentf 刪除指定的表函數。
下面簡要介紹 db2fedgentf 的工作原理。假設在遠程 DB2 LUW 數據源上存在存儲過程 INVENTORY,其功能為根據輸入的商品編號返回供應商姓名。在本地聯邦數據庫中,存在聯邦存儲過程 FS_INVENTORY 映射到該遠程存儲過程。本地聯邦數據庫中,表 NOTEBOOK 存有供應商的電話號碼。假設我們希望通過商品編號查詢供應商的電話號碼。圖 6 顯示了 db2fedgentf 工具的工作原理以及如何通過表函數訪問聯邦存儲過程返回的結果集。