色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

DB2 Version 9.5 pureXML的增強和新特性

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

DB2 9 引入了原生 XML 數(shù)據(jù)類型。它將 XML 存儲為一種經(jīng)過解析的分層(原生)格式,并允許用戶使用 XQuery 和 SQL/XML 語言查詢數(shù)據(jù)。DB2 XQuery 表達式將存儲在 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ù)支持對一些實用工具(導入、導出等等)進行了更新。更多關于 Version 9 中的 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 索引增強

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

◆DB2 Data Web 服務

以下小節(jié)的大多數(shù)代碼示例都基于 DB2 V9.5 示例數(shù)據(jù)庫。可以從 DB2 V9.5 命令行處理器運行 db2sampl 命令來創(chuàng)建示例數(shù)據(jù)庫。也可以通過 first step 來創(chuàng)建。first step 是 DB2 提供的一個工具,在安裝了 DB2 之后就會執(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 格式的,也需要存儲到 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 sampledbdb2 CONNECT TO sampledbdb2 CREATE TABLE record(id INT, record XML)子文檔更新

DB2 V9.5 允許用戶更新存儲在數(shù)據(jù)庫中的 XML 文檔的一部分。它引入了 XQuery transform 表達式,該表達式使用 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 文檔中。可以在 XML 文檔指定插入的位置。

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

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

清單3. transform 表達式

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 表達式的不同例子。可以在 sqllib/samples/xml/xquery/clp 目錄下找到此示例。

基礎表行存儲/壓縮

在 DB2 9 中,XML 數(shù)據(jù)和關系數(shù)據(jù)存儲在不同的位置。這個存儲位置稱作 XML 數(shù)據(jù)區(qū)域(XML data area,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ū)?XML 數(shù)據(jù)進行基礎表行存儲。如果是這樣,XML 數(shù)據(jù)就會像通常一樣存儲在 XML 存儲位置。DB2 中允許的頁面最大值為 32 KB,因此一個 XML 值的最大插入長度也被限制到 32 KB。如果文檔的內(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ù)。

使用 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='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>

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

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

清單7. 使用 XSR_UPDATE 更新模式

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

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

示例代碼 xsupdate.db2 演示了兼容的 XML 模式演化。可以在 sqllib/samples/xml/clp 目錄中找到該示例。

驗證觸發(fā)器支持

為了提高應用程序靈活性并為用戶提供對引入的 XML 文檔的自動驗證功能,DB2 V9.5 擴展了在 before trigger 中對 XML 的支持。 before trigger 是使用 BEFORE 選項創(chuàng)建的觸發(fā)器,并在 inster/update/delete 操作之前執(zhí)行。在 before trigger 中,可以在新變量中引用 XML 值。觸發(fā)器的操作可以對新值應用 xmlvalidate 函數(shù)。觸發(fā)器的 WHEN 子句可以用來檢查是否根據(jù)任何指定模式對新值進行了驗證。可以使用 WHEN 條件中的 IS VALIDATED 或 IS NOT VALIDATED ACCORDING TO XMLSCHEMA 子句來完成該操作。根據(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 ( 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 提供了不同的場景和操作,這些操作用來分配新值并驗證 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ù)。可以在遠程聯(lián)合數(shù)據(jù)庫上創(chuàng)建一個視圖,以連續(xù)字符串的方式查看該數(shù)據(jù),這些數(shù)據(jù)可以在 WebSphere Federation Server 上解析為 XML 值。現(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 目錄中找到該示例。

XSLT 支持

DB2 V9.5 提供了使用數(shù)據(jù)庫本身的 XSL 轉(zhuǎn)換來處理 XML 文檔的功能。可以使用 XSLT 樣式表將存儲在數(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='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>

這些文檔需要存儲在表中,或者當作參數(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><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 文檔和一個 XSLT 樣式表存儲在不同的表中,而且可以通過連接表將單個 XSLT 樣式表應用到多個 XML 值。

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

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

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

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

ID NAME STREET CITY STATE COUNTRY

1 manoj sector14 gurgaon haryana india

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

跟 V91 版本中相同的查詢相比,示例代碼 xmlintegrate.db2 為這些函數(shù)提供了更多復雜例子。可以在 sqllib/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ù)值作為輸入。現(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 命令和從 first step 創(chuàng)建示例數(shù)據(jù)庫。first step 是 DB2 提供的一個工具,在安裝了 DB2 之后就會執(zhí)行,也可以在以后通過在 Windows 中選擇 Start> All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執(zhí)行。

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

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

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

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]')

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

XML 驗證約束

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

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

db2 SELECT info FROM customer

WHERE info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer

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

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

DB2 V9.5 擴展了分解,以提供插入順序。當將數(shù)據(jù)分解成多個具有外鍵關系的表時,這尤其重要。在這種情況下,應該首先填充主表,以保持引用約束。可以使用以下注釋指定插入順序:

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

CUSTOMER

PURCHASEORDER

示例代碼 recxmldecomp.db2 和 xmldecomposition.db2 給出了一些不錯的例子,其中分別演示了將遞歸模式和插入順序進行注釋并分解到表中。可以在 sqllib/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 為索引引入了一個附加子句 REJECT INVALID VALUES。如果使用該子句創(chuàng)建索引,并且索引的數(shù)據(jù)類型與正在插入的 XML 文檔中元素的數(shù)據(jù)類型不匹配,插入將會失敗。如果在插入 XML 值之后創(chuàng)建索引,而且數(shù)據(jù)類型不匹配,索引創(chuàng)建也會失敗。

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

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

清單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)化器增強

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

DB2 Data Web 服務

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

控制中心也經(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ù)。

主站蜘蛛池模板: 国产亚洲精品影达达兔 | avove在线播放 | 日本激情视频在线观看 | 日韩二区三区 | 成人软件18免费网站 | 真人一级一级特黄高清毛片 | 午夜嘿咻 | 成人欧美| 欧美深夜影院 | 在线观看国产情趣免费视频 | 久草黄视频 | 九九免费精品视频在这里 | 欧美一级www片免费观看 | 久久久一区二区三区不卡 | 欧美理论在线 | 我要看欧美精品一级毛片 | 九九视频精品在线 | 成人首页 | 国产成人18黄网站免费 | 美女免费毛片 | 国内一级特黄女人精品片 | 国产一区三区二区中文在线 | 91精品久久久久亚洲国产 | 69成人做爰视频在线观看 | 97视频免费公开成人福利 | 亚洲精品一区二区三区 | 怡红院亚洲怡红院首页 | 视频二区精品中文字幕 | 香蕉视频在线观看黄 | 精品午夜国产在线观看不卡 | 97视频免费公开成人福利 | 国产午夜免费视频 | 亚洲欧美日韩国产精品26u | 国产一级网站 | 日韩手机看片福利精品 | 杨幂精品国产专区91在线 | 手机看片免费基地 | 91精品全国免费观看 | 免费一级毛片麻豆精品 | 日韩精品免费视频 | 毛片美国 |