2016-01-13 592 views
1

如果PartNumber =“926-AA”,如何选择值“USPrice”?ORA-19025 - 使用extractValue时节点太多

我的选择始终以ORA-19025结尾!

SELECT extractValue(OBJECT_VALUE, '/PurchaseOrder/Items/Item/USPrice/text()') "PRICE" FROM TMP_TABLE 
WHERE extractValue(OBJECT_VALUE,'/PurchaseOrder/Items/Item[@PartNumber]') = '926-AA'; 

下面是DDL:

CREATE TABLE TMP_TABLE OF XMLType; 
INSERT INTO TMP_TABLE VALUES (XMLType(bfilename('XMLDIR', 'purchaseOrder.xml'),nls_charset_id('AL32UTF8'))); 

下面是数据:

<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> 
    <Address Type="Shipping"> 
    <Name>Ellen Adams</Name> 
    <Street>123 Maple Street</Street> 
    <City>Mill Valley</City> 
    <State>CA</State> 
    <Zip>10999</Zip> 
    <Country>USA</Country> 
    </Address> 
    <Address Type="Billing"> 
    <Name>Tai Yee</Name> 
    <Street>8 Oak Avenue</Street> 
    <City>Old Town</City> 
    <State>PA</State> 
    <Zip>95819</Zip> 
    <Country>USA</Country> 
    </Address> 
    <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes> 
    <Items> 
    <Item PartNumber="872-AA"> 
     <ProductName>Lawnmower</ProductName> 
     <Quantity>1</Quantity> 
     <USPrice>148.95</USPrice> 
     <Comment>Confirm this is electric</Comment> 
    </Item> 
    <Item PartNumber="926-AA"> 
     <ProductName>Baby Monitor</ProductName> 
     <Quantity>2</Quantity> 
     <USPrice>39.98</USPrice> 
     <ShipDate>1999-05-21</ShipDate> 
    </Item> 
    </Items> 
</PurchaseOrder> 

预先感谢您

回答

2

听起来像是你的意思做:

select extractvalue(object_value, '/PurchaseOrder/Items/Item[@PartNumber="926-AA"]/USPrice/text()') price 
from tmp_table; 

或者,如果你有你正在运行此对多行,你会更好使用XMLTABLE作为EXTRACTVALUE自11gR1中已经弃用:

select * 
from tmp_table tt 
     cross join xmltable('/PurchaseOrder/Items/Item' 
          passing tt.object_value 
          columns partnumber varchar2(20) path '@PartNumber', 
            usprice number path 'USPrice') x 
where x.partnumber = '926-AA'; 
+0

好吧,我必须使用标准中的XPath语法,而不是在带EXTRACTVALUE的where语句中使用它。尼斯。但是,使用XMLTABLE的代码示例运行时出现错误ORA-01722 :-( – happymapper

+0

当您引用Oracle错误编号时,是否可以将相应的错误消息与它一起?没有人能够期望记住所有错误及其相关错误代码!另外,强迫那些试图帮助你浪费时间寻找你手指上的东西的人是非常浪费时间和浪费的(对不起,宠坏了;你碰巧是打破骆驼背的秸秆!)最后,如果usprice节点可以包含不是数字的信息,那么将xmltable列声明中的数据类型更改为varchar2。 – Boneist

+0

我明白并承诺改进。感谢您提供有用的答案。现在,everthing可以正常工作。 – happymapper