数据库资讯

DB2 Version 9.5 pureXML的增强和新特性

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目录下 找到此示例。

希望看到您的想法,请您发表评论x