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