2012-01-07 46 views
1

希望这是简单的东西,我只是缺少它,但是考虑下面的例子:检索节点值(甲骨文11gR2的)

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我这些结果

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 /类型/孩子/名”的无果行,任何帮助,将不胜感激,谢谢

或者,我只是要在这个不正确的方法是什么? (但不能改变的是,我需要能够将这个XML用于查询!)

回答

2
,TypeChild VARCHAR2(15) PATH 'InvoiceLine/Type/*/name()' 
+0

完美地工作,令人尴尬的多么简单! (只是无法理解我的头)! – Harrison 2012-01-07 13:56:03