有人可以帮我纠正进入SQL(Oracle)语句的XPath语句,从<BrandName>
为“Bravo”并且型号名称为“XYZ789”的XML中提取模型的价格:
<CarDetails>
<Wheels>
<Rims>
<BrandName>Acme</BrandName>
<Model>
<Name>ABC123</Name>
<Price>$350.00</Price>
</Model>
</Rims>
<Rims>
<BrandName>Bravo</BrandName>
<Model>
<Name>XYZ789</Name>
<Price>$250.00</Price>
</Model>
<Model>
<Name>GHI456</Name>
<Price>$300.00</Price>
</Model>
</Rims>
</Wheels>
</CarDetails>
上面的XML Clob存储在名为Cars
的Oracle表中,该表包含标题为“id”,“version”和“xml_document”的列。
我提取我想要的信息的SQL语句如下所示:
SELECT *
FROM (
SELECT x.xml_document.GetClobVal()
FROM Cars x
WHERE
extractValue(x.xml_document,
'/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model/b:Name',
'xmlns:a="cars:instance:3_1" xmlns:b="cars:conceptualcomponent:3_1"'
) in ('XYZ789')
ORDER BY x.id, x.version
)
where ROWNUM <= 100
......但它根本没有提取任何信息。它应该拉出一条记录。我确信数据存在于XML中,并且当我在extractValue
调用内部更改XPath以获取其他值时,此语句有效,因此我的SQL中的XPath显然是错误的。
/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model/b:Name
任何人都可以提供有关XPath我的SQL extractValue
命令应该是什么样的建议吗?
提前致谢。
答案 0 :(得分:2)
如果您想要品牌名称为“Bravo”并且型号名称为“XYZ789”的汽车的价格,则以下XPath应该获取它:
/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model[b:Name="XYZ789"]/b:Price
事实上,在这里,它在行动中:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 v_xml_string VARCHAR2(4000) := '<a:CarDetails xmlns:a="cars:instance:3_1">
3 <b:Wheels xmlns:b="cars:conceptualcomponent:3_1">
4 <b:Rims>
5 <b:BrandName>Acme</b:BrandName>
6 <b:Model>
7 <b:Name>ABC123</b:Name>
8 <b:Price>$350.00</b:Price>
9 </b:Model>
10
11 </b:Rims>
12 <b:Rims>
13 <b:BrandName>Bravo</b:BrandName>
14 <b:Model>
15 <b:Name>XYZ789</b:Name>
16 <b:Price>$250.00</b:Price>
17 </b:Model>
18 <b:Model>
19 <b:Name>GHI456</b:Name>
20 <b:Price>$300.00</b:Price>
21 </b:Model>
22 </b:Rims>
23 </b:Wheels>
24 </a:CarDetails>';
25 v_result VARCHAR2(4000);
26 BEGIN
27 SELECT extractValue(XMLTYPE(v_xml_string),
28 '/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model[b:Name="XYZ789"]/b:Price',
29 'xmlns:a="cars:instance:3_1" xmlns:b="cars:conceptualcomponent:3_1"'
30 ) INTO v_result FROM DUAL;
31
32 dbms_output.put_line(v_result);
33 END;
34 /
$250.00
PL/SQL procedure successfully completed.
SQL>
当我尝试在您的XML上运行XPath时(在向其添加a
和b
命名空间之后),我收到错误“ORA-19025:EXTRACTVALUE仅返回一个节点的值”。这是因为EXTRACTVALUE
只能处理返回单个结果节点的XPath。在XML中,有两个与XPath匹配的节点:两个<Name>
元素,其内容为XYZ789
和GHI456
。
答案 1 :(得分:1)
声明名称空间,而xml数据中不存在名称空间(至少不在您发布的代码段中)。从extractvalue语句中删除命名空间和本地名称,或将它们添加到db中的xml。