在以上示例中,您在 XMLTable 函数的 PASSING 子句中使用 OBJECT_VALUE 虚拟列将 purchaseorder 表作为上下文项传递给此处使用的 XQuery 表达式。XQuery 表达式计算用户 EABEL 请求的每个购买订单的总计,并为处理的每个订单生成一个 OrderTotal XML 元素。要访问生成的 XML,请使用 SELECT 列表中的 COLUMN_VALUE 虚拟列。最终的输出应如下所示:
ORDERTOTAL
-------------------------------------------------------------EABEL-20021009123338324PDT 1328.05 EABEL-20021009123335791PDT 2067.15 EABEL-20021009123336251PDT 289.6 EABEL-20021009123336382PDT 928.92
要获得相同的最终结果,可以改用 XMLQuery 函数。但如果将上一个示例中使用的 XQuery 表达式参数传递给 XMLQuery(如下所示):
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;
则 XQuery 表达式返回的空序列将与 purchaseorder 表联接,从而包含在查询总结果集中。实际上,这意味着输出将不仅包含为用户 EABEL 请求的订单生成的 OrderTotal 元素,而且还包含为 purchaseorder 表中存储的所有其他订单生成的空行(默认情况下,purchaseorder 表包含 132 行)。从结果集中排除空行的方法之一是在 SELECT 语句的 WHERE 子句中使用 existsNode SQL 函数,而不是在 XQuery 表达式中使用 WHERE 子句,如下所示:
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;
以上查询与本部分开头的 XMLTable 示例生成相同的输出。