DB2 Version 9.5 pureXML的增强和新特性

数据库
本文描述 IBM® DB2® V9.5 版针对 Linux、Unix 和 Windows 的 pureXML™ 增强和新特性。DB2 Version 9 支持将 XML 作为原生数据类型,也支持 SQL/XML、XQuery 语言,以及其他诸如模式支持、发布函数、对实用工具的 XML 支持、分解等特性。DB2 V9.5 增强了其中的一些特性并引入了新特性,以更加高效地处理 XML。本文从如何使 XML 处理更高效和更易于使用的角度解释了这些增强和新特性。

DB2 9XML支持概述

DB2 9引入了原生XML数据类型。它将XML存储为一种经过解析的分层(原生)格式,并允许用户使用XQuery和SQL/XML语言查询数据。DB2XQuery表达式将存储在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数据支持对一些实用工具(导入、导出等等)进行了更新。更多关于Version9中的XML支持请参见参考资料部分。

DB2 V9.5的新特性

在处理XML数据方面,现有的DB2 9功能非常强大。DB2 V9.5增强了一些现有特性并引入了其他功能,以使XML处理更加强大和高效。下面是本文将要讨论的功能列表:

◆支持在非Unicode数据库中使用XML

◆子文档更新

◆基础表存储/压缩

◆兼容的XML模式演化

◆验证触发器

◆验证检查约束

◆XML复制

◆XML联合

◆XML载入

◆sqlquery()参数

◆用户友好的发布函数

◆SQL/XML函数的默认参数传递

◆XSLT函数

◆XML分解增强

◆XML索引增强

◆索引顾问程序(Indexadvisor)和优化器增强

◆DB2DataWeb服务

以下小节的大多数代码示例都基于DB2 V9.5示例数据库。可以从DB2 V9.5命令行处理器运行db2sampl命令来创建示例数据库。也可以通过firststep来创建。firststep是DB2提供的一个工具,在安装了DB2之后就会执行,也可以在以后通过在Windows中选择Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps来执行。

支持在非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文档的一部分。它引入了XQuerytransform表达式,该表达式使用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数据区域(XMLdataarea,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中允许的页面最大值为32KB,因此一个XML值的最大插入长度也被限制到32KB。如果文档的内部树表示的大小比指定的插入长度小,它们将会被插入。清单4中的代码所创建的表可以对XML数据进行基础表行存储:

清单4.XML数据的基础表存储

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

使用 INLINE 选项指定将 XML 数据跟关系数据存储在一起。这对于要获取的数据都位于相同位置的查询来说很有利。另一方面,对于访问非 XML 数据的查询,这可能导致需要更多的 I/O 才能找到关系数据。

#p#

使用 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扩展了在beforetrigger中对XML的支持。beforetrigger是使用BEFORE选项创建的触发器,并在inster/update/delete操作之前执行。在beforetrigger中,可以在新变量中引用XML值。触发器的操作可以对新值应用xmlvalidate函数。触发器的WHEN子句可以用来检查是否根据任何指定模式对新值进行了验证。可以使用WHEN条件中的ISVALIDATED或ISNOTVALIDATEDACCORDINGTOXMLSCHEMA子句来完成该操作。根据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 目录中找到该示例。

#p#

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

用户也可以将XML文档和一个XSLT样式表存储在不同的表中,而且可以通过连接表将单个XSLT样式表应用到多个XML值。

发布函数

发布函数用来将关系数据转换为XML值。DB2 9引入了SQL/XML支持,该支持在DB2 V9.5中得到了增强和简化。一些DB2 9SQL/XML函数,比如xmlelement,需要提供所有XML元素的名称、属性和其他节点,而这些元素来自表的关系列或者被显式地提供。有时用户需要生成XML值,但是不想牵涉到元素名称。

通过引入新函数xmlrow和xmlgroup,DB2 V9.5对现有的发布函数进行了扩展。这些函数从表列获得XML元素的名称和值。xmlrow输出是一个表示为XML的行值的序列,xmlgroup函数将所有值集合到一个根节点下。

下表是一个示例employee表,该表拥有员工的详细地址,包含以下记录:

IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia

下面的查询在该行中应用了xmlrow和xmlgroup函数。

清单14.新发布函数

db2SELECTXMLROW(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india
db2SELECTXMLGROUP(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india

在DB2 9中,为了得到相同结果,除了显式地提供元素名称,还需要将xmlelement应用到每个列值。

跟V91版本中相同的查询相比,示例代码xmlintegrate.db2为这些函数提供了更多复杂例子。可以在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命令和从firststep创建示例数据库。firststep是DB2提供的一个工具,在安装了DB2之后就会执行,也可以在以后通过在Windows中选择Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps来执行。

customer表包含一个作为关系列的cid列,以及表示顾客id的键值。infoXML列具有一个属性Cid,该属性也表示顾客id。如果数据是一致的,那么属性Cid值应该与特定行的cid列值相同。以下的查询将检查数据保持一致的行的数量。Cid属性的值被传递给sqlquery函数,以将其与关系cid值进行比较。

清单15.将参数传递给sqlquery函数

xquerydeclaredefaultelementnamespace"http://posample.org";
for$iindb2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/@Cid
for$jindb2-fn:sqlquery("selectinfofromcustomerwherecid=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将传递相同列给一个变量。这使查询更精简并更易于理解。以下代码给出了一个针对示例数据库表的例子。查询为名为RobertShoemaker的顾客获取purchaseorder中的第一项。

清单16.SQL/XML函数的默认传递行为

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

对于SELECT子句中的xmlquery函数,默认情况下传递purchaseorder表的porder列。同样地,对于xmlexists函数,默认情况下传递customer表的info列和custid列。请确保以大写字母的方式使用这些变量的名称,因为xquery是一个区分大小写的语言,而且关系列名称常常以大写的方式存储。

XML验证约束

DB2 V9.5增强了SELCT语句使用的ISVALIDATED子句,以包含ACCORDINGTOXMLSCHEMAID。现在用户能够提供多个模式并仅选择针对这些模式验证的XML值。DB2 V9.5可以将任何XML表达式(而不是一列)作为一个操作数,这具有很大的灵活性。下面的例子只选择了customer表中用customer模式验证之后的文档。

清单17.SELECT语句中的XML验证约束

db2SELECTinfoFROMcustomer
WHEREinfoISVALIDATEDACCORDINGTOXMLSCHEMAIDcustomer

经过注释的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为索引引入了一个附加子句REJECTINVALIDVALUES。如果使用该子句创建索引,并且索引的数据类型与正在插入的XML文档中元素的数据类型不匹配,插入将会失败。如果在插入XML值之后创建索引,而且数据类型不匹配,索引创建也会失败。

对于DB2 V9.5,这种行为是默认的,也可以使用IGNOREINVALIDVALUES子句显式地指定这种行为。

下面的示例将会使用REJECTINVALIDVALUES为customer表的Cid属性创建一个索引。

清单19.XML索引

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

Index顾问程序和优化器增强

索引顾问程序可以用来获得关于同时为XML和关系数据建立索引的建议。通过同时为XML和关系数据建立索引,用户可以获得良好的性能提升。DB2 9.5优化器使用两种类型的索引来优化查询,并帮助选择最佳的查询执行计划。

DB2 DataWeb服务

使用DataWeb服务,可以将DB2 V9.5XML数据作为数据库manipulation(ML)操作的Web服务公开。DataWeb服务(DES)将ML操作(如插入、更新、选择和存储过程)作为Web服务公开。可以通过Web浏览器、用户客户端使用基于HTTP的SOAP协议(例如POST和GET方法)来访问这些Web服务。通过在现有数据库工具中集成基于Eclipse的工具,可以对DataWeb服务提供支持。

控制中心也经过了更新,以处理XML数据。

结束语

DB2 9将XML作为一个新数据类型引入,而且提供了处理XML值的基础设施。它提供了一些基本功能,比如查询XML文档、注册模式和验证XML文档、使用SQL/XML在SQL和XQuery之间交互。DB2 V9.5增强了现有的功能,并提供了更多函数以有效地处理XML数据。

【编辑推荐】

  1. 用DB2 pureXML执行不区分大小写的高效搜索
  2. PureXML应用之星的发现之旅
  3. 基于pureXML技术的数据库表结构扩展
责任编辑:book05 来源: ITPUB
相关推荐

2010-08-06 15:14:03

DB2 V9.5 新特

2010-08-27 11:39:19

DB2锁定新特性

2009-01-18 16:33:09

pureXMLDB2 pureXMLXML

2011-11-30 21:46:24

ibmdwDB2 pureXML

2010-08-20 12:49:49

DB2 pureXML

2009-09-22 12:25:04

ibmdwDB2

2010-08-09 17:52:38

DB2 pureXML

2009-04-17 10:07:42

2009-09-25 11:44:00

ibmdwDB2

2010-09-06 13:19:35

DB2 9.5

2009-11-23 19:57:01

ibmdwDB2

2010-08-05 09:03:27

DB2 9.5高可用性

2009-03-03 12:58:14

pureXML大小写DB2

2010-07-28 10:22:44

DB2 9.5

2010-08-05 16:08:12

轻松掌握DB2 9.5

2010-02-23 09:39:25

DB2 9.7

2009-03-11 14:59:17

数据库DB2数据库分区

2010-08-03 16:54:10

DB2 9.5

2011-05-25 17:05:40

ibmdwDB2

2010-08-03 08:46:23

DB2 9.5高可用性
点赞
收藏

51CTO技术栈公众号