0

我在获取特定节点的位置时遇到问题。问题是位置没有对父节点的引用(无属性),但它们在 xml 层次结构中位于它之下。当我尝试以这种方式对其进行参数化时:

    SELECT something....
        FROM ktr_xml x,
        XMLTABLE (
            '/Invoices/Invoice[@ID="' || p_invoice_number || '"]' || '/InvoiceLine'
            PASSING x.xml
            COLUMNS line_number VARCHAR2 (100) PATH 'ID',
            Product_quantity VARCHAR2 (100)
            PATH 'InvoicedQuantity',
            etc.... etc.... 
        WHERE x.id = p_id;

它给了我错误,该字符串是预期的,这意味着我无法基于发票 (ID) 字段构建动态路径。

如果我运行此查询:

   FROM ktr_xml x,
     XMLTABLE (
       '/Invoices/Invoice/InvoiceLine'
        PASSING x.xml

它不仅从特定发票中获取所有物品。

有什么想法可以解决吗?

4

1 回答 1

1

您可以将查询拆分为几个相关的XMLTABLE语句:

甲骨文设置

CREATE TABLE ktr_xml( id, xml ) AS
SELECT 1, XMLTYPE(
'<Invoices>
  <Invoice ID="2">
    <InvoiceLine>
      <ID>Invoice1</ID>
      <InvoicedQuantity>42</InvoicedQuantity>
    </InvoiceLine>
  </Invoice>
</Invoices>'
) FROM DUAL;

查询

SELECT x1.*
FROM   ktr_xml x
       INNER JOIN
       XMLTABLE (
         '/Invoices/Invoice'
         PASSING x.xml
         COLUMNS
           id         NUMBER PATH  './@ID',
           xml        XMLTYPE PATH '.'
       ) t
       ON ( t.id = 2 /*p_invoice_number*/ )
       CROSS JOIN
       XMLTABLE (
         'Invoice/InvoiceLine'
         PASSING t.xml
         COLUMNS
           line_number      VARCHAR2 (100) PATH 'ID',
           Product_quantity VARCHAR2 (100) PATH 'InvoicedQuantity'
       ) x1
WHERE  x.id = 1 /*p_id*/;

输出

LINE_NUMBER | 产品_数量
:------------ | :---------------
发票1 | 42              

db<>在这里摆弄

于 2019-10-10T13:32:17.483 回答