2012-09-25 25 views
3

我有一個包含xmltype列和其他非xmltype列的表(Oracle 11.2.0.2)。我想根據一些非xmltype列的值和xmltype列的內容做一個選擇。子選項中的oracle xmlcast(xmlquery)

我試過在我的選擇中使用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>')); 

舉個例子查詢,我試圖找到它做這個有超過1項由Bob輸入的所有訂單:

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 

,但它不返回任何結果,但是如果我註釋掉最後一行(和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 
+0

我可以用這樣的xmltable得到正確的答案,所以這會現在做我 - 也許我應該爲此使用xmltable: – nodge

回答

1

我覺得這是一個Oracle錯誤。它在11.2.0.1上對我很好,但就像你在11.2.0.2中描述的那樣失敗了。我看着My Oracle Support,但找不到任何東西。您可能需要聯繫Oracle支持以獲取解決此問題的幫助。

+0

謝謝你 - 我想有在某處安裝11.2.0.3,我會檢查它的。 – nodge

+0

在11.2.0.3上檢查過它,它也無法正常工作,所以也許它是一個Oracle錯誤。 XMLTable解決方法適用於我,它更整潔,因爲我不需要嵌套選擇 - 我可以將itemcount> 1放在main where子句中 – nodge