技术开发 频道

DB2 Version 9.5 pureXML的增强和新特性

以及相应的 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 数据。

0
相关文章