第一行指定将包含在结果集中的列。查询中后面的几行表明,用引号括起来、并且以变量 "t" 为前缀的列是基于 XML 元素值的列。第二行调用 XMLTable 函数指定包含目标数据("i.comments")的 DB2 XML 列和在该列的 XML 文档中的路径,通过该路径可以定位感兴趣的元素(在根元素 "Comments" 的子元素 "Comment" 中)。第 3 到 5 行的 "columns" 子句标识出将被映射到第一行指定的 SQL 结果集中的输出列的特定 XML 元素。这个映射需要指定 XML 元素值将被转换成的数据类型。在这个例子中,所有 XML 数据被转换成传统的 SQL 数据类型。
图 4 展示了运行该查询得到的示例结果。可以看到,输出是一个简单的 SQL 结果集。注意,列名已经被变成大写形式 —— 这在 SQL 中是很常见的。
图 4. 使用 XMLTable 函数的查询的示例输出
如果需要的话,还可以使用 XMLTable 创建包含 XML 文档的结果集。例如,以下语句产生类似于上述结果的结果集,不同的是 "Message" 数据被包含在一个 XML 列中,而不是包含在一个 SQL VARCHAR 列中。
清单 12. 检索多个 XML 元素并将它们转换成传统的 SQL 或 XML 数据类型
|
创建 XML 数据的关系视图
正如您可能想像到的那样,SQL/XML 函数可用于定义视图。如果要为 SQL 应用程序的程序员提供本地 XML 数据的关系模型,那么这种功能特别有用。
为 XML 列中的数据创建关系视图并不比投影 XML 元素值复杂多少。您只需编写一个 SQL/XML SELECT 语句,在语句中调用 XMLTable 函数,并以此作为视图定义的基础。下面 清单 13 中的例子基于 "items" 表的 XML 列和非 XML 列中的信息创建一个视图。(这类似于 清单 11 中的查询。)
清单 13. 基于 XMLTable 的输出创建视图
|
虽然在 XML 列中的数据上创建关系视图很容易,但是用起来要小心。在对那样的视图发出查询时,DB2 不使用 XML 列索引。因此,如果以 ResponseRequested 列为索引,并发出一条将 "mustrespond" 列的结果限制为某个特定值的 SQL 查询,那么 DB2 将读取所有的 XML 文档,并搜索适当的 "ResponseRequested" 值。除非数据量不大,否则这样做会降低运行时性能。然而,如果在那些视图上运行的查询还包含有严格限制性的谓词,且参与索引的项中有传统的 SQL 类型的项(在这个例子中可以是 "i.id" 或 "i.itemname"),那么可以缓解潜在的运行时性能问题。DB2 使用关系索引将符合条件的行过滤到一个较小的量,然后在返回最终结果之前,将更多的 XML 查询谓词应用到这些临时的结果上。
连接 XML 数据和关系数据
现在,您可能想知道如何连接 XML 数据和非 XML 数据(例如基于传统 SQL 类型的关系数据)。DB2 使您可以仅用一条 SQL/XML 语句来做到这一点。有很多方法可用来制定那样的连接,这取决于数据库模式和工作负载需求,不过这里我们只谈论一个例子。您也许会感到惊讶,其实您已经知道足够多关于 SQL/XML 的东西,完全可以实现这种连接。
还记得吗,"items" 表中的 XML 列包含一个 "CustomerID" 元素。这可以作为与 "clients" 表中基于整数的列 "id" 的一个连接键。因此,如果要获得一个报告,其中列出对您的一件或多件产品发表了评论的客户的姓名和状态,那么需要将一个表中的 XML 元素值与来自另一个表中的 SQL 整数值相连接。实现这一点的一种方法是使用 XMLExists 函数,如 清单 14 所示:
最新相关文章
发表评论