成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DB2 Version 9.5 pureXML的增強(qiáng)和新特性

數(shù)據(jù)庫
本文描述 IBM® DB2® V9.5 版針對(duì) Linux、Unix 和 Windows 的 pureXML™ 增強(qiáng)和新特性。DB2 Version 9 支持將 XML 作為原生數(shù)據(jù)類型,也支持 SQL/XML、XQuery 語言,以及其他諸如模式支持、發(fā)布函數(shù)、對(duì)實(shí)用工具的 XML 支持、分解等特性。DB2 V9.5 增強(qiáng)了其中的一些特性并引入了新特性,以更加高效地處理 XML。本文從如何使 XML 處理更高效和更易于使用的角度解釋了這些增強(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 CONNECT TO sampledb
db2 CREATE TABLE record(id INT, record XML)
子文檔更新

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
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驗(yàn)證檢查約束,在手動(dòng)更新或者通過觸發(fā)器更新之前,用戶可能需要驗(yàn)證新的XML值。

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

清單3.transform表達(dá)式

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表達(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 模式定義

﹤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﹥

之后,用戶希望擁有一個(gè)可選的 HouseNo 元素。要更新已注冊(cè)的模式以使標(biāo)識(shí)符保持不變,需要先注冊(cè)包含附加元素的新模式。 新 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﹥

注冊(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,
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 提供了不同的場(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 樣式表

﹤?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﹥

這些文檔需要存儲(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))
FROM product_details

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

清單13. XSLTransform 表達(dá)式的 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文檔和一個(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ù)。

【編輯推薦】

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

2010-08-06 15:14:03

DB2 V9.5 新特

2010-08-27 11:39:19

DB2鎖定新特性

2010-08-20 12:49:49

DB2 pureXML

2011-11-30 21:46:24

ibmdwDB2 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

2009-03-03 12:58:14

pureXML大小寫DB2

2010-08-05 09:03:27

DB2 9.5高可用性

2010-08-05 16:08:12

輕松掌握DB2 9.5

2010-02-23 09:39:25

DB2 9.7

2010-07-28 10:22:44

DB2 9.5

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高可用性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 国产网站在线播放 | 成人妇女免费播放久久久 | 在线国产一区 | 精品一区二区三区四区在线 | 欧美一区二区在线 | 欧美精品一区二区三区四区 在线 | 国内精品久久精品 | 国产成人精品一区二三区在线观看 | 韩国av影院 | 亚洲男人网| 国外成人在线视频网站 | 国产激情综合五月久久 | 国产女人叫床高潮大片免费 | 亚洲一区二区三区在线视频 | 91麻豆蜜桃一区二区三区 | www.夜夜骑.com | 成人激情视频在线播放 | 色香婷婷| 国产激情在线 | 成人午夜精品 | 日韩精品一区二区三区在线播放 | 欧美成人hd | 久久国产成人 | 亚洲欧洲一区二区 | 亚洲网站在线播放 | 人人人干 | 91精品国产一区二区三区动漫 | 国产成人免费网站 | 国产精品区二区三区日本 | 久久久久久久久久久福利观看 | 欧美激情久久久 | 91精品国产综合久久婷婷香蕉 | 国产一区二区三区在线视频 | 国产精品国产 | 久久久久久九九九九九九 | 色天天综合| 久久久久久国产精品免费免费 | 欧美在线播放一区 | 亚洲精品一区二区 | 成人3d动漫一区二区三区91 |