您的位置:首页 > 数据库 > Oracle

Oracle XQuery查询、构建和转换XML概述(3)

2008-03-04 13:18 435 查看
在以上示例中,您在 XMLTable 函数的 PASSING 子句中使用 OBJECT_VALUE 虚拟列将 purchaseorder 表作为上下文项传递给此处使用的 XQuery 表达式。XQuery 表达式计算用户 EABEL 请求的每个购买订单的总计,并为处理的每个订单生成一个 OrderTotal XML 元素。要访问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE 虚拟列。最终的输出应如下所示:
[code]ORDERTOTAL ------------------------------------------------------------- EABEL-20021009123338324PDT 1328.05 EABEL-20021009123335791PDT 2067.15 EABEL-20021009123336251PDT 289.6 EABEL-20021009123336382PDT 928.92
[/code]
  要获得相同的最终结果,可以改用 XMLQuery 函数。但如果将上一个示例中使用的 XQuery 表达式参数传递给 XMLQuery(如下所示):

[code]SELECT XMLQuery('for $i in /PurchaseOrder where $i/User eq "EABEL" return {$i/Reference} {fn:sum(for $j in $i/LineItems/LineItem/Part return ($j/@Quantity*$j/@UnitPrice))} ' PASSING OBJECT_VALUE RETURNING CONTENT) FROM purchaseorder;
[/code]
   则 XQuery 表达式返回的空序列将与 purchaseorder 表联接,从而包含在查询总结果集中。实际上,这意味着输出将不仅包含为用户 EABEL 请求的订单生成的 OrderTotal 元素,而且还包含为 purchaseorder 表中存储的所有其他订单生成的空行(默认情况下,purchaseorder 表包含 132 行)。从结果集中排除空行的方法之一是在 SELECT 语句的 WHERE 子句中使用 existsNode SQL 函数,而不是在 XQuery 表达式中使用 WHERE 子句,如下所示:

[code]SELECT XMLQuery('for $i in /PurchaseOrder return {$i/Reference} {fn:sum(for $j in $i/LineItems/LineItem/Part return ($j/@Quantity*$j/@UnitPrice))} ' PASSING OBJECT_VALUE RETURNING CONTENT) AS ordertotal FROM purchaseorder WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = "EABEL"]') = 1;
[/code]
  以上查询与本部分开头的 XMLTable 示例生成相同的输出。

  查询 Oracle XML DB 信息库中的 XML 数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: