subselect中的oracle xmlcast(xmlquery)

时间:2012-09-25 03:24:25

标签: xml oracle

我有一个表(Oracle 11.2.0.2),其中包含xmltype列和其他非xmltype列。我想根据一些非xmltype列的值加上xmltype列的内容进行选择。

我尝试在我的选择中使用xmlquery这样做,但我得到了一些有趣的结果。这是我的数据的简化版本:包含用户名和订单详细信息的订单表。

-- create order table
create table orders(username varchar2(20), order_data xmltype);

-- an order entered by jim
insert into orders values ('jim', xmltype('
<ord:order xmlns:ord="http://www.blah.com/order/1.0">
   <ord:zip>123</ord:zip>
   <ord:date_time>2012-09-24T00:27:00</ord:date_time>
   <ord:item>
      <ord:product>A</ord:product>
      <ord:quantity>12</ord:quantity>
   </ord:item>
   <ord:item>
      <ord:product>B</ord:product>
      <ord:quantity>34</ord:quantity>
   </ord:item>
</ord:order>'));

-- an order entered by bob
insert into orders values ('bob', xmltype('
<ord:order xmlns:ord="http://www.blah.com/order/1.0">
   <ord:zip>123</ord:zip>
   <ord:date_time>2012-09-24T00:27:00</ord:date_time>
   <ord:item>
      <ord:product>A</ord:product>
      <ord:quantity>56</ord:quantity>
   </ord:item>
   <ord:item>
      <ord:product>C</ord:product>
      <ord:quantity>78</ord:quantity>
   </ord:item>
</ord:order>'));

作为一个示例查询,我尝试通过这样做找到Bob输入的所有超过1项的订单:

SELECT username, itemcount
FROM
  (SELECT username,
    XMLCAST(XMLQUERY('count(/*:order/*:item)' PASSING order_data RETURNING CONTENT) AS  NUMBER) itemcount
  FROM orders
  )
WHERE username = 'bob'
AND itemcount > 1

但它不会返回任何结果,但如果我注释掉最后一行(AND itemcount&gt; 1),我会得到:

username | linecount
--------------------
bob      |         2

......我不确定为什么会这样,我想也许它并没有将它视为正确的类型,但我将它作为xmlcast的数字投射。

如果我将最后一行设置为:

,更令人费解的是
AND itemcount = 2

......它再次消失,但如果我改为:

AND itemcount != -7

...它会重新出现在结果中,但值为零:

username | linecount
--------------------
bob      |         0

所以,我很困惑 - 我一定做错了,但我看不出它是什么。

我找到了一个使用xmltable的解决方法,它运行正常,所以我会这样做:

SELECT username, X.*
FROM orders,
  XMLTABLE ( 
      xmlnamespaces ('http://www.blah.com/order/1.0' AS "ord" ),
      '/ord:order' PASSING order_data
          COLUMNS 
              itemcount number PATH 'count(ord:item)' ) AS X
WHERE username = 'bob'
AND itemcount > 1

1 个答案:

答案 0 :(得分:1)

我认为这是一个Oracle错误。它在11.2.0.1上对我来说很好,但是就像你在11.2.0.2上描述的那样失败了。我查看了My Oracle Support但找不到任何东西。您可能需要联系Oracle支持以获取解决此问题的帮助。