国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:3日期:2023-11-09 16:24:57
本文描述 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 9 XML 支持概述

DB2 9 引入了原生 XML 數(shù)據(jù)類型。它將 XML 存儲(chǔ)為一種經(jīng)過解析的分層(原生)格式,并允許用戶使用 XQuery 和 SQL/XML 語言查詢數(shù)據(jù)。DB2 XQuery 表達(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)于 Version 9 中的 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)

◆索引顧問程序(Index advisor)和優(yōu)化器增強(qiáng)

◆DB2 Data Web 服務(wù)

以下小節(jié)的大多數(shù)代碼示例都基于 DB2 V9.5 示例數(shù)據(jù)庫。可以從 DB2 V9.5 命令行處理器運(yùn)行 db2sampl 命令來創(chuàng)建示例數(shù)據(jù)庫。也可以通過 first step 來創(chuàng)建。first step 是 DB2 提供的一個(gè)工具,在安裝了 DB2 之后就會(huì)執(zhí)行,也可以在以后通過在 Windows 中選擇 Start > All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執(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 sampledbdb2 CONNECT TO sampledbdb2 CREATE TABLE record(id INT, record XML)子文檔更新

DB2 V9.5 允許用戶更新存儲(chǔ)在數(shù)據(jù)庫中的 XML 文檔的一部分。它引入了 XQuery transform 表達(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 CUSTOMERSET info = XMLQUERY('transform copy $po := $INFOmodify do replace value of $po/customerinfo/@Cid with $CIDreturn $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 wherecustid = 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ū)域(XML data area,XDA)。DB2 9 將所有 XML 文檔存儲(chǔ)在這個(gè)存儲(chǔ)位置,這意味著訪問 XML 值和關(guān)系數(shù)據(jù)需要更多 I/O。如果 XML 文檔較小,而且在存儲(chǔ)關(guān)系值之后頁面大小仍足夠容納 XML 值,那么將 XML 存儲(chǔ)在相同的頁面能夠提供不錯(cuò)的性能收益。這些收益包括:

壓縮:因?yàn)?XML 數(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ū)?XML 數(shù)據(jù)進(jìn)行基礎(chǔ)表行存儲(chǔ)。如果是這樣,XML 數(shù)據(jù)就會(huì)像通常一樣存儲(chǔ)在 XML 存儲(chǔ)位置。DB2 中允許的頁面最大值為 32 KB,因此一個(gè) XML 值的最大插入長度也被限制到 32 KB。如果文檔的內(nèi)部樹表示的大小比指定的插入長度小,它們將會(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ù)。

使用 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='http://www.w3.org/2001/XMLSchema' 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='http://www.w3.org/2001/XMLSchema' 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 模式演化。可以在 sqllib/samples/xml/clp 目錄中找到該示例。

驗(yàn)證觸發(fā)器支持

為了提高應(yīng)用程序靈活性并為用戶提供對(duì)引入的 XML 文檔的自動(dòng)驗(yàn)證功能,DB2 V9.5 擴(kuò)展了在 before trigger 中對(duì) XML 的支持。 before trigger 是使用 BEFORE 選項(xiàng)創(chuàng)建的觸發(fā)器,并在 inster/update/delete 操作之前執(zhí)行。在 before trigger 中,可以在新變量中引用 XML 值。觸發(fā)器的操作可以對(duì)新值應(yīng)用 xmlvalidate 函數(shù)。觸發(fā)器的 WHEN 子句可以用來檢查是否根據(jù)任何指定模式對(duì)新值進(jìn)行了驗(yàn)證。可以使用 WHEN 條件中的 IS VALIDATED 或 IS NOT VALIDATED ACCORDING TO XMLSCHEMA 子句來完成該操作。根據(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 ( CidBIGINT 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 db2sqlWHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID customer)BEGIN ATOMICSET n.info = XMLVALIDATE(n.info ACCORDING TO XMLSCHEMA ID customer);END@

示例 xmltrig.db2 提供了不同的場景和操作,這些操作用來分配新值并驗(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ù)消息長度的限制。如果數(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ù)。可以在遠(yuǎn)程聯(lián)合數(shù)據(jù)庫上創(chuàng)建一個(gè)視圖,以連續(xù)字符串的方式查看該數(shù)據(jù),這些數(shù)據(jù)可以在 WebSphere Federation Server 上解析為 XML 值。現(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 目錄中找到該示例。

XSLT 支持

DB2 V9.5 提供了使用數(shù)據(jù)庫本身的 XSL 轉(zhuǎn)換來處理 XML 文檔的功能。可以使用 XSLT 樣式表將存儲(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='http://www.w3.org/1999/XSL/Transform'><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><META http-equiv='Content-Type' content='text/html; charset=UTF-8'></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><tr><td>100-201-01>/td><td>Ice Scraper, Windshield 4 inch>/td><td>3.99>/td><td>Basic Ice Scraper 4 inches wide, foam handle>/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)和簡化。一些 DB2 9 SQL/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ì)地址,包含以下記錄:

ID NAME STREET CITY STATE COUNTRY

1 manoj sector14 gurgaon haryana india

下面的查詢?cè)谠撔兄袘?yīng)用了 xmlrow 和 xmlgroup 函數(shù)。

清單14. 新發(fā)布函數(shù)

db2 SELECT XMLROW(id, name, street, city,state, country) FROM EMPLOYEE

1

manoj

sector14

gurgaon

haryana

india

db2 SELECT XMLGROUP(id, name, street, city,state, country) FROM EMPLOYEE

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ù)值作為輸入。現(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)該和全選擇所期望的值類型相同。可以使用類型轉(zhuǎn)換函數(shù)將值轉(zhuǎn)換為一個(gè)合適的類型。

讓我們以示例數(shù)據(jù)庫中的 customer 表作為例子。可以通過運(yùn)行 db2sampl 命令和從 first step 創(chuàng)建示例數(shù)據(jù)庫。first step 是 DB2 提供的一個(gè)工具,在安裝了 DB2 之后就會(huì)執(zhí)行,也可以在以后通過在 Windows 中選擇 Start> All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執(zhí)行。

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

清單15. 將參數(shù)傳遞給sqlquery函數(shù)

xquery declare default element namespace 'http://posample.org';

for $i in db2-fn:xmlcolumn('CUSTOMER.INFO')/customerinfo/@Cid

for $j in db2-fn:sqlquery('select info from customer where cid=parameter(1)', $i)

return

{$i}

此查詢返回所有數(shù)據(jù)一致的顧客 id。

示例代碼 xqueryparam.db2 提供了一些不錯(cuò)的例子,將一個(gè)和多個(gè)參數(shù)傳遞給 sqlquery 函數(shù)。可以在 sqllib/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ī)制。現(xiàn)在,將一個(gè)列名稱用作這些函數(shù)的 Xquery 中的一個(gè)變量名。如果沒有使用顯式的 PASSING 子句,默認(rèn)情況下 DB2 將傳遞相同列給一個(gè)變量。這使查詢更精簡并更易于理解。以下代碼給出了一個(gè)針對(duì)示例數(shù)據(jù)庫表的例子。查詢?yōu)槊麨?Robert Shoemaker 的顧客獲取 purchaseorder 中的第一項(xiàng)。

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

SELECT XMLQUERY('declare default element namespace 'http://posample.org';

$PORDER/PurchaseOrder/item[1]' )

FROM purchaseorder AS p, customer AS c

WHERE XMLEXISTS('declare default element namespace 'http://posample.org';

$INFO/customerinfo[name='Robert Shoemaker' and @Cid = $CUSTID]')

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

XML 驗(yàn)證約束

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

清單17. SELECT 語句中的 XML 驗(yàn)證約束

db2 SELECT info FROM customer

WHERE info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer

經(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)該首先填充主表,以保持引用約束。可以使用以下注釋指定插入順序:

清單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è)附加子句 REJECT INVALID VALUES。如果使用該子句創(chuàng)建索引,并且索引的數(shù)據(jù)類型與正在插入的 XML 文檔中元素的數(shù)據(jù)類型不匹配,插入將會(huì)失敗。如果在插入 XML 值之后創(chuàng)建索引,而且數(shù)據(jù)類型不匹配,索引創(chuàng)建也會(huì)失敗。

對(duì)于 DB2 V 9.5,這種行為是默認(rèn)的,也可以使用 IGNORE INVALID VALUES 子句顯式地指定這種行為。

下面的示例將會(huì)使用 REJECT INVALID VALUES 為 customer 表的 Cid 屬性創(chuàng)建一個(gè)索引。

清單19. XML 索引

db2 CREATE INDEX index1 ON customer(info)

GENERATE KEY USING XMLPATTERN

'declare default element namespace 'http://posample.org';

/customerinfo/@cid' as SQL DOUBLE REJECT INVALID VALUES

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 Data Web 服務(wù)

使用 Data Web 服務(wù),可以將 DB2 V9.5 XML 數(shù)據(jù)作為 數(shù)據(jù)庫 manipulation(ML)操作的 Web 服務(wù)公開。Data Web 服務(wù)(DES)將 ML 操作(如插入、更新、選擇和存儲(chǔ)過程)作為 Web 服務(wù)公開。可以通過 Web 瀏覽器、用戶客戶端使用基于 HTTP 的 SOAP 協(xié)議(例如 POST 和 GET 方法)來訪問這些 Web 服務(wù)。通過在現(xiàn)有數(shù)據(jù)庫工具中集成基于 Eclipse 的工具,可以對(duì) Data Web 服務(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ù)。

標(biāo)簽: DB2 數(shù)據(jù)庫
主站蜘蛛池模板: 荆州市| 永修县| 马尔康县| 察雅县| 皮山县| 建湖县| 红桥区| 图木舒克市| 社会| 上饶市| 增城市| 荣昌县| 南汇区| 延寿县| 泰州市| 仁寿县| 准格尔旗| 博白县| 宁海县| 富锦市| 油尖旺区| 德化县| 郁南县| 吴川市| 两当县| 清水河县| 福建省| 广平县| 呼图壁县| 正蓝旗| 巴青县| 乐东| 渭源县| 岑溪市| 嵊泗县| 绩溪县| 香港| 邵武市| 筠连县| 馆陶县| 安吉县|