DB2 Version 9.5 pureXML的增強(qiáng)和新特性
DB2 9XML支持概述
DB2 9引入了原生XML數(shù)據(jù)類型。它將XML存儲(chǔ)為一種經(jīng)過解析的分層(原生)格式,并允許用戶使用XQuery和SQL/XML語言查詢數(shù)據(jù)。DB2XQuery表達(dá)式將存儲(chǔ)在DB2數(shù)據(jù)庫中的XML文檔用作XML的查詢?cè)础:瘮?shù)xmlcolumn和sqlquery用來連接存儲(chǔ)在數(shù)據(jù)庫中的XML值,并為XQuery解析器提供XML序列。
除了XQuery語言,DB2 9還提供了SQL/XML函數(shù)在單個(gè)查詢中同時(shí)處理XML數(shù)據(jù)和關(guān)系數(shù)據(jù)。SQL/XML函數(shù)xmlquery、xmltable和xmlexists有助于將XQuery嵌入到SQL語句中。
DB2 9還支持模式驗(yàn)證。它引入了新的命令和存儲(chǔ)過程,用于將模式注冊(cè)到數(shù)據(jù)庫并充當(dāng)數(shù)據(jù)庫對(duì)象。在插入操作之前或之后,可以用xmlvalidate函數(shù)根據(jù)已注冊(cè)的模式驗(yàn)證XML值。也可以對(duì)模式進(jìn)行注釋,以便于將XML數(shù)據(jù)分解為關(guān)系表。諸如xmlelement、xmlattributes等發(fā)布函數(shù)可用來將關(guān)系值轉(zhuǎn)換為XML文檔。DB2 9也針對(duì)XML數(shù)據(jù)支持對(duì)一些實(shí)用工具(導(dǎo)入、導(dǎo)出等等)進(jìn)行了更新。更多關(guān)于Version9中的XML支持請(qǐng)參見參考資料部分。
DB2 V9.5的新特性
在處理XML數(shù)據(jù)方面,現(xiàn)有的DB2 9功能非常強(qiáng)大。DB2 V9.5增強(qiáng)了一些現(xiàn)有特性并引入了其他功能,以使XML處理更加強(qiáng)大和高效。下面是本文將要討論的功能列表:
◆支持在非Unicode數(shù)據(jù)庫中使用XML
◆子文檔更新
◆基礎(chǔ)表存儲(chǔ)/壓縮
◆兼容的XML模式演化
◆驗(yàn)證觸發(fā)器
◆驗(yàn)證檢查約束
◆XML復(fù)制
◆XML聯(lián)合
◆XML載入
◆sqlquery()參數(shù)
◆用戶友好的發(fā)布函數(shù)
◆SQL/XML函數(shù)的默認(rèn)參數(shù)傳遞
◆XSLT函數(shù)
◆XML分解增強(qiáng)
◆XML索引增強(qiáng)
◆索引顧問程序(Indexadvisor)和優(yōu)化器增強(qiáng)
◆DB2DataWeb服務(wù)
以下小節(jié)的大多數(shù)代碼示例都基于DB2 V9.5示例數(shù)據(jù)庫。可以從DB2 V9.5命令行處理器運(yùn)行db2sampl命令來創(chuàng)建示例數(shù)據(jù)庫。也可以通過firststep來創(chuàng)建。firststep是DB2提供的一個(gè)工具,在安裝了DB2之后就會(huì)執(zhí)行,也可以在以后通過在Windows中選擇Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps來執(zhí)行。
支持在非Unicode數(shù)據(jù)庫中使用XML
DB2 9只允許用戶使用UTF-8代碼頁創(chuàng)建包含XML數(shù)據(jù)的數(shù)據(jù)庫。這意味著,即使XML文檔中的值是ASCII格式的,也需要存儲(chǔ)到UTF-8格式的數(shù)據(jù)庫中。DB2 V9.5去掉了這個(gè)限制,并且允許用戶用任意代碼集創(chuàng)建包含XML列的數(shù)據(jù)庫。由于去掉了這個(gè)限制,即使數(shù)據(jù)庫不是用UTF-8格式創(chuàng)建的,用戶也可以更改一個(gè)表以添加XML列,或者創(chuàng)建一個(gè)包含XML列的新表。
以下代碼創(chuàng)建了一個(gè)示例數(shù)據(jù)庫和包含一個(gè)XML列的示例表:
清單1.使用默認(rèn)代碼頁的數(shù)據(jù)庫
db2 CREATE DATABASE sampledb |
DB2 V9.5允許用戶更新存儲(chǔ)在數(shù)據(jù)庫中的XML文檔的一部分。它引入了XQuerytransform表達(dá)式,該表達(dá)式使用4個(gè)更新表達(dá)式——insert、delete、replace和rename來修改XML文檔片段。transform表達(dá)式是XQuery語言的一部分,因此可以用在XQuery表達(dá)式中。對(duì)于DB2 V9.5,一個(gè)transform表達(dá)式中只能使用一個(gè)更新表達(dá)式。一個(gè)transform表達(dá)式有以下子句:
◆COPY:transform表達(dá)式的copy子句將源XML值綁定到一個(gè)變量。更新表達(dá)式將會(huì)在查詢中對(duì)該副本進(jìn)行處理。
◆MODIFY:modify子句根據(jù)更新表達(dá)式修改復(fù)制的XML值。在MODIFY子句中可以使用多個(gè)更新表達(dá)式。
◆return:return子句返回修改后的值。
下面將解釋這4個(gè)更新表達(dá)式:
1.insert表達(dá)式將一個(gè)新的XML節(jié)點(diǎn)插入到現(xiàn)有XML文檔中。可以在XML文檔指定插入的位置.
2.replace表達(dá)式用來更新特定節(jié)點(diǎn)的特定值。
3.delete表達(dá)式用來從XML文檔刪除特定節(jié)點(diǎn)。
4.rename表達(dá)式用來對(duì)節(jié)點(diǎn)進(jìn)行重命名。
由于transform表達(dá)式是XQuery語言的一部分,因此可以在包含xmlquery函數(shù)的SQL語句中使用它,也可以用于更新語句來更新XML值。
清單2中的代碼更新了示例數(shù)據(jù)庫中customer表的info列。它更新XML文檔以使用cid關(guān)系列的值匹配CID屬性。
清單2.更新表的transform表達(dá)式
UPDATE CUSTOMER |
如果在表的XML列上存在XML驗(yàn)證檢查約束,在手動(dòng)更新或者通過觸發(fā)器更新之前,用戶可能需要驗(yàn)證新的XML值。
以下代碼示例從purchaseorder表中刪除一個(gè)條目,并將修改后的文檔作為查詢結(jié)果。
清單3.transform表達(dá)式
xquery |
示例xupdate.db2給出了transform表達(dá)式的不同例子。可以在sqllib/samples/xml/xquery/clp目錄下找到此示例。
基礎(chǔ)表行存儲(chǔ)/壓縮
在DB2 9中,XML數(shù)據(jù)和關(guān)系數(shù)據(jù)存儲(chǔ)在不同的位置。這個(gè)存儲(chǔ)位置稱作XML數(shù)據(jù)區(qū)域(XMLdataarea,XDA)。DB2 9將所有XML文檔存儲(chǔ)在這個(gè)存儲(chǔ)位置,這意味著訪問XML值和關(guān)系數(shù)據(jù)需要更多I/O。如果XML文檔較小,而且在存儲(chǔ)關(guān)系值之后頁面大小仍足夠容納XML值,那么將XML存儲(chǔ)在相同的頁面能夠提供不錯(cuò)的性能收益。這些收益包括:
壓縮:因?yàn)閄ML數(shù)據(jù)和關(guān)系數(shù)據(jù)存儲(chǔ)在一起,因此可以使用DB2 9中引入的壓縮技術(shù)對(duì)XML數(shù)據(jù)進(jìn)行壓縮。由于XML值比關(guān)系數(shù)據(jù)大,所以可以獲得較高程度的壓縮。
查詢性能:由于XML數(shù)據(jù)和關(guān)系數(shù)據(jù)存儲(chǔ)在相同位置,因此直接插入XML數(shù)據(jù)使得基礎(chǔ)表比一般情況下要大。如果XML數(shù)據(jù)的訪問頻率與表中的其他關(guān)系值相當(dāng),那么這將提高查詢數(shù)據(jù)的性能。
DB2 V9.5引入了XML數(shù)據(jù)的基礎(chǔ)表行存儲(chǔ)。這意味著如果每行的關(guān)系數(shù)據(jù)和XML數(shù)據(jù)的總大小沒有超過1頁面的大小,這兩種數(shù)據(jù)就可以存儲(chǔ)在相同的物理頁面。只有當(dāng)一個(gè)記錄的總大小沒有超過頁面大小時(shí),才能夠?qū)ML數(shù)據(jù)進(jìn)行基礎(chǔ)表行存儲(chǔ)。如果是這樣,XML數(shù)據(jù)就會(huì)像通常一樣存儲(chǔ)在XML存儲(chǔ)位置。DB2中允許的頁面最大值為32KB,因此一個(gè)XML值的最大插入長(zhǎng)度也被限制到32KB。如果文檔的內(nèi)部樹表示的大小比指定的插入長(zhǎng)度小,它們將會(huì)被插入。清單4中的代碼所創(chuàng)建的表可以對(duì)XML數(shù)據(jù)進(jìn)行基礎(chǔ)表行存儲(chǔ):
清單4.XML數(shù)據(jù)的基礎(chǔ)表存儲(chǔ)
db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024) |
使用 INLINE 選項(xiàng)指定將 XML 數(shù)據(jù)跟關(guān)系數(shù)據(jù)存儲(chǔ)在一起。這對(duì)于要獲取的數(shù)據(jù)都位于相同位置的查詢來說很有利。另一方面,對(duì)于訪問非 XML 數(shù)據(jù)的查詢,這可能導(dǎo)致需要更多的 I/O 才能找到關(guān)系數(shù)據(jù)。
#p#
使用 XML 數(shù)據(jù)基礎(chǔ)表行存儲(chǔ)的理想情形是,當(dāng)表只有一個(gè) XML 類型列并且 XML 文檔的最大值沒有超過頁面大小時(shí)。
兼容的 XML 模式演化
為了增加靈活性并提供更好的模式演化,DB2 V9.5 為 XML 模式引入了 update 特性。以前注冊(cè)的模式能夠更新為新模式,只要它們互相兼容。如果使用舊模式驗(yàn)證的 XML 文檔對(duì)于新模式仍然有效,那么這兩種模式就是兼容的。
例如,新模式中添加的可選元素和舊模式中的元素兼容,這是由于新元素的可選特性使經(jīng)過舊模式驗(yàn)證的 XML 文檔仍然有效。新 XML 文檔可以擁有這個(gè)可選元素,并且能夠通過新模式的驗(yàn)證。因?yàn)榕f文檔仍然有效,所以更新模式之后無需再執(zhí)行任何操作。如果模式不兼容,模式更新就會(huì)失敗。舊模式的注釋和標(biāo)識(shí)符仍然會(huì)保留。
為了更新模式,DB2 V9.5 引入了 XSR_UPDATE 存儲(chǔ)過程。存儲(chǔ)過程檢查兼容性,只當(dāng)新模式具備兼容性時(shí)才更新模式。要更新模式,用戶需要分別注冊(cè)新舊模式,然后調(diào)用 XSR_UPDATE 存儲(chǔ)過程。一旦舊模式經(jīng)過更新,用戶可以選擇保留舊模式或者將其刪除。
讓我們以 customer 表的 info 列作為一個(gè)例子。info 列包含 addr 元素,該元素具有以下定義(在 sqllib/samples/db2sampl 目錄下可以找到完整的模式)。
清單 5. 舊 XML 模式定義
之后,用戶希望擁有一個(gè)可選的 HouseNo 元素。要更新已注冊(cè)的模式以使標(biāo)識(shí)符保持不變,需要先注冊(cè)包含附加元素的新模式。 新 addr 元素的定義如下:
清單 6. 新 XML 模式定義
注冊(cè)之后,可以用以下存儲(chǔ)過程將現(xiàn)有模式更新為新模式:
清單7. 使用 XSR_UPDATE 更新模式
db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0) |
最后一個(gè)參數(shù)值0表示更新之后不應(yīng)該刪除新模式。如果該參數(shù)設(shè)置為其他非零值,在更新操作之后新模式將會(huì)被刪除。
示例代碼xsupdate.db2演示了兼容的XML模式演化??梢栽趕qllib/samples/xml/clp目錄中找到該示例。
驗(yàn)證觸發(fā)器支持
為了提高應(yīng)用程序靈活性并為用戶提供對(duì)引入的XML文檔的自動(dòng)驗(yàn)證功能,DB2 V9.5擴(kuò)展了在beforetrigger中對(duì)XML的支持。beforetrigger是使用BEFORE選項(xiàng)創(chuàng)建的觸發(fā)器,并在inster/update/delete操作之前執(zhí)行。在beforetrigger中,可以在新變量中引用XML值。觸發(fā)器的操作可以對(duì)新值應(yīng)用xmlvalidate函數(shù)。觸發(fā)器的WHEN子句可以用來檢查是否根據(jù)任何指定模式對(duì)新值進(jìn)行了驗(yàn)證??梢允褂肳HEN條件中的ISVALIDATED或ISNOTVALIDATEDACCORDINGTOXMLSCHEMA子句來完成該操作。根據(jù)WHEN條件的輸出,可能還需要驗(yàn)證XML值或設(shè)置一個(gè)新值。目前,只允許將xmlvalidate函數(shù)用于XML類型的transition變量。觸發(fā)器創(chuàng)建之后,在每次執(zhí)行插入操作時(shí),將會(huì)被自動(dòng)激活并執(zhí)行,如果在插入語句中沒有驗(yàn)證XML值,也可以用觸發(fā)器進(jìn)行驗(yàn)證。
以下代碼是一個(gè)DDL語句,用于創(chuàng)建customer表和根據(jù)該表定義的觸發(fā)器。只要存在對(duì)表的插入操作,就會(huì)激活觸發(fā)器。如果沒有在插入語句中對(duì)XML文檔進(jìn)行驗(yàn)證,觸發(fā)器將會(huì)在插入之前使用xmlvalidate函數(shù)驗(yàn)證該文檔。以下的示例代碼假設(shè)表的customer不存在,并且已經(jīng)在數(shù)據(jù)庫中注冊(cè)了該customer模式。
清單8.為一個(gè)表定義的觸發(fā)器
CREATE TABLE Customer ( Cid BIGINT NOT NULL, |
示例 xmltrig.db2 提供了不同的場(chǎng)景和操作,這些操作用來分配新值并驗(yàn)證 XML 值,可以在觸發(fā)器內(nèi)部執(zhí)行。該示例可以在 sqllib/samples/xml/clp 目錄中找到。
XML 驗(yàn)證檢查約束
檢查約束(check constraint)是一類可以在創(chuàng)建表時(shí)作用到表列的約束。只有當(dāng)約束合法時(shí),DB2 才允許插入操作,否則插入將會(huì)失敗。
DB2 V9.5 支持對(duì) XML 值進(jìn)行檢查約束。用戶可以使用檢查約束來加強(qiáng)對(duì) XML 列的驗(yàn)證。與 before trigger 類似,可以在檢查約束中使用 IS VALIDATED ACCORDING TO XMLSCHEMA 子句來加強(qiáng)驗(yàn)證。惟一的區(qū)別在于,這種約束只檢查驗(yàn)證條件,并不會(huì)進(jìn)行實(shí)際的驗(yàn)證。用戶可以在插入語句中使用 xmlvalidate 來顯式驗(yàn)證 XML 值,或者使用 before trigger 來執(zhí)行自動(dòng)驗(yàn)證。根據(jù)檢查約束中指定的模式,只有當(dāng) XML 值有效時(shí),才能成功插入。
對(duì)一個(gè)表 XML 值應(yīng)用 before trigger 和檢查約束,往往可以確保 XML 值對(duì)于指定模式是有效的。只要執(zhí)行了插入操作,before trigger 就會(huì)自動(dòng)進(jìn)行驗(yàn)證,而檢查約束將會(huì)讓用戶顯式地使用 xmlvalidate 函數(shù)。這兩種方法可以一起使用,以加強(qiáng) XML 值的完整性。
清單9 中的代碼將會(huì)修改 清單 8 中創(chuàng)建的表 customer,以對(duì)表執(zhí)行檢查約束:
清單9. 檢查約束
db2 ALTER TABLE customer ADD CONSTRAINT check_info
CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)
上面創(chuàng)建的檢查約束總是會(huì)檢查是否根據(jù) customer 模式對(duì)文檔進(jìn)行了驗(yàn)證。如果沒有觸發(fā)器,用戶需要使用 xmlvalidate 函數(shù)顯式地驗(yàn)證該文檔。
示例代碼 xmlcheckconstraint.db2 演示了如何為具有相同結(jié)構(gòu)的不同表創(chuàng)建視圖,該視圖可以進(jìn)行檢查約束,以及按模式對(duì)表進(jìn)行劃分。
XML 復(fù)制支持
DB2 V9.5 支持將 XML 數(shù)據(jù)復(fù)制到其他支持 XML 數(shù)據(jù)的數(shù)據(jù)庫。可以使用 WebSphere® Replication Server 9.5 版或者 WebSphere Data Event Publisher 9.5 版來進(jìn)行復(fù)制。WebSphere Replication Server 可以將 XML 數(shù)據(jù)復(fù)制到支持 XML 數(shù)據(jù)類型的聯(lián)合目標(biāo),也可以將 XML 數(shù)據(jù)映射到 CLOB/BLOB 列。
像任何其他關(guān)系列一樣,對(duì) XML 數(shù)據(jù)的復(fù)制是在事務(wù)消息中完成的,因此復(fù)制的 XML 的大小將受到最大事務(wù)消息長(zhǎng)度的限制。如果數(shù)據(jù)很大,可以在原始文檔中插入一個(gè)占位符文檔。也可以在例外表中插入一個(gè)例外。
當(dāng)進(jìn)行復(fù)制時(shí),不能對(duì) XML 模式注冊(cè)進(jìn)行復(fù)制。此外,在復(fù)制過程中也不能對(duì) XML 數(shù)據(jù)進(jìn)行驗(yàn)證。
XML 聯(lián)合支持
WebSphere Federation Server Version 9.1 支持 pureXML,因此能夠集成本地和遠(yuǎn)程的 XML 存儲(chǔ)數(shù)據(jù)??梢詫碜圆煌瑪?shù)據(jù)庫的 XML 數(shù)據(jù)當(dāng)作本地?cái)?shù)據(jù)查看,而且可以用 DB2 XQuery 和 SQL/XML 查詢這些數(shù)據(jù)??梢栽谶h(yuǎn)程聯(lián)合數(shù)據(jù)庫上創(chuàng)建一個(gè)視圖,以連續(xù)字符串的方式查看該數(shù)據(jù),這些數(shù)據(jù)可以在 WebSphere Federation Server 上解析為 XML 值?,F(xiàn)在 DB2 可以使用 SQL/XML 和 XQuery 語言通過為視圖創(chuàng)建的別名來查詢數(shù)據(jù)。
與驗(yàn)證本地 XML 值的方式相同,可以使用 db2 xmlvalidate 函數(shù)驗(yàn)證來自不同聯(lián)合數(shù)據(jù)源的 XML 數(shù)據(jù)。
載入支持
DB2 9 主要支持兩種用 XML 值填充表的方式。insert 語句向表中插入 XML 值,import 實(shí)用程序用于將大量數(shù)據(jù)導(dǎo)入表中。
DB2 V9.5 擴(kuò)展了對(duì) load 實(shí)用程序的支持。load 支持 import 支持的大多數(shù) XML 數(shù)據(jù)選項(xiàng)??梢允褂?FROM 子句為 XML 數(shù)據(jù)指定路徑。在 load 期間可以使用 XMLVALIDATE USING 子句對(duì) XML 數(shù)據(jù)進(jìn)行驗(yàn)證。load 有 3 個(gè)不同的選項(xiàng):XDS、SCHEMA 和 SCHEMALOCATION HINTS。當(dāng)指定 XDS 選項(xiàng)時(shí),可以使用 DEFAULT, IGNORE 和 MAP 子句。這些選項(xiàng)的含義與 import 中對(duì)應(yīng)選項(xiàng)的含義相同??梢允褂梦募愋托薷钠?XMLCHAR 和 XMLGRAPHIC 指定數(shù)據(jù)的代碼頁。XML 數(shù)據(jù)指定程序(XML data specifier,XDS)在數(shù)據(jù)文件中指定 XML 值。load 重啟的行為和原來一樣。它通過掃描所有 XML 文檔重新構(gòu)建所有索引。
示例代碼 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 數(shù)據(jù)載入選項(xiàng)。可以在 sqllib/samples/xml/clp 目錄中找到該示例。
#p#
XSLT支持
DB2 V9.5提供了使用數(shù)據(jù)庫本身的XSL轉(zhuǎn)換來處理XML文檔的功能??梢允褂肵SLT樣式表將存儲(chǔ)在數(shù)據(jù)庫中的XML文檔轉(zhuǎn)換為HTML格式。為此,DB2 V9.5引入了xsltransform函數(shù)。該函數(shù)還支持使用參數(shù)的樣式表。xsltransform函數(shù)可以將作為XML文檔存儲(chǔ)在數(shù)據(jù)庫表列中的XSLT樣式表應(yīng)用到XML文檔上。這為用戶提供了靈活性,用戶可以檢索來自數(shù)據(jù)庫的經(jīng)過轉(zhuǎn)換的XML文檔,并可以直接在Web上顯示。
現(xiàn)在,假設(shè)您已有下面的XML文檔:
清單10.XML文檔
Ice Scraper, Windshield 4 inch
Basic Ice Scraper 4 inches wide, foam handle
3.99
以及相應(yīng)的 XSLT 樣式表:
清單11. XSLT 樣式表
這些文檔需要存儲(chǔ)在表中,或者當(dāng)作參數(shù)傳遞。當(dāng)將這些值作為參數(shù)傳遞時(shí),請(qǐng)確保它們是格式良好的XML文檔。參數(shù)的數(shù)據(jù)類型可以是XML、VARCHAR、CLOB或BLOB。假設(shè)文檔和樣式表都存儲(chǔ)在表中,可以用以下語句轉(zhuǎn)換XML文檔:
注意:示例假設(shè)存儲(chǔ)文檔的表名稱為xslt,XML文檔的列名為xmldoc,XSL文檔的列名為xsldoc。
清單12.XSLTransform表達(dá)式
SELECT XSLTRANSFORM (description USING stylesheet AS CLOB (10M)) |
這個(gè)查詢輸出一個(gè) HTML 文檔,可以在瀏覽器中進(jìn)行查看。清單 13 顯示該 HTML 輸出:
清單13. XSLTransform 表達(dá)式的 HTML 輸出
﹤html﹥ |
用戶也可以將XML文檔和一個(gè)XSLT樣式表存儲(chǔ)在不同的表中,而且可以通過連接表將單個(gè)XSLT樣式表應(yīng)用到多個(gè)XML值。
發(fā)布函數(shù)
發(fā)布函數(shù)用來將關(guān)系數(shù)據(jù)轉(zhuǎn)換為XML值。DB2 9引入了SQL/XML支持,該支持在DB2 V9.5中得到了增強(qiáng)和簡(jiǎn)化。一些DB2 9SQL/XML函數(shù),比如xmlelement,需要提供所有XML元素的名稱、屬性和其他節(jié)點(diǎn),而這些元素來自表的關(guān)系列或者被顯式地提供。有時(shí)用戶需要生成XML值,但是不想牽涉到元素名稱。
通過引入新函數(shù)xmlrow和xmlgroup,DB2 V9.5對(duì)現(xiàn)有的發(fā)布函數(shù)進(jìn)行了擴(kuò)展。這些函數(shù)從表列獲得XML元素的名稱和值。xmlrow輸出是一個(gè)表示為XML的行值的序列,xmlgroup函數(shù)將所有值集合到一個(gè)根節(jié)點(diǎn)下。
下表是一個(gè)示例employee表,該表擁有員工的詳細(xì)地址,包含以下記錄:
IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia
下面的查詢?cè)谠撔兄袘?yīng)用了xmlrow和xmlgroup函數(shù)。
清單14.新發(fā)布函數(shù)
db2SELECTXMLROW(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india
db2SELECTXMLGROUP(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india
在DB2 9中,為了得到相同結(jié)果,除了顯式地提供元素名稱,還需要將xmlelement應(yīng)用到每個(gè)列值。
跟V91版本中相同的查詢相比,示例代碼xmlintegrate.db2為這些函數(shù)提供了更多復(fù)雜例子。可以在sqllib/samples/xml/clp目錄下找到該示例。
將參數(shù)傳遞給sqlquery函數(shù)
在DB2 9中,sqlquery函數(shù)將一個(gè)SQL語句嵌入到XQuery表達(dá)式中。此函數(shù)將一個(gè)字符串值作為輸入,該字符串是一個(gè)有效的SQL全選擇語句。在DB2 9中,不能將參數(shù)從XQuery語句傳遞給此函數(shù)。
DB2 V9.5增強(qiáng)了該函數(shù),引進(jìn)了一個(gè)新的parameter函數(shù),該函數(shù)將一個(gè)整數(shù)值作為輸入?,F(xiàn)在,sqlquery函數(shù)可以將多個(gè)參數(shù)作為輸入,第一個(gè)參數(shù)是一個(gè)表示全選擇的字符串,其后是參數(shù)的值。sqlquery函數(shù)的第一個(gè)字符串參數(shù)可以包含parameter函數(shù),該函數(shù)將會(huì)被傳遞給sqlquery函數(shù)的參數(shù)取代,該參數(shù)位于第一個(gè)必需的字符串參數(shù)之后。傳遞給parameter函數(shù)的整數(shù)值表示在調(diào)用sqlquery函數(shù)中參數(shù)的位置,該參數(shù)將會(huì)在調(diào)用中被取代。例如,parameter(1)告訴解析器用字符串參數(shù)后的第一個(gè)參數(shù)替代這個(gè)值。參數(shù)的類型應(yīng)該和全選擇所期望的值類型相同??梢允褂妙愋娃D(zhuǎn)換函數(shù)將值轉(zhuǎn)換為一個(gè)合適的類型。
讓我們以示例數(shù)據(jù)庫中的customer表作為例子。可以通過運(yùn)行db2sampl命令和從firststep創(chuàng)建示例數(shù)據(jù)庫。firststep是DB2提供的一個(gè)工具,在安裝了DB2之后就會(huì)執(zhí)行,也可以在以后通過在Windows中選擇Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps來執(zhí)行。
customer表包含一個(gè)作為關(guān)系列的cid列,以及表示顧客id的鍵值。infoXML列具有一個(gè)屬性Cid,該屬性也表示顧客id。如果數(shù)據(jù)是一致的,那么屬性Cid值應(yīng)該與特定行的cid列值相同。以下的查詢將檢查數(shù)據(jù)保持一致的行的數(shù)量。Cid屬性的值被傳遞給sqlquery函數(shù),以將其與關(guān)系cid值進(jìn)行比較。
清單15.將參數(shù)傳遞給sqlquery函數(shù)
xquerydeclaredefaultelementnamespace"http://posample.org";
for$iindb2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/@Cid
for$jindb2-fn:sqlquery("selectinfofromcustomerwherecid=parameter(1)",$i)
return
{$i}
此查詢返回所有數(shù)據(jù)一致的顧客id。
示例代碼xqueryparam.db2提供了一些不錯(cuò)的例子,將一個(gè)和多個(gè)參數(shù)傳遞給sqlquery函數(shù)??梢栽趕qllib/samples/xml/clp目錄中找到該示例。
現(xiàn)有函數(shù)XMLQuery、XMLtable和XMLExists的默認(rèn)傳遞行為
在DB2 9中,函數(shù)xmlquery、xmltable和xmlexists用來將Xquery語句嵌入到SQL語句中。利用這些函數(shù)的PASSING子句將參數(shù)從SQL語句傳遞給這些函數(shù)。
在DB2 9中,如果同一個(gè)SQL語句中的這些函數(shù)會(huì)執(zhí)行多次,那么每次執(zhí)行都需要一個(gè)獨(dú)立的PASSING子句。有時(shí)這會(huì)使查詢的結(jié)構(gòu)看起來很復(fù)雜和龐大。DB2 V9.5擴(kuò)展了這些函數(shù),以使用默認(rèn)的傳遞機(jī)制?,F(xiàn)在,將一個(gè)列名稱用作這些函數(shù)的Xquery中的一個(gè)變量名。如果沒有使用顯式的PASSING子句,默認(rèn)情況下DB2將傳遞相同列給一個(gè)變量。這使查詢更精簡(jiǎn)并更易于理解。以下代碼給出了一個(gè)針對(duì)示例數(shù)據(jù)庫表的例子。查詢?yōu)槊麨镽obertShoemaker的顧客獲取purchaseorder中的第一項(xiàng)。
清單16.SQL/XML函數(shù)的默認(rèn)傳遞行為
SELECTXMLQUERY('declaredefaultelementnamespace"http://posample.org";
$PORDER/PurchaseOrder/item[1]')
FROMpurchaseorderASp,customerASc
WHEREXMLEXISTS('declaredefaultelementnamespace"http://posample.org";
$INFO/customerinfo[name="RobertShoemaker"and@Cid=$CUSTID]')
對(duì)于SELECT子句中的xmlquery函數(shù),默認(rèn)情況下傳遞purchaseorder表的porder列。同樣地,對(duì)于xmlexists函數(shù),默認(rèn)情況下傳遞customer表的info列和custid列。請(qǐng)確保以大寫字母的方式使用這些變量的名稱,因?yàn)閤query是一個(gè)區(qū)分大小寫的語言,而且關(guān)系列名稱常常以大寫的方式存儲(chǔ)。
XML驗(yàn)證約束
DB2 V9.5增強(qiáng)了SELCT語句使用的ISVALIDATED子句,以包含ACCORDINGTOXMLSCHEMAID?,F(xiàn)在用戶能夠提供多個(gè)模式并僅選擇針對(duì)這些模式驗(yàn)證的XML值。DB2 V9.5可以將任何XML表達(dá)式(而不是一列)作為一個(gè)操作數(shù),這具有很大的靈活性。下面的例子只選擇了customer表中用customer模式驗(yàn)證之后的文檔。
清單17.SELECT語句中的XML驗(yàn)證約束
db2SELECTinfoFROMcustomer
WHEREinfoISVALIDATEDACCORDINGTOXMLSCHEMAIDcustomer
經(jīng)過注釋的XML模式分解
DB2 9支持XML模式的注釋,因此除遞歸模式外,可以將數(shù)據(jù)分解為關(guān)系表。DB2 V9.5解除了這個(gè)限制,現(xiàn)在即使模式是遞歸的,用戶也可以對(duì)數(shù)據(jù)進(jìn)行注釋和分解。
DB2 V9.5擴(kuò)展了分解,以提供插入順序。當(dāng)將數(shù)據(jù)分解成多個(gè)具有外鍵關(guān)系的表時(shí),這尤其重要。在這種情況下,應(yīng)該首先填充主表,以保持引用約束??梢允褂靡韵伦⑨屩付ú迦腠樞颍?/P>
清單18.對(duì)模式進(jìn)行注釋,以提供插入順序
CUSTOMER
PURCHASEORDER
示例代碼recxmldecomp.db2和xmldecomposition.db2給出了一些不錯(cuò)的例子,其中分別演示了將遞歸模式和插入順序進(jìn)行注釋并分解到表中。可以在sqllib/samples/xml/clp目錄中找到示例代碼。
XML索引增強(qiáng)
DB2 9引入了XML索引。可以在數(shù)據(jù)庫中XML文檔的特定節(jié)點(diǎn)上創(chuàng)建XML索引。索引的數(shù)據(jù)類型可以是VARCHAR、DOUBLE、DATE或TIMESTAMP。如果索引的數(shù)據(jù)類型與XML文檔的元素類型不匹配,DB2將插入XML值,但是不會(huì)為該值創(chuàng)建索引。
DB2 V9.5為索引引入了一個(gè)附加子句REJECTINVALIDVALUES。如果使用該子句創(chuàng)建索引,并且索引的數(shù)據(jù)類型與正在插入的XML文檔中元素的數(shù)據(jù)類型不匹配,插入將會(huì)失敗。如果在插入XML值之后創(chuàng)建索引,而且數(shù)據(jù)類型不匹配,索引創(chuàng)建也會(huì)失敗。
對(duì)于DB2 V9.5,這種行為是默認(rèn)的,也可以使用IGNOREINVALIDVALUES子句顯式地指定這種行為。
下面的示例將會(huì)使用REJECTINVALIDVALUES為customer表的Cid屬性創(chuàng)建一個(gè)索引。
清單19.XML索引
db2CREATEINDEXindex1ONcustomer(info)
GENERATEKEYUSINGXMLPATTERN
'declaredefaultelementnamespace"http://posample.org";
/customerinfo/@cid'asSQLDOUBLEREJECTINVALIDVALUES
Index顧問程序和優(yōu)化器增強(qiáng)
索引顧問程序可以用來獲得關(guān)于同時(shí)為XML和關(guān)系數(shù)據(jù)建立索引的建議。通過同時(shí)為XML和關(guān)系數(shù)據(jù)建立索引,用戶可以獲得良好的性能提升。DB2 9.5優(yōu)化器使用兩種類型的索引來優(yōu)化查詢,并幫助選擇最佳的查詢執(zhí)行計(jì)劃。
DB2 DataWeb服務(wù)
使用DataWeb服務(wù),可以將DB2 V9.5XML數(shù)據(jù)作為數(shù)據(jù)庫manipulation(ML)操作的Web服務(wù)公開。DataWeb服務(wù)(DES)將ML操作(如插入、更新、選擇和存儲(chǔ)過程)作為Web服務(wù)公開??梢酝ㄟ^Web瀏覽器、用戶客戶端使用基于HTTP的SOAP協(xié)議(例如POST和GET方法)來訪問這些Web服務(wù)。通過在現(xiàn)有數(shù)據(jù)庫工具中集成基于Eclipse的工具,可以對(duì)DataWeb服務(wù)提供支持。
控制中心也經(jīng)過了更新,以處理XML數(shù)據(jù)。
結(jié)束語
DB2 9將XML作為一個(gè)新數(shù)據(jù)類型引入,而且提供了處理XML值的基礎(chǔ)設(shè)施。它提供了一些基本功能,比如查詢XML文檔、注冊(cè)模式和驗(yàn)證XML文檔、使用SQL/XML在SQL和XQuery之間交互。DB2 V9.5增強(qiáng)了現(xiàn)有的功能,并提供了更多函數(shù)以有效地處理XML數(shù)據(jù)。
【編輯推薦】