从 XMLTable 中的 XML 检索节点值 (Oracle 11gR2)

发布于 12-25 12:14 字数 4491 浏览 5 评论 0原文

希望这很简单,我只是错过了它,但请考虑这个例子:

with et as(
     SELECT 
           xmlType('<Invoice>
    <InvoiceInformation>
        <Number>123456</Number>
    </InvoiceInformation>
    <InvoiceLines>
        <InvoiceLine>
            <Detail>
                <Amount>100</Amount>
                <Line>1</Line>
            </Detail>
            <Type>
                <CheesyPotato>
                    <Instructions>
                        <CookTime>120</CookTime>
                        <CookTimeUnits>Minutes</CookTimeUnits>
                        <CookTemperature>450</CookTemperature>
                    </Instructions>
                </CheesyPotato>
            </Type>
        </InvoiceLine>
        <InvoiceLine>
            <Detail>
                <Amount>10000</Amount>
                <Line>2</Line>
            </Detail>
            <Type>
                <DeathStar>
                    <Instructions>
                        <CookTime>4</CookTime>
                        <CookTimeUnits>5 "parsecs"</CookTimeUnits>
                        <CookTemperature>1000000</CookTemperature>
                    </Instructions>
                </DeathStar>
            </Type>
        </InvoiceLine>  
        <InvoiceLine>
            <Detail>
                <Amount>250</Amount>
                <Line>3</Line>
            </Detail>
            <Type>
                <Quiche>
                    <Instructions>
                        <CookTime>75</CookTime>
                        <CookTimeUnits>Minutes</CookTimeUnits>
                        <CookTemperature>350</CookTemperature>
                    </Instructions>
                </Quiche>
            </Type>      
        </InvoiceLine>    
    </InvoiceLines>  
</Invoice>  
 ') xt
      from dual
       ) 
        SELECT     
            ext.*
           FROM
           et,
           XMLTABLE(
           'for $Invoice in $INV/Invoice
                for $InvoiceItem in $Invoice/InvoiceLines/InvoiceLine
                  return <row> 
                  {
                    $Invoice
                    ,$InvoiceItem
                  } 
                  </row>'           
              PASSING et.xt as INV
                    COLUMNS
               INVOICENUMBER                   VARCHAR2  (6)       PATH 'Invoice/InvoiceInformation/Number'                    
              ,InvoiceLineNumber               VARCHAR2  (5)       PATH 'InvoiceLine/Detail/Line'
              ,Amount                          VARCHAR2  (5)       PATH 'InvoiceLine/Detail/Amount'
              ,CookTime                        VARCHAR2  (5)       PATH 'InvoiceLine/Type//Instructions/CookTime'
              ,CookTimeUnits                   VARCHAR2  (15)       PATH 'InvoiceLine/Type//Instructions/CookTimeUnits'
              ,CookTemperature                 VARCHAR2  (10)       PATH 'InvoiceLine/Type//Instructions/CookTemperature'
            ) ext
/            

--给我这些结果

    INVOICENUMBER INVOICELINENUMBER AMOUNT COOKTIME COOKTIMEUNITS   COOKTEMPERATURE 
------------- ----------------- ------ -------- --------------- --------------- 
123456        1                 100    120      Minutes         450             
123456        2                 10000  4        5 "parsecs"     1000000         
123456        3                 250    75       Minutes         350

但是我想在这个查询中获取 Type 值。因此,如何获取类型的“名称”的子节点,以便我的结果是这样的?

TypeChild       INVOICENUMBER INVOICELINENUMBER AMOUNT COOKTIME COOKTIMEUNITS   COOKTEMPERATURE 
------------------- ------------- ----------------- ------ -------- --------------- --------------- 
CheesyPotato    123456        1                 100    120      Minutes         450             
DeathStar       123456        2                 10000  4        5 "parsecs"     1000000         
Quiche          123456        3                 250    75       Minutes         350

我尝试过各种方法;沿着“,$InvoiceItem/Type/child/name”的路线无济于事,任何帮助将不胜感激,谢谢

或者我只是以错误的方式这样做? (但是,无法更改的是我需要能够在查询中使用此 XML!)

hope this is something simple and I am just missing it, but consider this example:

with et as(
     SELECT 
           xmlType('<Invoice>
    <InvoiceInformation>
        <Number>123456</Number>
    </InvoiceInformation>
    <InvoiceLines>
        <InvoiceLine>
            <Detail>
                <Amount>100</Amount>
                <Line>1</Line>
            </Detail>
            <Type>
                <CheesyPotato>
                    <Instructions>
                        <CookTime>120</CookTime>
                        <CookTimeUnits>Minutes</CookTimeUnits>
                        <CookTemperature>450</CookTemperature>
                    </Instructions>
                </CheesyPotato>
            </Type>
        </InvoiceLine>
        <InvoiceLine>
            <Detail>
                <Amount>10000</Amount>
                <Line>2</Line>
            </Detail>
            <Type>
                <DeathStar>
                    <Instructions>
                        <CookTime>4</CookTime>
                        <CookTimeUnits>5 "parsecs"</CookTimeUnits>
                        <CookTemperature>1000000</CookTemperature>
                    </Instructions>
                </DeathStar>
            </Type>
        </InvoiceLine>  
        <InvoiceLine>
            <Detail>
                <Amount>250</Amount>
                <Line>3</Line>
            </Detail>
            <Type>
                <Quiche>
                    <Instructions>
                        <CookTime>75</CookTime>
                        <CookTimeUnits>Minutes</CookTimeUnits>
                        <CookTemperature>350</CookTemperature>
                    </Instructions>
                </Quiche>
            </Type>      
        </InvoiceLine>    
    </InvoiceLines>  
</Invoice>  
 ') xt
      from dual
       ) 
        SELECT     
            ext.*
           FROM
           et,
           XMLTABLE(
           'for $Invoice in $INV/Invoice
                for $InvoiceItem in $Invoice/InvoiceLines/InvoiceLine
                  return <row> 
                  {
                    $Invoice
                    ,$InvoiceItem
                  } 
                  </row>'           
              PASSING et.xt as INV
                    COLUMNS
               INVOICENUMBER                   VARCHAR2  (6)       PATH 'Invoice/InvoiceInformation/Number'                    
              ,InvoiceLineNumber               VARCHAR2  (5)       PATH 'InvoiceLine/Detail/Line'
              ,Amount                          VARCHAR2  (5)       PATH 'InvoiceLine/Detail/Amount'
              ,CookTime                        VARCHAR2  (5)       PATH 'InvoiceLine/Type//Instructions/CookTime'
              ,CookTimeUnits                   VARCHAR2  (15)       PATH 'InvoiceLine/Type//Instructions/CookTimeUnits'
              ,CookTemperature                 VARCHAR2  (10)       PATH 'InvoiceLine/Type//Instructions/CookTemperature'
            ) ext
/            

--Give me these results

    INVOICENUMBER INVOICELINENUMBER AMOUNT COOKTIME COOKTIMEUNITS   COOKTEMPERATURE 
------------- ----------------- ------ -------- --------------- --------------- 
123456        1                 100    120      Minutes         450             
123456        2                 10000  4        5 "parsecs"     1000000         
123456        3                 250    75       Minutes         350

However I would like to, in this query, get the Type value. Thus How do I get the child node of Type's "Name" so my results would be as such?

TypeChild       INVOICENUMBER INVOICELINENUMBER AMOUNT COOKTIME COOKTIMEUNITS   COOKTEMPERATURE 
------------------- ------------- ----------------- ------ -------- --------------- --------------- 
CheesyPotato    123456        1                 100    120      Minutes         450             
DeathStar       123456        2                 10000  4        5 "parsecs"     1000000         
Quiche          123456        3                 250    75       Minutes         350

I have tried various methods; along the lines of ",$InvoiceItem/Type/child/name" to no avail, any help would be appreciated, thanks

Or am I simply going at this the incorrect way? (what cannot be changed, however, is that I will need to be able to consume this XML into a query!)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

带上头具痛哭2025-01-01 12:14:54
,TypeChild  VARCHAR2(15)  PATH  'InvoiceLine/Type/*/name()'
,TypeChild  VARCHAR2(15)  PATH  'InvoiceLine/Type/*/name()'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文