自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

DB2 Version 9.5 pureXML的增強和新特性

數(shù)據(jù)庫
本文描述 IBM® DB2® V9.5 版針對 Linux、Unix 和 Windows 的 pureXML™ 增強和新特性。DB2 Version 9 支持將 XML 作為原生數(shù)據(jù)類型,也支持 SQL/XML、XQuery 語言,以及其他諸如模式支持、發(fā)布函數(shù)、對實用工具的 XML 支持、分解等特性。DB2 V9.5 增強了其中的一些特性并引入了新特性,以更加高效地處理 XML。本文從如何使 XML 處理更高效和更易于使用的角度解釋了這些增強和新特性。

DB2 9XML支持概述

DB2 9引入了原生XML數(shù)據(jù)類型。它將XML存儲為一種經(jīng)過解析的分層(原生)格式,并允許用戶使用XQuery和SQL/XML語言查詢數(shù)據(jù)。DB2XQuery表達式將存儲在DB2數(shù)據(jù)庫中的XML文檔用作XML的查詢源。函數(shù)xmlcolumn和sqlquery用來連接存儲在數(shù)據(jù)庫中的XML值,并為XQuery解析器提供XML序列。

除了XQuery語言,DB2 9還提供了SQL/XML函數(shù)在單個查詢中同時處理XML數(shù)據(jù)和關系數(shù)據(jù)。SQL/XML函數(shù)xmlquery、xmltable和xmlexists有助于將XQuery嵌入到SQL語句中。

DB2 9還支持模式驗證。它引入了新的命令和存儲過程,用于將模式注冊到數(shù)據(jù)庫并充當數(shù)據(jù)庫對象。在插入操作之前或之后,可以用xmlvalidate函數(shù)根據(jù)已注冊的模式驗證XML值。也可以對模式進行注釋,以便于將XML數(shù)據(jù)分解為關系表。諸如xmlelement、xmlattributes等發(fā)布函數(shù)可用來將關系值轉(zhuǎn)換為XML文檔。DB2 9也針對XML數(shù)據(jù)支持對一些實用工具(導入、導出等等)進行了更新。更多關于Version9中的XML支持請參見參考資料部分。

DB2 V9.5的新特性

在處理XML數(shù)據(jù)方面,現(xiàn)有的DB2 9功能非常強大。DB2 V9.5增強了一些現(xiàn)有特性并引入了其他功能,以使XML處理更加強大和高效。下面是本文將要討論的功能列表:

◆支持在非Unicode數(shù)據(jù)庫中使用XML

◆子文檔更新

◆基礎表存儲/壓縮

◆兼容的XML模式演化

◆驗證觸發(fā)器

◆驗證檢查約束

◆XML復制

◆XML聯(lián)合

◆XML載入

◆sqlquery()參數(shù)

◆用戶友好的發(fā)布函數(shù)

◆SQL/XML函數(shù)的默認參數(shù)傳遞

◆XSLT函數(shù)

◆XML分解增強

◆XML索引增強

◆索引顧問程序(Indexadvisor)和優(yōu)化器增強

◆DB2DataWeb服務

以下小節(jié)的大多數(shù)代碼示例都基于DB2 V9.5示例數(shù)據(jù)庫。可以從DB2 V9.5命令行處理器運行db2sampl命令來創(chuàng)建示例數(shù)據(jù)庫。也可以通過firststep來創(chuàng)建。firststep是DB2提供的一個工具,在安裝了DB2之后就會執(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格式的,也需要存儲到UTF-8格式的數(shù)據(jù)庫中。DB2 V9.5去掉了這個限制,并且允許用戶用任意代碼集創(chuàng)建包含XML列的數(shù)據(jù)庫。由于去掉了這個限制,即使數(shù)據(jù)庫不是用UTF-8格式創(chuàng)建的,用戶也可以更改一個表以添加XML列,或者創(chuàng)建一個包含XML列的新表。

以下代碼創(chuàng)建了一個示例數(shù)據(jù)庫和包含一個XML列的示例表:

清單1.使用默認代碼頁的數(shù)據(jù)庫

db2 CREATE DATABASE sampledb
db2 CONNECT TO sampledb
db2 CREATE TABLE record(id INT, record XML)
子文檔更新

DB2 V9.5允許用戶更新存儲在數(shù)據(jù)庫中的XML文檔的一部分。它引入了XQuerytransform表達式,該表達式使用4個更新表達式——insert、delete、replace和rename來修改XML文檔片段。transform表達式是XQuery語言的一部分,因此可以用在XQuery表達式中。對于DB2 V9.5,一個transform表達式中只能使用一個更新表達式。一個transform表達式有以下子句:
◆COPY:transform表達式的copy子句將源XML值綁定到一個變量。更新表達式將會在查詢中對該副本進行處理。

◆MODIFY:modify子句根據(jù)更新表達式修改復制的XML值。在MODIFY子句中可以使用多個更新表達式。

◆return:return子句返回修改后的值。

下面將解釋這4個更新表達式:

1.insert表達式將一個新的XML節(jié)點插入到現(xiàn)有XML文檔中??梢栽赬ML文檔指定插入的位置.

2.replace表達式用來更新特定節(jié)點的特定值。

3.delete表達式用來從XML文檔刪除特定節(jié)點。

4.rename表達式用來對節(jié)點進行重命名。

由于transform表達式是XQuery語言的一部分,因此可以在包含xmlquery函數(shù)的SQL語句中使用它,也可以用于更新語句來更新XML值。

清單2中的代碼更新了示例數(shù)據(jù)庫中customer表的info列。它更新XML文檔以使用cid關系列的值匹配CID屬性。

清單2.更新表的transform表達式

UPDATE CUSTOMER
SET info =
XMLQUERY('transform
copy $po := $INFO
modify
do replace value of $po/customerinfo/@Cid with $CID
return $po'
passing info as "INFO", cid as "CID")
WHERE cid=1000

如果在表的XML列上存在XML驗證檢查約束,在手動更新或者通過觸發(fā)器更新之前,用戶可能需要驗證新的XML值。

以下代碼示例從purchaseorder表中刪除一個條目,并將修改后的文檔作為查詢結果。

清單3.transform表達式

xquery
transform
copy
$po := db2-fn:sqlquery(‘select porder from purchaseorder where
custid = 1002 and orderdate=“2006-02-18”’)
modify
do delete $po/ PurchaseOrder/item[partid = “100-201-01”]
return $po

示例xupdate.db2給出了transform表達式的不同例子??梢栽趕qllib/samples/xml/xquery/clp目錄下找到此示例。

基礎表行存儲/壓縮

在DB2 9中,XML數(shù)據(jù)和關系數(shù)據(jù)存儲在不同的位置。這個存儲位置稱作XML數(shù)據(jù)區(qū)域(XMLdataarea,XDA)。DB2 9將所有XML文檔存儲在這個存儲位置,這意味著訪問XML值和關系數(shù)據(jù)需要更多I/O。如果XML文檔較小,而且在存儲關系值之后頁面大小仍足夠容納XML值,那么將XML存儲在相同的頁面能夠提供不錯的性能收益。這些收益包括:

壓縮:因為XML數(shù)據(jù)和關系數(shù)據(jù)存儲在一起,因此可以使用DB2 9中引入的壓縮技術對XML數(shù)據(jù)進行壓縮。由于XML值比關系數(shù)據(jù)大,所以可以獲得較高程度的壓縮。

查詢性能:由于XML數(shù)據(jù)和關系數(shù)據(jù)存儲在相同位置,因此直接插入XML數(shù)據(jù)使得基礎表比一般情況下要大。如果XML數(shù)據(jù)的訪問頻率與表中的其他關系值相當,那么這將提高查詢數(shù)據(jù)的性能。

DB2 V9.5引入了XML數(shù)據(jù)的基礎表行存儲。這意味著如果每行的關系數(shù)據(jù)和XML數(shù)據(jù)的總大小沒有超過1頁面的大小,這兩種數(shù)據(jù)就可以存儲在相同的物理頁面。只有當一個記錄的總大小沒有超過頁面大小時,才能夠?qū)ML數(shù)據(jù)進行基礎表行存儲。如果是這樣,XML數(shù)據(jù)就會像通常一樣存儲在XML存儲位置。DB2中允許的頁面最大值為32KB,因此一個XML值的最大插入長度也被限制到32KB。如果文檔的內(nèi)部樹表示的大小比指定的插入長度小,它們將會被插入。清單4中的代碼所創(chuàng)建的表可以對XML數(shù)據(jù)進行基礎表行存儲:

清單4.XML數(shù)據(jù)的基礎表存儲

db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024)

使用 INLINE 選項指定將 XML 數(shù)據(jù)跟關系數(shù)據(jù)存儲在一起。這對于要獲取的數(shù)據(jù)都位于相同位置的查詢來說很有利。另一方面,對于訪問非 XML 數(shù)據(jù)的查詢,這可能導致需要更多的 I/O 才能找到關系數(shù)據(jù)。

#p#

使用 XML 數(shù)據(jù)基礎表行存儲的理想情形是,當表只有一個 XML 類型列并且 XML 文檔的最大值沒有超過頁面大小時。

兼容的 XML 模式演化

為了增加靈活性并提供更好的模式演化,DB2 V9.5 為 XML 模式引入了 update 特性。以前注冊的模式能夠更新為新模式,只要它們互相兼容。如果使用舊模式驗證的 XML 文檔對于新模式仍然有效,那么這兩種模式就是兼容的。

例如,新模式中添加的可選元素和舊模式中的元素兼容,這是由于新元素的可選特性使經(jīng)過舊模式驗證的 XML 文檔仍然有效。新 XML 文檔可以擁有這個可選元素,并且能夠通過新模式的驗證。因為舊文檔仍然有效,所以更新模式之后無需再執(zhí)行任何操作。如果模式不兼容,模式更新就會失敗。舊模式的注釋和標識符仍然會保留。

為了更新模式,DB2 V9.5 引入了 XSR_UPDATE 存儲過程。存儲過程檢查兼容性,只當新模式具備兼容性時才更新模式。要更新模式,用戶需要分別注冊新舊模式,然后調(diào)用 XSR_UPDATE 存儲過程。一旦舊模式經(jīng)過更新,用戶可以選擇保留舊模式或者將其刪除。

讓我們以 customer 表的 info 列作為一個例子。info 列包含 addr 元素,該元素具有以下定義(在 sqllib/samples/db2sampl 目錄下可以找到完整的模式)。

清單 5. 舊 XML 模式定義

﹤xs:element xmlns:xs="            name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

之后,用戶希望擁有一個可選的 HouseNo 元素。要更新已注冊的模式以使標識符保持不變,需要先注冊包含附加元素的新模式。 新 addr 元素的定義如下:

清單 6. 新 XML 模式定義

﹤xs:element xmlns:xs="            name="addr" minOccurs="1" maxOccurs="unbounded"﹥
﹤xs:complexType﹥
﹤xs:sequence﹥
﹤xs:element name="HouseNo" type="xs:string" minOccurs="0" /﹥
﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥
﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥
﹤/xs:sequence﹥
﹤xs:attribute name="country" type="xs:string" /﹥
﹤/xs:complexType﹥
﹤/xs:element﹥

注冊之后,可以用以下存儲過程將現(xiàn)有模式更新為新模式:

清單7. 使用 XSR_UPDATE 更新模式

db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0)

最后一個參數(shù)值0表示更新之后不應該刪除新模式。如果該參數(shù)設置為其他非零值,在更新操作之后新模式將會被刪除。

示例代碼xsupdate.db2演示了兼容的XML模式演化??梢栽趕qllib/samples/xml/clp目錄中找到該示例。

驗證觸發(fā)器支持

為了提高應用程序靈活性并為用戶提供對引入的XML文檔的自動驗證功能,DB2 V9.5擴展了在beforetrigger中對XML的支持。beforetrigger是使用BEFORE選項創(chuàng)建的觸發(fā)器,并在inster/update/delete操作之前執(zhí)行。在beforetrigger中,可以在新變量中引用XML值。觸發(fā)器的操作可以對新值應用xmlvalidate函數(shù)。觸發(fā)器的WHEN子句可以用來檢查是否根據(jù)任何指定模式對新值進行了驗證??梢允褂肳HEN條件中的ISVALIDATED或ISNOTVALIDATEDACCORDINGTOXMLSCHEMA子句來完成該操作。根據(jù)WHEN條件的輸出,可能還需要驗證XML值或設置一個新值。目前,只允許將xmlvalidate函數(shù)用于XML類型的transition變量。觸發(fā)器創(chuàng)建之后,在每次執(zhí)行插入操作時,將會被自動激活并執(zhí)行,如果在插入語句中沒有驗證XML值,也可以用觸發(fā)器進行驗證。

以下代碼是一個DDL語句,用于創(chuàng)建customer表和根據(jù)該表定義的觸發(fā)器。只要存在對表的插入操作,就會激活觸發(fā)器。如果沒有在插入語句中對XML文檔進行驗證,觸發(fā)器將會在插入之前使用xmlvalidate函數(shù)驗證該文檔。以下的示例代碼假設表的customer不存在,并且已經(jīng)在數(shù)據(jù)庫中注冊了該customer模式。

清單8.為一個表定義的觸發(fā)器

CREATE TABLE Customer ( Cid        BIGINT NOT NULL,
info XML,
History XML,
CONSTRAINT PK_CUSTOMER PRIMARY KEY (Cid))
CREATE TRIGGER Trigger_customer NO CASCADE BEFORE INSERT ON customer
REFERENCING NEW AS n
FOR EACH ROW MODE db2sql
WHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID customer)
BEGIN ATOMIC
SET n.info = XMLVALIDATE(n.info ACCORDING TO XMLSCHEMA ID customer);
END@

示例 xmltrig.db2 提供了不同的場景和操作,這些操作用來分配新值并驗證 XML 值,可以在觸發(fā)器內(nèi)部執(zhí)行。該示例可以在 sqllib/samples/xml/clp 目錄中找到。

XML 驗證檢查約束

檢查約束(check constraint)是一類可以在創(chuàng)建表時作用到表列的約束。只有當約束合法時,DB2 才允許插入操作,否則插入將會失敗。

DB2 V9.5 支持對 XML 值進行檢查約束。用戶可以使用檢查約束來加強對 XML 列的驗證。與 before trigger 類似,可以在檢查約束中使用 IS VALIDATED ACCORDING TO XMLSCHEMA 子句來加強驗證。惟一的區(qū)別在于,這種約束只檢查驗證條件,并不會進行實際的驗證。用戶可以在插入語句中使用 xmlvalidate 來顯式驗證 XML 值,或者使用 before trigger 來執(zhí)行自動驗證。根據(jù)檢查約束中指定的模式,只有當 XML 值有效時,才能成功插入。

對一個表 XML 值應用 before trigger 和檢查約束,往往可以確保 XML 值對于指定模式是有效的。只要執(zhí)行了插入操作,before trigger 就會自動進行驗證,而檢查約束將會讓用戶顯式地使用 xmlvalidate 函數(shù)。這兩種方法可以一起使用,以加強 XML 值的完整性。

清單9 中的代碼將會修改 清單 8 中創(chuàng)建的表 customer,以對表執(zhí)行檢查約束:

清單9. 檢查約束

db2 ALTER TABLE customer ADD CONSTRAINT check_info

CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)

上面創(chuàng)建的檢查約束總是會檢查是否根據(jù) customer 模式對文檔進行了驗證。如果沒有觸發(fā)器,用戶需要使用 xmlvalidate 函數(shù)顯式地驗證該文檔。

示例代碼 xmlcheckconstraint.db2 演示了如何為具有相同結構的不同表創(chuàng)建視圖,該視圖可以進行檢查約束,以及按模式對表進行劃分。

XML 復制支持

DB2 V9.5 支持將 XML 數(shù)據(jù)復制到其他支持 XML 數(shù)據(jù)的數(shù)據(jù)庫??梢允褂?WebSphere® Replication Server 9.5 版或者 WebSphere Data Event Publisher 9.5 版來進行復制。WebSphere Replication Server 可以將 XML 數(shù)據(jù)復制到支持 XML 數(shù)據(jù)類型的聯(lián)合目標,也可以將 XML 數(shù)據(jù)映射到 CLOB/BLOB 列。

像任何其他關系列一樣,對 XML 數(shù)據(jù)的復制是在事務消息中完成的,因此復制的 XML 的大小將受到最大事務消息長度的限制。如果數(shù)據(jù)很大,可以在原始文檔中插入一個占位符文檔。也可以在例外表中插入一個例外。

當進行復制時,不能對 XML 模式注冊進行復制。此外,在復制過程中也不能對 XML 數(shù)據(jù)進行驗證。

XML 聯(lián)合支持

WebSphere Federation Server Version 9.1 支持 pureXML,因此能夠集成本地和遠程的 XML 存儲數(shù)據(jù)??梢詫碜圆煌瑪?shù)據(jù)庫的 XML 數(shù)據(jù)當作本地數(shù)據(jù)查看,而且可以用 DB2 XQuery 和 SQL/XML 查詢這些數(shù)據(jù)??梢栽谶h程聯(lián)合數(shù)據(jù)庫上創(chuàng)建一個視圖,以連續(xù)字符串的方式查看該數(shù)據(jù),這些數(shù)據(jù)可以在 WebSphere Federation Server 上解析為 XML 值?,F(xiàn)在 DB2 可以使用 SQL/XML 和 XQuery 語言通過為視圖創(chuàng)建的別名來查詢數(shù)據(jù)。

與驗證本地 XML 值的方式相同,可以使用 db2 xmlvalidate 函數(shù)驗證來自不同聯(lián)合數(shù)據(jù)源的 XML 數(shù)據(jù)。

載入支持

DB2 9 主要支持兩種用 XML 值填充表的方式。insert 語句向表中插入 XML 值,import 實用程序用于將大量數(shù)據(jù)導入表中。

DB2 V9.5 擴展了對 load 實用程序的支持。load 支持 import 支持的大多數(shù) XML 數(shù)據(jù)選項??梢允褂?FROM 子句為 XML 數(shù)據(jù)指定路徑。在 load 期間可以使用 XMLVALIDATE USING 子句對 XML 數(shù)據(jù)進行驗證。load 有 3 個不同的選項:XDS、SCHEMA 和 SCHEMALOCATION HINTS。當指定 XDS 選項時,可以使用 DEFAULT, IGNORE 和 MAP 子句。這些選項的含義與 import 中對應選項的含義相同。可以使用文件類型修改器 XMLCHAR 和 XMLGRAPHIC 指定數(shù)據(jù)的代碼頁。XML 數(shù)據(jù)指定程序(XML data specifier,XDS)在數(shù)據(jù)文件中指定 XML 值。load 重啟的行為和原來一樣。它通過掃描所有 XML 文檔重新構建所有索引。

示例代碼 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 數(shù)據(jù)載入選項??梢栽?sqllib/samples/xml/clp 目錄中找到該示例。

#p#

XSLT支持

DB2 V9.5提供了使用數(shù)據(jù)庫本身的XSL轉(zhuǎn)換來處理XML文檔的功能??梢允褂肵SLT樣式表將存儲在數(shù)據(jù)庫中的XML文檔轉(zhuǎn)換為HTML格式。為此,DB2 V9.5引入了xsltransform函數(shù)。該函數(shù)還支持使用參數(shù)的樣式表。xsltransform函數(shù)可以將作為XML文檔存儲在數(shù)據(jù)庫表列中的XSLT樣式表應用到XML文檔上。這為用戶提供了靈活性,用戶可以檢索來自數(shù)據(jù)庫的經(jīng)過轉(zhuǎn)換的XML文檔,并可以直接在Web上顯示。

現(xiàn)在,假設您已有下面的XML文檔:

清單10.XML文檔

Ice Scraper, Windshield 4 inch
Basic Ice Scraper 4 inches wide, foam handle
3.99

以及相應的 XSLT 樣式表:

清單11. XSLT 樣式表

﹤?xml version="1.0" encoding="UTF-8"?﹥﹤xsl:stylesheet version="1.0"
xmlns:xsl=" ﹤xsl:template match="products"﹥
﹤html﹥
﹤head/﹥
﹤body﹥
﹤table border="1"﹥
﹤th﹥
﹤tr﹥
﹤td width="80"﹥product ID﹤/td﹥
﹤td width="200"﹥product name﹤/td﹥
﹤td width="200"﹥price﹤/td﹥
﹤td width="50"﹥details﹤/td﹥
﹤/tr﹥
﹤/th﹥
﹤xsl:apply-templates/﹥
﹤/table﹥
﹤/body﹥
﹤/html﹥
﹤/xsl:template﹥
﹤xsl:template match="product"﹥
﹤tr﹥
﹤td﹥﹤xsl:value-of select="@pid"/﹥﹤/td﹥
﹤td﹥﹥﹤xsl:value-of select="./description/name"/﹥﹤/td﹥
﹤td﹥﹤xsl:value-of select="./description/price"/﹥﹤/td﹥
﹤td﹥﹤xsl:value-of select="./description/details"/﹥﹤/td﹥
﹤/tr﹥
﹤/xsl:template﹥
﹤/xsl:stylesheet﹥

這些文檔需要存儲在表中,或者當作參數(shù)傳遞。當將這些值作為參數(shù)傳遞時,請確保它們是格式良好的XML文檔。參數(shù)的數(shù)據(jù)類型可以是XML、VARCHAR、CLOB或BLOB。假設文檔和樣式表都存儲在表中,可以用以下語句轉(zhuǎn)換XML文檔:

注意:示例假設存儲文檔的表名稱為xslt,XML文檔的列名為xmldoc,XSL文檔的列名為xsldoc。

清單12.XSLTransform表達式

SELECT XSLTRANSFORM (description USING stylesheet AS CLOB (10M))
FROM product_details

這個查詢輸出一個 HTML 文檔,可以在瀏覽器中進行查看。清單 13 顯示該 HTML 輸出:

清單13. XSLTransform 表達式的 HTML 輸出

﹤html﹥
﹤head﹥
﹤METAhttp-equiv="Content-Type"content="text/html;charset=UTF-8"﹥
﹤/head﹥
﹤body﹥
﹤tableborder="1"﹥
﹤th﹥
﹤tr﹥
﹤tdwidth="80"﹥productID﹥td﹥
﹤tdwidth="200"﹥productname﹥/td﹥
﹤tdwidth="200"﹥price﹥/td﹥
﹤tdwidth="50"﹥details﹥/td﹥
﹤/tr﹥
﹤/th﹥
﹤tr﹥
﹤td﹥100-201-01﹥/td﹥
﹤td﹥IceScraper,Windshield4inch﹥/td﹥
﹤td﹥3.99﹥/td﹥
﹤td﹥BasicIceScraper4incheswide,foamhandle﹥/td﹥
﹤/tr﹥
﹤/table﹥
﹤/body﹥
﹤/html﹥

用戶也可以將XML文檔和一個XSLT樣式表存儲在不同的表中,而且可以通過連接表將單個XSLT樣式表應用到多個XML值。

發(fā)布函數(shù)

發(fā)布函數(shù)用來將關系數(shù)據(jù)轉(zhuǎn)換為XML值。DB2 9引入了SQL/XML支持,該支持在DB2 V9.5中得到了增強和簡化。一些DB2 9SQL/XML函數(shù),比如xmlelement,需要提供所有XML元素的名稱、屬性和其他節(jié)點,而這些元素來自表的關系列或者被顯式地提供。有時用戶需要生成XML值,但是不想牽涉到元素名稱。

通過引入新函數(shù)xmlrow和xmlgroup,DB2 V9.5對現(xiàn)有的發(fā)布函數(shù)進行了擴展。這些函數(shù)從表列獲得XML元素的名稱和值。xmlrow輸出是一個表示為XML的行值的序列,xmlgroup函數(shù)將所有值集合到一個根節(jié)點下。

下表是一個示例employee表,該表擁有員工的詳細地址,包含以下記錄:

IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia

下面的查詢在該行中應用了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中,為了得到相同結果,除了顯式地提供元素名稱,還需要將xmlelement應用到每個列值。

跟V91版本中相同的查詢相比,示例代碼xmlintegrate.db2為這些函數(shù)提供了更多復雜例子??梢栽趕qllib/samples/xml/clp目錄下找到該示例。

將參數(shù)傳遞給sqlquery函數(shù)

在DB2 9中,sqlquery函數(shù)將一個SQL語句嵌入到XQuery表達式中。此函數(shù)將一個字符串值作為輸入,該字符串是一個有效的SQL全選擇語句。在DB2 9中,不能將參數(shù)從XQuery語句傳遞給此函數(shù)。

DB2 V9.5增強了該函數(shù),引進了一個新的parameter函數(shù),該函數(shù)將一個整數(shù)值作為輸入?,F(xiàn)在,sqlquery函數(shù)可以將多個參數(shù)作為輸入,第一個參數(shù)是一個表示全選擇的字符串,其后是參數(shù)的值。sqlquery函數(shù)的第一個字符串參數(shù)可以包含parameter函數(shù),該函數(shù)將會被傳遞給sqlquery函數(shù)的參數(shù)取代,該參數(shù)位于第一個必需的字符串參數(shù)之后。傳遞給parameter函數(shù)的整數(shù)值表示在調(diào)用sqlquery函數(shù)中參數(shù)的位置,該參數(shù)將會在調(diào)用中被取代。例如,parameter(1)告訴解析器用字符串參數(shù)后的第一個參數(shù)替代這個值。參數(shù)的類型應該和全選擇所期望的值類型相同。可以使用類型轉(zhuǎn)換函數(shù)將值轉(zhuǎn)換為一個合適的類型。

讓我們以示例數(shù)據(jù)庫中的customer表作為例子??梢酝ㄟ^運行db2sampl命令和從firststep創(chuàng)建示例數(shù)據(jù)庫。firststep是DB2提供的一個工具,在安裝了DB2之后就會執(zhí)行,也可以在以后通過在Windows中選擇Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps來執(zhí)行。

customer表包含一個作為關系列的cid列,以及表示顧客id的鍵值。infoXML列具有一個屬性Cid,該屬性也表示顧客id。如果數(shù)據(jù)是一致的,那么屬性Cid值應該與特定行的cid列值相同。以下的查詢將檢查數(shù)據(jù)保持一致的行的數(shù)量。Cid屬性的值被傳遞給sqlquery函數(shù),以將其與關系cid值進行比較。

清單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提供了一些不錯的例子,將一個和多個參數(shù)傳遞給sqlquery函數(shù)。可以在sqllib/samples/xml/clp目錄中找到該示例。

現(xiàn)有函數(shù)XMLQuery、XMLtable和XMLExists的默認傳遞行為

在DB2 9中,函數(shù)xmlquery、xmltable和xmlexists用來將Xquery語句嵌入到SQL語句中。利用這些函數(shù)的PASSING子句將參數(shù)從SQL語句傳遞給這些函數(shù)。

在DB2 9中,如果同一個SQL語句中的這些函數(shù)會執(zhí)行多次,那么每次執(zhí)行都需要一個獨立的PASSING子句。有時這會使查詢的結構看起來很復雜和龐大。DB2 V9.5擴展了這些函數(shù),以使用默認的傳遞機制?,F(xiàn)在,將一個列名稱用作這些函數(shù)的Xquery中的一個變量名。如果沒有使用顯式的PASSING子句,默認情況下DB2將傳遞相同列給一個變量。這使查詢更精簡并更易于理解。以下代碼給出了一個針對示例數(shù)據(jù)庫表的例子。查詢?yōu)槊麨镽obertShoemaker的顧客獲取purchaseorder中的第一項。

清單16.SQL/XML函數(shù)的默認傳遞行為

SELECTXMLQUERY('declaredefaultelementnamespace"http://posample.org";
$PORDER/PurchaseOrder/item[1]')
FROMpurchaseorderASp,customerASc
WHEREXMLEXISTS('declaredefaultelementnamespace"
http://posample.org";
$INFO/customerinfo[name="RobertShoemaker"and@Cid=$CUSTID]')

對于SELECT子句中的xmlquery函數(shù),默認情況下傳遞purchaseorder表的porder列。同樣地,對于xmlexists函數(shù),默認情況下傳遞customer表的info列和custid列。請確保以大寫字母的方式使用這些變量的名稱,因為xquery是一個區(qū)分大小寫的語言,而且關系列名稱常常以大寫的方式存儲。

XML驗證約束

DB2 V9.5增強了SELCT語句使用的ISVALIDATED子句,以包含ACCORDINGTOXMLSCHEMAID。現(xiàn)在用戶能夠提供多個模式并僅選擇針對這些模式驗證的XML值。DB2 V9.5可以將任何XML表達式(而不是一列)作為一個操作數(shù),這具有很大的靈活性。下面的例子只選擇了customer表中用customer模式驗證之后的文檔。

清單17.SELECT語句中的XML驗證約束

db2SELECTinfoFROMcustomer
WHEREinfoISVALIDATEDACCORDINGTOXMLSCHEMAIDcustomer

經(jīng)過注釋的XML模式分解

DB2 9支持XML模式的注釋,因此除遞歸模式外,可以將數(shù)據(jù)分解為關系表。DB2 V9.5解除了這個限制,現(xiàn)在即使模式是遞歸的,用戶也可以對數(shù)據(jù)進行注釋和分解。

DB2 V9.5擴展了分解,以提供插入順序。當將數(shù)據(jù)分解成多個具有外鍵關系的表時,這尤其重要。在這種情況下,應該首先填充主表,以保持引用約束??梢允褂靡韵伦⑨屩付ú迦腠樞颍?/P>

清單18.對模式進行注釋,以提供插入順序

CUSTOMER
PURCHASEORDER

示例代碼recxmldecomp.db2和xmldecomposition.db2給出了一些不錯的例子,其中分別演示了將遞歸模式和插入順序進行注釋并分解到表中??梢栽趕qllib/samples/xml/clp目錄中找到示例代碼。

XML索引增強

DB2 9引入了XML索引??梢栽跀?shù)據(jù)庫中XML文檔的特定節(jié)點上創(chuàng)建XML索引。索引的數(shù)據(jù)類型可以是VARCHAR、DOUBLE、DATE或TIMESTAMP。如果索引的數(shù)據(jù)類型與XML文檔的元素類型不匹配,DB2將插入XML值,但是不會為該值創(chuàng)建索引。

DB2 V9.5為索引引入了一個附加子句REJECTINVALIDVALUES。如果使用該子句創(chuàng)建索引,并且索引的數(shù)據(jù)類型與正在插入的XML文檔中元素的數(shù)據(jù)類型不匹配,插入將會失敗。如果在插入XML值之后創(chuàng)建索引,而且數(shù)據(jù)類型不匹配,索引創(chuàng)建也會失敗。

對于DB2 V9.5,這種行為是默認的,也可以使用IGNOREINVALIDVALUES子句顯式地指定這種行為。

下面的示例將會使用REJECTINVALIDVALUES為customer表的Cid屬性創(chuàng)建一個索引。

清單19.XML索引

db2CREATEINDEXindex1ONcustomer(info)
GENERATEKEYUSINGXMLPATTERN
'declaredefaultelementnamespace"
http://posample.org";
/customerinfo/@cid'asSQLDOUBLEREJECTINVALIDVALUES

Index顧問程序和優(yōu)化器增強

索引顧問程序可以用來獲得關于同時為XML和關系數(shù)據(jù)建立索引的建議。通過同時為XML和關系數(shù)據(jù)建立索引,用戶可以獲得良好的性能提升。DB2 9.5優(yōu)化器使用兩種類型的索引來優(yōu)化查詢,并幫助選擇最佳的查詢執(zhí)行計劃。

DB2 DataWeb服務

使用DataWeb服務,可以將DB2 V9.5XML數(shù)據(jù)作為數(shù)據(jù)庫manipulation(ML)操作的Web服務公開。DataWeb服務(DES)將ML操作(如插入、更新、選擇和存儲過程)作為Web服務公開??梢酝ㄟ^Web瀏覽器、用戶客戶端使用基于HTTP的SOAP協(xié)議(例如POST和GET方法)來訪問這些Web服務。通過在現(xiàn)有數(shù)據(jù)庫工具中集成基于Eclipse的工具,可以對DataWeb服務提供支持。

控制中心也經(jīng)過了更新,以處理XML數(shù)據(jù)。

結束語

DB2 9將XML作為一個新數(shù)據(jù)類型引入,而且提供了處理XML值的基礎設施。它提供了一些基本功能,比如查詢XML文檔、注冊模式和驗證XML文檔、使用SQL/XML在SQL和XQuery之間交互。DB2 V9.5增強了現(xiàn)有的功能,并提供了更多函數(shù)以有效地處理XML數(shù)據(jù)。

【編輯推薦】

  1. 用DB2 pureXML執(zhí)行不區(qū)分大小寫的高效搜索
  2. PureXML應用之星的發(fā)現(xiàn)之旅
  3. 基于pureXML技術的數(shù)據(jù)庫表結構擴展
責任編輯:book05 來源: ITPUB
相關推薦

2010-08-06 15:14:03

DB2 V9.5 新特

2010-08-27 11:39:19

DB2鎖定新特性

2011-11-30 21:46:24

ibmdwDB2 pureXML

2010-08-20 12:49:49

DB2 pureXML

2009-01-18 16:33:09

pureXMLDB2 pureXMLXML

2009-09-25 11:44:00

ibmdwDB2

2009-09-22 12:25:04

ibmdwDB2

2010-08-09 17:52:38

DB2 pureXML

2009-04-17 10:07:42

2010-09-06 13:19:35

DB2 9.5

2009-11-23 19:57:01

ibmdwDB2

2010-08-05 09:03:27

DB2 9.5高可用性

2009-03-03 12:58:14

pureXML大小寫DB2

2010-07-28 10:22:44

DB2 9.5

2010-08-05 16:08:12

輕松掌握DB2 9.5

2010-02-23 09:39:25

DB2 9.7

2009-03-11 14:59:17

數(shù)據(jù)庫DB2數(shù)據(jù)庫分區(qū)

2011-05-25 17:05:40

ibmdwDB2

2010-08-03 16:54:10

DB2 9.5

2010-08-03 08:46:23

DB2 9.5高可用性
點贊
收藏

51CTO技術棧公眾號