| 導購 | 订阅 | 在线投稿
分享
 
 
 

DB2 Version 9.5 pureXML的增強和新特性

來源:互聯網  2008-07-11 05:57:53  評論

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

DB2 9 XML 支持概述

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

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

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

DB2 V9.5 的新特性

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

◆支持在非 Unicode 數據庫中使用 XML

◆子文檔更新

◆基礎表存儲/壓縮

◆兼容的 XML 模式演化

◆驗證觸發器

◆驗證檢查約束

◆XML 複制

◆XML 聯合

◆XML 載入

◆sqlquery() 參數

◆用戶友好的發布函數

◆SQL/XML 函數的默認參數傳遞

◆XSLT 函數

◆XML 分解增強

◆XML 索引增強

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

◆DB2 Data Web 服務

以下小節的大多數代碼示例都基于 DB2 V9.5 示例數據庫。可以從 DB2 V9.5 命令行處理器運行 db2sampl 命令來創建示例數據庫。也可以通過 first step 來創建。first step 是 DB2 提供的一個工具,在安裝了 DB2 之後就會執行,也可以在以後通過在 Windows 中選擇 Start > All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執行。

支持在非 Unicode 數據庫中使用 XML

DB2 9 只允許用戶使用 UTF-8 代碼頁創建包含 XML 數據的數據庫。這意味著,即使 XML 文檔中的值是 ASCII 格式的,也需要存儲到 UTF-8 格式的數據庫中。DB2 V9.5 去掉了這個限制,並且允許用戶用任意代碼集創建包含 XML 列的數據庫。由于去掉了這個限制,即使數據庫不是用 UTF-8 格式創建的,用戶也可以更改一個表以添加 XML 列,或者創建一個包含 XML 列的新表。

以下代碼創建了一個示例數據庫和包含一個 XML 列的示例表:

清單1. 使用默認代碼頁的數據庫

db2 CREATE DATABASE sampledb

db2 CONNECT TO sampledb

db2 CREATE TABLE record(id INT, record XML)

子文檔更新

DB2 V9.5 允許用戶更新存儲在數據庫中的 XML 文檔的一部分。它引入了 XQuery transform 表達式,該表達式使用 4 個更新表達式 —— insert、delete、replace 和 rename 來修改 XML 文檔片段。transform 表達式是 XQuery 語言的一部分,因此可以用在 XQuery 表達式中。對于 DB2 V9.5,一個 transform 表達式中只能使用一個更新表達式。一個 transform 表達式有以下子句:

◆COPY:transform 表達式的 copy 子句 將源 XML 值綁定到一個變量。更新表達式將會在查詢中對該副本進行處理。

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

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

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

1.insert 表達式 將一個新的 XML 節點插入到現有 XML 文檔中。可以在 XML 文檔指定插入的位置。

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

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

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

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

清單 2 中的代碼更新了示例數據庫中 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 驗證檢查約束,在手動更新或者通過觸發器更新之前,用戶可能需要驗證新的 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 表達式的不同例子。可以在 sqllib/samples/xml/xquery/clp 目錄下找到此示例。

基礎表行存儲/壓縮

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

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

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

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

清單4.XML 數據的基礎表存儲

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

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

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

兼容的 XML 模式演化

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

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

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

讓我們以 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>

注冊之後,可以用以下存儲過程將現有模式更新爲新模式:

清單7. 使用 XSR_UPDATE 更新模式

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

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

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

驗證觸發器支持

爲了提高應用程序靈活性並爲用戶提供對引入的 XML 文檔的自動驗證功能,DB2 V9.5 擴展了在 before trigger 中對 XML 的支持。 before trigger 是使用 BEFORE 選項創建的觸發器,並在 inster/update/delete 操作之前執行。在 before trigger 中,可以在新變量中引用 XML 值。觸發器的操作可以對新值應用 xmlvalidate 函數。觸發器的 WHEN 子句可以用來檢查是否根據任何指定模式對新值進行了驗證。可以使用 WHEN 條件中的 IS VALIDATED 或 IS NOT VALIDATED ACCORDING TO XMLSCHEMA 子句來完成該操作。根據 WHEN 條件的輸出,可能還需要驗證 XML 值或設置一個新值。目前,只允許將 xmlvalidate 函數用于 XML 類型的 transition 變量。觸發器創建之後,在每次執行插入操作時,將會被自動激活並執行,如果在插入語句中沒有驗證 XML 值,也可以用觸發器進行驗證。

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

清單8. 爲一個表定義的觸發器

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 值,可以在觸發器內部執行。該示例可以在 sqllib/samples/xml/clp 目錄中找到。

XML 驗證檢查約束

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

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

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

清單9 中的代碼將會修改 清單 8 中創建的表 customer,以對表執行檢查約束:

清單9. 檢查約束

db2 ALTER TABLE customer ADD CONSTRAINT check_info

CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)

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

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

XML 複制支持

DB2 V9.5 支持將 XML 數據複制到其他支持 XML 數據的數據庫。可以使用 WebSphere® Replication Server 9.5 版或者 WebSphere Data Event Publisher 9.5 版來進行複制。WebSphere Replication Server 可以將 XML 數據複制到支持 XML 數據類型的聯合目標,也可以將 XML 數據映射到 CLOB/BLOB 列。

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

當進行複制時,不能對 XML 模式注冊進行複制。此外,在複制過程中也不能對 XML 數據進行驗證。

XML 聯合支持

WebSphere Federation Server Version 9.1 支持 pureXML,因此能夠集成本地和遠程的 XML 存儲數據。可以將來自不同數據庫的 XML 數據當作本地數據查看,而且可以用 DB2 XQuery 和 SQL/XML 查詢這些數據。可以在遠程聯合數據庫上創建一個視圖,以連續字符串的方式查看該數據,這些數據可以在 WebSphere Federation Server 上解析爲 XML 值。現在 DB2 可以使用 SQL/XML 和 XQuery 語言通過爲視圖創建的別名來查詢數據。

與驗證本地 XML 值的方式相同,可以使用 db2 xmlvalidate 函數驗證來自不同聯合數據源的 XML 數據。

載入支持

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

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

示例代碼 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 數據載入選項。可以在 sqllib/samples/xml/clp 目錄中找到該示例。

XSLT 支持

DB2 V9.5 提供了使用數據庫本身的 XSL 轉換來處理 XML 文檔的功能。可以使用 XSLT 樣式表將存儲在數據庫中的 XML 文檔轉換爲 HTML 格式。爲此,DB2 V9.5 引入了 xsltransform 函數。該函數還支持使用參數的樣式表。xsltransform 函數可以將作爲 XML 文檔存儲在數據庫表列中的 XSLT 樣式表應用到 XML 文檔上。這爲用戶提供了靈活性,用戶可以檢索來自數據庫的經過轉換的 XML 文檔,並可以直接在 Web 上顯示。

現在,假設您已有下面的 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>

這些文檔需要存儲在表中,或者當作參數傳遞。當將這些值作爲參數傳遞時,請確保它們是格式良好的 XML 文檔。參數的數據類型可以是 XML、VARCHAR、CLOB 或 BLOB。假設文檔和樣式表都存儲在表中,可以用以下語句轉換 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 值。

發布函數

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

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

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

ID NAME STREET CITY STATE COUNTRY

1 manoj sector14 gurgaon haryana india

下面的查詢在該行中應用了 xmlrow 和 xmlgroup 函數。

清單14. 新發布函數

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 爲這些函數提供了更多複雜例子。可以在 sqllib/samples/xml/clp 目錄下找到該示例。

將參數傳遞給 sqlquery 函數

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

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

讓我們以示例數據庫中的 customer 表作爲例子。可以通過運行 db2sampl 命令和從 first step 創建示例數據庫。first step 是 DB2 提供的一個工具,在安裝了 DB2 之後就會執行,也可以在以後通過在 Windows 中選擇 Start> All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執行。

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

清單15. 將參數傳遞給sqlquery函數

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}

此查詢返回所有數據一致的顧客 id。

示例代碼 xqueryparam.db2 提供了一些不錯的例子,將一個和多個參數傳遞給 sqlquery 函數。可以在 sqllib/samples/xml/clp 目錄中找到該示例。

現有函數 XMLQuery、XMLtable 和 XMLExists 的默認傳遞行爲

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

在 DB2 9 中,如果同一個 SQL 語句中的這些函數會執行多次,那麽每次執行都需要一個獨立的 PASSING 子句。有時這會使查詢的結構看起來很複雜和龐大。DB2 V9.5 擴展了這些函數,以使用默認的傳遞機制。現在,將一個列名稱用作這些函數的 Xquery 中的一個變量名。如果沒有使用顯式的 PASSING 子句,默認情況下 DB2 將傳遞相同列給一個變量。這使查詢更精簡並更易于理解。以下代碼給出了一個針對示例數據庫表的例子。查詢爲名爲 Robert Shoemaker 的顧客獲取 purchaseorder 中的第一項。

清單 16. SQL/XML 函數的默認傳遞行爲

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 函數,默認情況下傳遞 purchaseorder 表的 porder 列。同樣地,對于 xmlexists 函數,默認情況下傳遞 customer 表的 info 列和 custid 列。請確保以大寫字母的方式使用這些變量的名稱,因爲 xquery 是一個區分大小寫的語言,而且關系列名稱常常以大寫的方式存儲。

XML 驗證約束

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

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

db2 SELECT info FROM customer

WHERE info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer

經過注釋的 XML 模式分解

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

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

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

CUSTOMER

PURCHASEORDER

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

XML索引增強

DB2 9 引入了 XML 索引。可以在數據庫中 XML 文檔的特定節點上創建 XML 索引。索引的數據類型可以是 VARCHAR、DOUBLE、DATE 或 TIMESTAMP。如果索引的數據類型與 XML 文檔的元素類型不匹配,DB2 將插入 XML 值,但是不會爲該值創建索引。

DB2 V9.5 爲索引引入了一個附加子句 REJECT INVALID VALUES。如果使用該子句創建索引,並且索引的數據類型與正在插入的 XML 文檔中元素的數據類型不匹配,插入將會失敗。如果在插入 XML 值之後創建索引,而且數據類型不匹配,索引創建也會失敗。

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

下面的示例將會使用 REJECT INVALID VALUES 爲 customer 表的 Cid 屬性創建一個索引。

清單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顧問程序和優化器增強

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

DB2 Data Web 服務

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

控制中心也經過了更新,以處理 XML 數據。

結束語

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

本文描述 IBM® DB2® V9.5 版針對 Linux、Unix 和 Windows 的 pureXML™ 增強和新特性。DB2 Version 9 支持將 XML 作爲原生數據類型,也支持 SQL/XML、XQuery 語言,以及其他諸如模式支持、發布函數、對實用工具的 XML 支持、分解等特性。DB2 V9.5 增強了其中的一些特性並引入了新特性,以更加高效地處理 XML。本文從如何使 XML 處理更高效和更易于使用的角度解釋了這些增強和新特性。 DB2 9 XML 支持概述 DB2 9 引入了原生 XML 數據類型。它將 XML 存儲爲一種經過解析的分層(原生)格式,並允許用戶使用 XQuery 和 SQL/XML 語言查詢數據。DB2 XQuery 表達式將存儲在 DB2 數據庫中的 XML 文檔用作 XML 的查詢源。函數 xmlcolumn 和 sqlquery 用來連接存儲在數據庫中的 XML 值,並爲 XQuery 解析器提供 XML 序列。 除了 XQuery 語言,DB2 9 還提供了 SQL/XML 函數在單個查詢中同時處理 XML 數據和關系數據。SQL/XML 函數 xmlquery、xmltable 和 xmlexists 有助于將 XQuery 嵌入到 SQL 語句中。 DB2 9 還支持模式驗證。它引入了新的命令和存儲過程,用于將模式注冊到數據庫並充當數據庫對象。在插入操作之前或之後,可以用 xmlvalidate 函數根據已注冊的模式驗證 XML 值。也可以對模式進行注釋,以便于將 XML 數據分解爲關系表。 諸如 xmlelement、xmlattributes 等發布函數可用來將關系值轉換爲 XML 文檔。DB2 9 也針對 XML 數據支持對一些實用工具(導入、導出等等)進行了更新。更多關于 Version 9 中的 XML 支持請參見 參考資料 部分。 DB2 V9.5 的新特性 在處理 XML 數據方面,現有的 DB2 9 功能非常強大。DB2 V9.5 增強了一些現有特性並引入了其他功能,以使 XML 處理更加強大和高效。下面是本文將要討論的功能列表: ◆支持在非 Unicode 數據庫中使用 XML ◆子文檔更新 ◆基礎表存儲/壓縮 ◆兼容的 XML 模式演化 ◆驗證觸發器 ◆驗證檢查約束 ◆XML 複制 ◆XML 聯合 ◆XML 載入 ◆sqlquery() 參數 ◆用戶友好的發布函數 ◆SQL/XML 函數的默認參數傳遞 ◆XSLT 函數 ◆XML 分解增強 ◆XML 索引增強 ◆索引顧問程序(Index advisor)和優化器增強 ◆DB2 Data Web 服務 以下小節的大多數代碼示例都基于 DB2 V9.5 示例數據庫。可以從 DB2 V9.5 命令行處理器運行 db2sampl 命令來創建示例數據庫。也可以通過 first step 來創建。first step 是 DB2 提供的一個工具,在安裝了 DB2 之後就會執行,也可以在以後通過在 Windows 中選擇 Start > All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執行。 支持在非 Unicode 數據庫中使用 XML DB2 9 只允許用戶使用 UTF-8 代碼頁創建包含 XML 數據的數據庫。這意味著,即使 XML 文檔中的值是 ASCII 格式的,也需要存儲到 UTF-8 格式的數據庫中。DB2 V9.5 去掉了這個限制,並且允許用戶用任意代碼集創建包含 XML 列的數據庫。由于去掉了這個限制,即使數據庫不是用 UTF-8 格式創建的,用戶也可以更改一個表以添加 XML 列,或者創建一個包含 XML 列的新表。 以下代碼創建了一個示例數據庫和包含一個 XML 列的示例表: 清單1. 使用默認代碼頁的數據庫 db2 CREATE DATABASE sampledb db2 CONNECT TO sampledb db2 CREATE TABLE record(id INT, record XML) 子文檔更新 DB2 V9.5 允許用戶更新存儲在數據庫中的 XML 文檔的一部分。它引入了 XQuery transform 表達式,該表達式使用 4 個更新表達式 —— insert、delete、replace 和 rename 來修改 XML 文檔片段。transform 表達式是 XQuery 語言的一部分,因此可以用在 XQuery 表達式中。對于 DB2 V9.5,一個 transform 表達式中只能使用一個更新表達式。一個 transform 表達式有以下子句: ◆COPY:transform 表達式的 copy 子句 將源 XML 值綁定到一個變量。更新表達式將會在查詢中對該副本進行處理。 ◆MODIFY:modify 子句 根據更新表達式修改複制的 XML 值。在 MODIFY 子句中可以使用多個更新表達式。 ◆return:return 子句 返回修改後的值。 下面將解釋這 4 個更新表達式: 1.insert 表達式 將一個新的 XML 節點插入到現有 XML 文檔中。可以在 XML 文檔指定插入的位置。 2.replace 表達式 用來更新特定節點的特定值。 3.delete 表達式 用來從 XML 文檔刪除特定節點。 4.rename 表達式 用來對節點進行重命名。 由于 transform 表達式是 XQuery 語言的一部分,因此可以在包含 xmlquery 函數的 SQL 語句中使用它,也可以用于更新語句來更新 XML 值。 清單 2 中的代碼更新了示例數據庫中 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 驗證檢查約束,在手動更新或者通過觸發器更新之前,用戶可能需要驗證新的 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 表達式的不同例子。可以在 sqllib/samples/xml/xquery/clp 目錄下找到此示例。 基礎表行存儲/壓縮 在 DB2 9 中,XML 數據和關系數據存儲在不同的位置。這個存儲位置稱作 XML 數據區域(XML data area,XDA)。DB2 9 將所有 XML 文檔存儲在這個存儲位置,這意味著訪問 XML 值和關系數據需要更多 I/O。如果 XML 文檔較小,而且在存儲關系值之後頁面大小仍足夠容納 XML 值,那麽將 XML 存儲在相同的頁面能夠提供不錯的性能收益。這些收益包括: 壓縮:因爲 XML 數據和關系數據存儲在一起,因此可以使用 DB2 9 中引入的壓縮技術對 XML 數據進行壓縮。由于 XML 值比關系數據大,所以可以獲得較高程度的壓縮。 查詢性能:由于 XML 數據和關系數據存儲在相同位置,因此直接插入 XML 數據使得基礎表比一般情況下要大。如果 XML 數據的訪問頻率與表中的其他關系值相當,那麽這將提高查詢數據的性能。 DB2 V9.5 引入了 XML 數據的基礎表行存儲。這意味著如果每行的關系數據和 XML 數據的總大小沒有超過 1 頁面的大小,這兩種數據就可以存儲在相同的物理頁面。只有當一個記錄的總大小沒有超過頁面大小時,才能夠對 XML 數據進行基礎表行存儲。如果是這樣,XML 數據就會像通常一樣存儲在 XML 存儲位置。DB2 中允許的頁面最大值爲 32 KB,因此一個 XML 值的最大插入長度也被限制到 32 KB。如果文檔的內部樹表示的大小比指定的插入長度小,它們將會被插入。清單 4 中的代碼所創建的表可以對 XML 數據進行基礎表行存儲: 清單4.XML 數據的基礎表存儲 db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024) 使用 INLINE 選項指定將 XML 數據跟關系數據存儲在一起。這對于要獲取的數據都位于相同位置的查詢來說很有利。另一方面,對于訪問非 XML 數據的查詢,這可能導致需要更多的 I/O 才能找到關系數據。 使用 XML 數據基礎表行存儲的理想情形是,當表只有一個 XML 類型列並且 XML 文檔的最大值沒有超過頁面大小時。 兼容的 XML 模式演化 爲了增加靈活性並提供更好的模式演化,DB2 V9.5 爲 XML 模式引入了 update 特性。以前注冊的模式能夠更新爲新模式,只要它們互相兼容。如果使用舊模式驗證的 XML 文檔對于新模式仍然有效,那麽這兩種模式就是兼容的。 例如,新模式中添加的可選元素和舊模式中的元素兼容,這是由于新元素的可選特性使經過舊模式驗證的 XML 文檔仍然有效。新 XML 文檔可以擁有這個可選元素,並且能夠通過新模式的驗證。因爲舊文檔仍然有效,所以更新模式之後無需再執行任何操作。如果模式不兼容,模式更新就會失敗。舊模式的注釋和標識符仍然會保留。 爲了更新模式,DB2 V9.5 引入了 XSR_UPDATE 存儲過程。存儲過程檢查兼容性,只當新模式具備兼容性時才更新模式。要更新模式,用戶需要分別注冊新舊模式,然後調用 XSR_UPDATE 存儲過程。一旦舊模式經過更新,用戶可以選擇保留舊模式或者將其刪除。 讓我們以 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> 注冊之後,可以用以下存儲過程將現有模式更新爲新模式: 清單7. 使用 XSR_UPDATE 更新模式 db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0) 最後一個參數值 0 表示更新之後不應該刪除新模式。如果該參數設置爲其他非零值,在更新操作之後新模式將會被刪除。 示例代碼 xsupdate.db2 演示了兼容的 XML 模式演化。可以在 sqllib/samples/xml/clp 目錄中找到該示例。 驗證觸發器支持 爲了提高應用程序靈活性並爲用戶提供對引入的 XML 文檔的自動驗證功能,DB2 V9.5 擴展了在 before trigger 中對 XML 的支持。 before trigger 是使用 BEFORE 選項創建的觸發器,並在 inster/update/delete 操作之前執行。在 before trigger 中,可以在新變量中引用 XML 值。觸發器的操作可以對新值應用 xmlvalidate 函數。觸發器的 WHEN 子句可以用來檢查是否根據任何指定模式對新值進行了驗證。可以使用 WHEN 條件中的 IS VALIDATED 或 IS NOT VALIDATED ACCORDING TO XMLSCHEMA 子句來完成該操作。根據 WHEN 條件的輸出,可能還需要驗證 XML 值或設置一個新值。目前,只允許將 xmlvalidate 函數用于 XML 類型的 transition 變量。觸發器創建之後,在每次執行插入操作時,將會被自動激活並執行,如果在插入語句中沒有驗證 XML 值,也可以用觸發器進行驗證。 以下代碼是一個 DDL 語句,用于創建 customer 表和根據該表定義的觸發器。 只要存在對表的插入操作,就會激活觸發器。如果沒有在插入語句中對 XML 文檔進行驗證,觸發器將會在插入之前使用 xmlvalidate 函數驗證該文檔。以下的示例代碼假設表的 customer 不存在,並且已經在數據庫中注冊了該 customer 模式。 清單8. 爲一個表定義的觸發器 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 值,可以在觸發器內部執行。該示例可以在 sqllib/samples/xml/clp 目錄中找到。 XML 驗證檢查約束 檢查約束(check constraint)是一類可以在創建表時作用到表列的約束。只有當約束合法時,DB2 才允許插入操作,否則插入將會失敗。 DB2 V9.5 支持對 XML 值進行檢查約束。用戶可以使用檢查約束來加強對 XML 列的驗證。與 before trigger 類似,可以在檢查約束中使用 IS VALIDATED ACCORDING TO XMLSCHEMA 子句來加強驗證。惟一的區別在于,這種約束只檢查驗證條件,並不會進行實際的驗證。用戶可以在插入語句中使用 xmlvalidate 來顯式驗證 XML 值,或者使用 before trigger 來執行自動驗證。根據檢查約束中指定的模式,只有當 XML 值有效時,才能成功插入。 對一個表 XML 值應用 before trigger 和檢查約束,往往可以確保 XML 值對于指定模式是有效的。只要執行了插入操作,before trigger 就會自動進行驗證,而檢查約束將會讓用戶顯式地使用 xmlvalidate 函數。這兩種方法可以一起使用,以加強 XML 值的完整性。 清單9 中的代碼將會修改 清單 8 中創建的表 customer,以對表執行檢查約束: 清單9. 檢查約束 db2 ALTER TABLE customer ADD CONSTRAINT check_info CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer) 上面創建的檢查約束總是會檢查是否根據 customer 模式對文檔進行了驗證。如果沒有觸發器,用戶需要使用 xmlvalidate 函數顯式地驗證該文檔。 示例代碼 xmlcheckconstraint.db2 演示了如何爲具有相同結構的不同表創建視圖,該視圖可以進行檢查約束,以及按模式對表進行劃分。 XML 複制支持 DB2 V9.5 支持將 XML 數據複制到其他支持 XML 數據的數據庫。可以使用 WebSphere® Replication Server 9.5 版或者 WebSphere Data Event Publisher 9.5 版來進行複制。WebSphere Replication Server 可以將 XML 數據複制到支持 XML 數據類型的聯合目標,也可以將 XML 數據映射到 CLOB/BLOB 列。 像任何其他關系列一樣,對 XML 數據的複制是在事務消息中完成的,因此複制的 XML 的大小將受到最大事務消息長度的限制。如果數據很大,可以在原始文檔中插入一個占位符文檔。也可以在例外表中插入一個例外。 當進行複制時,不能對 XML 模式注冊進行複制。此外,在複制過程中也不能對 XML 數據進行驗證。 XML 聯合支持 WebSphere Federation Server Version 9.1 支持 pureXML,因此能夠集成本地和遠程的 XML 存儲數據。可以將來自不同數據庫的 XML 數據當作本地數據查看,而且可以用 DB2 XQuery 和 SQL/XML 查詢這些數據。可以在遠程聯合數據庫上創建一個視圖,以連續字符串的方式查看該數據,這些數據可以在 WebSphere Federation Server 上解析爲 XML 值。現在 DB2 可以使用 SQL/XML 和 XQuery 語言通過爲視圖創建的別名來查詢數據。 與驗證本地 XML 值的方式相同,可以使用 db2 xmlvalidate 函數驗證來自不同聯合數據源的 XML 數據。 載入支持 DB2 9 主要支持兩種用 XML 值填充表的方式。insert 語句向表中插入 XML 值,import 實用程序用于將大量數據導入表中。 DB2 V9.5 擴展了對 load 實用程序的支持。load 支持 import 支持的大多數 XML 數據選項。可以使用 FROM 子句爲 XML 數據指定路徑。在 load 期間可以使用 XMLVALIDATE USING 子句對 XML 數據進行驗證。load 有 3 個不同的選項:XDS、SCHEMA 和 SCHEMALOCATION HINTS。當指定 XDS 選項時,可以使用 DEFAULT, IGNORE 和 MAP 子句。這些選項的含義與 import 中對應選項的含義相同。可以使用文件類型修改器 XMLCHAR 和 XMLGRAPHIC 指定數據的代碼頁。XML 數據指定程序(XML data specifier,XDS)在數據文件中指定 XML 值。load 重啓的行爲和原來一樣。它通過掃描所有 XML 文檔重新構建所有索引。 示例代碼 xmlload.db2 演示了 DB2 V9.5 中可用的 XML 數據載入選項。可以在 sqllib/samples/xml/clp 目錄中找到該示例。 XSLT 支持 DB2 V9.5 提供了使用數據庫本身的 XSL 轉換來處理 XML 文檔的功能。可以使用 XSLT 樣式表將存儲在數據庫中的 XML 文檔轉換爲 HTML 格式。爲此,DB2 V9.5 引入了 xsltransform 函數。該函數還支持使用參數的樣式表。xsltransform 函數可以將作爲 XML 文檔存儲在數據庫表列中的 XSLT 樣式表應用到 XML 文檔上。這爲用戶提供了靈活性,用戶可以檢索來自數據庫的經過轉換的 XML 文檔,並可以直接在 Web 上顯示。 現在,假設您已有下面的 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> 這些文檔需要存儲在表中,或者當作參數傳遞。當將這些值作爲參數傳遞時,請確保它們是格式良好的 XML 文檔。參數的數據類型可以是 XML、VARCHAR、CLOB 或 BLOB。假設文檔和樣式表都存儲在表中,可以用以下語句轉換 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 值。 發布函數 發布函數用來將關系數據轉換爲 XML 值。DB2 9 引入了 SQL/XML 支持,該支持在 DB2 V9.5 中得到了增強和簡化。一些 DB2 9 SQL/XML 函數,比如 xmlelement,需要提供所有 XML 元素的名稱、屬性和其他節點,而這些元素來自表的關系列或者被顯式地提供。有時用戶需要生成 XML 值,但是不想牽涉到元素名稱。 通過引入新函數 xmlrow 和 xmlgroup,DB2 V9.5 對現有的發布函數進行了擴展。這些函數從表列獲得 XML 元素的名稱和值。xmlrow 輸出是一個表示爲 XML 的行值的序列,xmlgroup 函數將所有值集合到一個根節點下。 下表是一個示例 employee 表,該表擁有員工的詳細地址,包含以下記錄: ID NAME STREET CITY STATE COUNTRY 1 manoj sector14 gurgaon haryana india 下面的查詢在該行中應用了 xmlrow 和 xmlgroup 函數。 清單14. 新發布函數 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 爲這些函數提供了更多複雜例子。可以在 sqllib/samples/xml/clp 目錄下找到該示例。 將參數傳遞給 sqlquery 函數 在 DB2 9 中,sqlquery 函數將一個 SQL 語句嵌入到 XQuery 表達式中。此函數將一個字符串值作爲輸入,該字符串是一個有效的 SQL 全選擇語句。在 DB2 9 中,不能將參數從 XQuery 語句傳遞給此函數。 DB2 V9.5 增強了該函數,引進了一個新的 parameter 函數,該函數將一個整數值作爲輸入。現在,sqlquery 函數可以將多個參數作爲輸入,第一個參數是一個表示全選擇的字符串,其後是參數的值。sqlquery 函數的第一個字符串參數可以包含 parameter 函數,該函數將會被傳遞給 sqlquery 函數的參數取代,該參數位于第一個必需的字符串參數之後。傳遞給 parameter 函數的整數值表示在調用 sqlquery 函數中參數的位置,該參數將會在調用中被取代。 例如,parameter(1) 告訴解析器用字符串參數後的第一個參數替代這個值。參數的類型應該和全選擇所期望的值類型相同。可以使用類型轉換函數將值轉換爲一個合適的類型。 讓我們以示例數據庫中的 customer 表作爲例子。可以通過運行 db2sampl 命令和從 first step 創建示例數據庫。first step 是 DB2 提供的一個工具,在安裝了 DB2 之後就會執行,也可以在以後通過在 Windows 中選擇 Start> All Programs > IBM DB2 > db2 copy name > Set up tools > first steps 來執行。 customer 表包含一個作爲關系列的 cid 列,以及表示顧客 id 的鍵值。info XML 列具有一個屬性 Cid,該屬性也表示顧客 id。如果數據是一致的,那麽屬性 Cid 值應該與特定行的 cid 列值相同。以下的查詢將檢查數據保持一致的行的數量。Cid 屬性的值被傳遞給 sqlquery 函數,以將其與關系 cid 值進行比較。 清單15. 將參數傳遞給sqlquery函數 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} 此查詢返回所有數據一致的顧客 id。 示例代碼 xqueryparam.db2 提供了一些不錯的例子,將一個和多個參數傳遞給 sqlquery 函數。可以在 sqllib/samples/xml/clp 目錄中找到該示例。 現有函數 XMLQuery、XMLtable 和 XMLExists 的默認傳遞行爲 在 DB2 9 中,函數 xmlquery、xmltable 和 xmlexists 用來將 Xquery 語句嵌入到 SQL 語句中。利用這些函數的 PASSING 子句將參數從 SQL 語句傳遞給這些函數。 在 DB2 9 中,如果同一個 SQL 語句中的這些函數會執行多次,那麽每次執行都需要一個獨立的 PASSING 子句。有時這會使查詢的結構看起來很複雜和龐大。DB2 V9.5 擴展了這些函數,以使用默認的傳遞機制。現在,將一個列名稱用作這些函數的 Xquery 中的一個變量名。如果沒有使用顯式的 PASSING 子句,默認情況下 DB2 將傳遞相同列給一個變量。這使查詢更精簡並更易于理解。以下代碼給出了一個針對示例數據庫表的例子。查詢爲名爲 Robert Shoemaker 的顧客獲取 purchaseorder 中的第一項。 清單 16. SQL/XML 函數的默認傳遞行爲 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 函數,默認情況下傳遞 purchaseorder 表的 porder 列。同樣地,對于 xmlexists 函數,默認情況下傳遞 customer 表的 info 列和 custid 列。請確保以大寫字母的方式使用這些變量的名稱,因爲 xquery 是一個區分大小寫的語言,而且關系列名稱常常以大寫的方式存儲。 XML 驗證約束 DB2 V9.5 增強了 SELCT 語句使用的 IS VALIDATED 子句,以包含 ACCORDING TO XML SCHEMA ID。現在用戶能夠提供多個模式並僅選擇針對這些模式驗證的 XML 值。DB2 V9.5 可以將任何 XML 表達式(而不是一列)作爲一個操作數,這具有很大的靈活性。下面的例子只選擇了 customer 表中用 customer 模式驗證之後的文檔。 清單17. SELECT 語句中的 XML 驗證約束 db2 SELECT info FROM customer WHERE info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer 經過注釋的 XML 模式分解 DB2 9 支持 XML 模式的注釋,因此除遞歸模式外,可以將數據分解爲關系表。DB2 V9.5 解除了這個限制,現在即使模式是遞歸的,用戶也可以對數據進行注釋和分解。 DB2 V9.5 擴展了分解,以提供插入順序。當將數據分解成多個具有外鍵關系的表時,這尤其重要。在這種情況下,應該首先填充主表,以保持引用約束。可以使用以下注釋指定插入順序: 清單18. 對模式進行注釋,以提供插入順序 CUSTOMER PURCHASEORDER 示例代碼 recxmldecomp.db2 和 xmldecomposition.db2 給出了一些不錯的例子,其中分別演示了將遞歸模式和插入順序進行注釋並分解到表中。可以在 sqllib/samples/xml/clp 目錄中找到示例代碼。 XML索引增強 DB2 9 引入了 XML 索引。可以在數據庫中 XML 文檔的特定節點上創建 XML 索引。索引的數據類型可以是 VARCHAR、DOUBLE、DATE 或 TIMESTAMP。如果索引的數據類型與 XML 文檔的元素類型不匹配,DB2 將插入 XML 值,但是不會爲該值創建索引。 DB2 V9.5 爲索引引入了一個附加子句 REJECT INVALID VALUES。如果使用該子句創建索引,並且索引的數據類型與正在插入的 XML 文檔中元素的數據類型不匹配,插入將會失敗。如果在插入 XML 值之後創建索引,而且數據類型不匹配,索引創建也會失敗。 對于 DB2 V 9.5,這種行爲是默認的,也可以使用 IGNORE INVALID VALUES 子句顯式地指定這種行爲。 下面的示例將會使用 REJECT INVALID VALUES 爲 customer 表的 Cid 屬性創建一個索引。 清單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顧問程序和優化器增強 索引顧問程序可以用來獲得關于同時爲 XML 和關系數據建立索引的建議。通過同時爲 XML 和關系數據建立索引,用戶可以獲得良好的性能提升。DB2 9.5 優化器使用兩種類型的索引來優化查詢,並幫助選擇最佳的查詢執行計劃。 DB2 Data Web 服務 使用 Data Web 服務,可以將 DB2 V9.5 XML 數據作爲 數據庫 manipulation(ML)操作的 Web 服務公開。Data Web 服務(DES)將 ML 操作(如插入、更新、選擇和存儲過程)作爲 Web 服務公開。可以通過 Web 浏覽器、用戶客戶端使用基于 HTTP 的 SOAP 協議(例如 POST 和 GET 方法)來訪問這些 Web 服務。通過在現有數據庫工具中集成基于 Eclipse 的工具,可以對 Data Web 服務提供支持。 控制中心也經過了更新,以處理 XML 數據。 結束語 DB2 9 將 XML 作爲一個新數據類型引入,而且提供了處理 XML 值的基礎設施。它提供了一些基本功能,比如查詢 XML 文檔、注冊模式和驗證 XML 文檔、使用 SQL/XML 在 SQL 和 XQuery 之間交互。DB2 V9.5 增強了現有的功能,並提供了更多函數以有效地處理 XML 數據。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有