1

有人可以帮我更正进入 SQL (Oracle) 语句的 XPath 语句,以从下面的 XML 中提取模型的价格,其<BrandName>为“Bravo”,模型名称为“XYZ789”:

<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 存储在名为 的 Oracle 表中Cars,该表具有标题为“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

extractValue任何人都可以就我的 SQL命令应该是什么样的 XPath 提供任何建议吗?

提前致谢。

4

2 回答 2

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 时(在向其中添加ab命名空间之后),我收到一个错误“ORA-19025:EXTRACTVALUE 返回仅一个节点的值”。这是因为EXTRACTVALUE只能处理返回单个结果节点的 XPath。在您的 XML 中,有两个节点与您的 XPath 匹配:<Name>具有内容的两个元素XYZ789GHI456.

于 2013-03-21T21:07:18.123 回答
1

在您的 extractvalue 语句中,您声明命名空间,而它们在您的 xml 数据中不存在(至少不在您发布的代码段中)。从 extractvalue 语句中删除命名空间和本地名称,或者将它们添加到数据库中的 xml。

于 2013-03-21T11:25:28.490 回答