2012-01-07 45 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