【问题标题】:oracle xmlcast(xmlquery) in subselect子选择中的 oracle xmlcast(xmlquery)
【发布时间】:2012-09-25 22:08:41
【问题描述】:

我有一个包含 xmltype 列和其他非 xmltype 列的表(Oracle 11.2.0.2)。我想根据一些非 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 > 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

【问题讨论】:

  • 我可以像这样使用 xmltable 得到正确的答案,所以现在就可以了 - 也许我应该为此使用 xmltable:

标签: xml oracle


【解决方案1】:

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

【讨论】:

  • 谢谢你 - 我想在某个地方安装了 11.2.0.3,我会检查一下。
  • 在 11.2.0.3 上检查过它也不能正常工作,所以可能是 Oracle 错误。 XMLTable 解决方法对我有用,而且更整洁,因为我不需要嵌套选择 - 我可以将 itemcount > 1 放在主 where 子句中
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多