1

添付された XML ファイルからデータを取得するために、Oracle 11g XMLTABLE 関数を使用しています。コードを実行すると、3 行が表示されます。顧客に対応する製品ごとに 1 つの行を正しく生成する製品を取得しています。問題は、残りの顧客データを取得していないことです。CustomerName、CustomerDOB、および CustomerEmail に対して null を取得しています。何らかの理由で、私が使用しているコードでは、Oracle は 2 レベル上を取得していません。助けてください!私は何を間違っていますか?

XML

<?xml version="1.0" encoding="iso-8859-1"?>
<USACustomers>
    <NewYorkCustomers>
        <Customer>
            <CustomerData>
                <CustomerName>John Stark</CustomerName>
                <CustomerDOB>07/09/1973</CustomerDOB>
                <CustomerEmail>j.stark@liquid.com</CustomerEmail>
            </CustomerData>
            <CustomerAddress>
                <Address>400 Railroad Way</Address>
                <City>Larchmont</City>
                <State>NY</State>
                <Zip>10542</Zip>
            </CustomerAddress>
            <CustomerProducts>
                <CustomerProduct>
                    <PoductType>CTD</PoductType>
                    <ProductNumber>2050035302</ProductNumber>
                </CustomerProduct>
                <CustomerProduct>
                    <PoductType>REC</PoductType>
                    <ProductNumber>2050920400</ProductNumber>
                </CustomerProduct>
            </CustomerProducts>
        </Customer>
        <Customer>
            <CustomerData>
                <CustomerName>Maria Stark</CustomerName>
                <CustomerDOB>07/09/1972</CustomerDOB>
                <CustomerEmail>m.stark@liquid.com</CustomerEmail>
            </CustomerData>
            <CustomerAddress>
                <Address>410 Railroad Way</Address>
                <City>Larchmont</City>
                <State>NY</State>
                <Zip>10542</Zip>
            </CustomerAddress>
            <CustomerProducts>
                <CustomerProduct>
                    <PoductType>REC</PoductType>
                    <ProductNumber>2050920400</ProductNumber>
                </CustomerProduct>
            </CustomerProducts>
        </Customer>
    </NewYorkCustomers>
</USACustomers>

コード

SELECT                            
CustomerName,
CustomerDOB,
CustomerEmail,
PoductType


FROM   XMLTABLE (                    '/USACustomers/NewYorkCustomers/Customer/CustomerProducts/CustomerProduct'
PASSING xmltype (BFILENAME ('BACKUP', 'TEST.xml'), NLS_CHARSET_ID ('AL32UTF8'))

COLUMNS CustomerName  VARCHAR2(50)    PATH 'CustomerData/CustomerName',
        CustomerDOB   VARCHAR2(50)    PATH 'CustomerData/CustomerDOB',
        CustomerEmail VARCHAR2(50)    PATH 'CustomerData/CustomerEmail',
        PoductType    VARCHAR2(50)    PATH 'PoductType',
        ProductNumber VARCHAR2(50)    PATH 'ProductNumber');
4

2 に答える 2

0

最初に顧客データを抽出してから、各製品を反復するため、それをネストします。

select customername, customerdob, customeremail, PoductType, ProductNumber
  from (select customername, customerdob, customeremail, products
           from xmltable('/USACustomers/NewYorkCustomers/Customer' 
                         PASSING xmltype (BFILENAME ('BACKUP', 'TEST.xml'), NLS_CHARSET_ID ('AL32UTF8'))
                         columns customername varchar2(50) path 'CustomerData/CustomerName',
                                 customerdob varchar2(50) path 'CustomerData/CustomerDOB',
                                 customeremail varchar2(50) path 'CustomerData/CustomerEmail',
                                 products xmltype path 'CustomerProducts')) cust,
       xmltable('/CustomerProducts/CustomerProduct'
                passing cust.products
                columns PoductType    VARCHAR2(50)    PATH 'PoductType',
                        ProductNumber VARCHAR2(50)    PATH 'ProductNumber');

例えば:

SQL> select customername, customerdob, customeremail, PoductType, ProductNumber
  2    from (select customername, customerdob, customeremail, products
  3             from mytable l,
  4                  xmltable('/USACustomers/NewYorkCustomers/Customer'
  5                           passing l.x
  6                           columns customername varchar2(50) path 'CustomerData/CustomerName',
  7                                   customerdob varchar2(50) path 'CustomerData/CustomerDOB',
  8                                   customeremail varchar2(50) path 'CustomerData/CustomerEmail',
  9                                   products xmltype path 'CustomerProducts')) cust,
 10         xmltable('/CustomerProducts/CustomerProduct'
 11                  passing cust.products
 12                  columns PoductType    VARCHAR2(50)    PATH 'PoductType',
 13                          ProductNumber VARCHAR2(50)    PATH 'ProductNumber');

CUSTOMERNAME         CUSTOMERDO CUSTOMEREMAIL        PODUCTTYPE PRODUCTNUMBER
-------------------- ---------- -------------------- ---------- -------------
John Stark           07/09/1973 j.stark@liquid.com   CTD        2050035302
John Stark           07/09/1973 j.stark@liquid.com   REC        2050920400
Maria Stark          07/09/1972 m.stark@liquid.com   REC        2050920400
于 2013-01-15T16:06:44.523 に答える
0

このようにすることができます(1回のxmltable()呼び出しで:

SELECT                            
CustomerName,
CustomerDOB,
CustomerEmail,
PoductType


FROM   XMLTABLE ('for $i in $custt/USACustomers/NewYorkCustomers/Customer, 
                 $j in $i//CustomerProduct 
                 return <deNormalizedCust>{$i//CustomerData}{$j}</deNormalizedCust>'
PASSING xmltype(BFILENAME ('BACKUP', 'TEST.xml'), NLS_CHARSET_ID ('AL32UTF8'))
as "custt"
COLUMNS CustomerName  VARCHAR2(50)    PATH '/deNormalizedCust/CustomerData/CustomerName',
        CustomerDOB   VARCHAR2(50)    PATH '/deNormalizedCust/CustomerData/CustomerDOB',
        CustomerEmail VARCHAR2(50)    PATH '/deNormalizedCust/CustomerData/CustomerEmail',
        PoductType    VARCHAR2(50)    PATH '/deNormalizedCust/CustomerProduct/PoductType',
        ProductNumber VARCHAR2(50)    PATH '/deNormalizedCust/CustomerProduct/ProductNumber');

ここにsqlfiddleのデモがあります

于 2013-01-16T10:15:15.050 に答える