2016-08-24 8 views
1

clobフィールドにXMLが格納されています。 xmlには繰り返しノードがあります。私の抽出は、繰り返しノードがないときに動作します(clobで1回の提出)。 EXTRACT Valueは1つのノードの値を返します。私のOracleのバージョンと、入力フィールドがOracleテーブルのCLOBタイプであるという事実を考慮した私のオプションは何ですか?私はXMLtableを試してみましたが、それを動作させることができず、私のデータがクローブに格納されていることを確認できません。Oracle 11.2.0.3 EXTRACT値が1つのノードの値を返します

マイテーブル:

CREATE TABLE "LEAD_REPORTING_CLOB" 
("FILENAME" VARCHAR2(80), 
"SHARED_XML" CLOB); 

マイCLOB:

<?xml version="1.0"?> 
<LeadReport xmlns="http://www.xxx.yyy/efile"> 
<Lead> 
    <AssociatedState> 
    <StateOrCityCode>AZST</StateOrCityCode> 
    </AssociatedState> 
    <AssociatedState> 
    <StateOrCityCode>MIST</StateOrCityCode> 
    </AssociatedState> 
    <PatternDescription>MI state</PatternDescription> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>98.999.99.115</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-25T10:12:19-07:00</IPTs> 
    </SourceIPAddress> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>192.888.888.888</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-25T10:32:10-07:00</IPTs> 
    </SourceIPAddress> 
    <AdditionalInformation> 
    <ReturnSubmStatus>U</ReturnSubmStatus> 
    <EmailAddressDomain>emailchair.33xxxx.com</EmailAddressDomain> 
    <PhoneNumberLastFour>5553</PhoneNumberLastFour> 
    </AdditionalInformation> 
</Lead> 
<Lead> 
    <AssociatedState> 
    <StateOrCityCode>AZST</StateOrCityCode> 
    </AssociatedState> 
    <AssociatedState> 
    <StateOrCityCode>MIST</StateOrCityCode> 
    </AssociatedState> 
    <PatternDescription>MI state2</PatternDescription> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>98.444.44.444</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-25T10:03:43-07:00</IPTs> 
    </SourceIPAddress> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>192.333.33.333</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-25T10:20:33-07:00</IPTs> 
    </SourceIPAddress> 
    <AdditionalInformation> 
    <ReturnSubmStatus>U</ReturnSubmStatus> 
    <EmailAddressDomain>emailchair.33xxxx.com</EmailAddressDomain> 
    <PhoneNumberLastFour>1744</PhoneNumberLastFour> 
    </AdditionalInformation> 
</Lead> 
<Lead> 
    <SubmissionId>9999988861170019999</SubmissionId> 
    <AssociatedState> 
    <StateOrCityCode>AZST</StateOrCityCode> 
    </AssociatedState> 
    <AssociatedState> 
    <StateOrCityCode>MIST</StateOrCityCode> 
    </AssociatedState> 
    <PatternDescription>MI/AZ</PatternDescription> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>98.222.22.222</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-23T22:07:16-07:00</IPTs> 
    </SourceIPAddress> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>192.666.66.666</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-25T21:59:21-07:00</IPTs> 
    </SourceIPAddress> 
    <SourceIPAddress> 
    <IPAddress> 
    <IPv4AddressTxt>198.111.111.111</IPv4AddressTxt> 
    </IPAddress> 
    <IPTs>2016-04-26T00:12:37-07:00</IPTs> 
    </SourceIPAddress> 
    <AdditionalInformation> 
    <ReturnSubmStatus>R</ReturnSubmStatus> 
    <EmailAddressDomain>emailchair.33xxxx.com</EmailAddressDomain> 
    <PhoneNumberLastFour>0503</PhoneNumberLastFour> 
    </AdditionalInformation> 
</Lead> 
</LeadReport> 

マイセレクト:

select  
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead/SubmissionId', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "SubmissionId", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//StateSubmissionId', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "state_submission_id", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//StateOrCityCode', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "StateOrCityCode", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead/PatternDescription', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "PatternDescription", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//IPv4AddressTxt', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "IPv4AddressTxt", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//TCPPortNumber', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "TCPPortNumber", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//IPTs', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "IPTs", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//DeviceId', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "DeviceId", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//DeviceIdTs', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "DeviceIdTs", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//ReturnSubmStatus', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "ReturnSubmStatus", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//EFIN', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "EFIN", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//PTIN', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "PTIN", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//EmailAddressDomain', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "EmailAddressDomain", 
      nvl(EXTRACTVALUE(xmltype(ocr.shared_xml), 
        '//Lead//PhoneNumberLastFour', 
        'xmlns="http://www.xxx.yyy/efile"'), 
     '') as "PhoneNumberLastFour" 

FROM 
    lead_reporting_clob ocr; 

答えて

1

extractvalue() functionはとにかく推奨されていません。 nvl()あなたのコードを呼び出すことは、空の文字列でnullを置き換えるときに冗長であり、Oracleではnullと同じです。

あなたは、複数のノードから情報を抽出するためにXMLTable()を使用することができます。

select x.* 
from lead_reporting_clob ocr 
cross join xmltable(xmlnamespaces(default 'http://www.xxx.yyy/efile'), 
    '/LeadReport/Lead' 
    passing xmltype(ocr.shared_xml) 
    columns "SubmissionId" varchar2(20) path 'SubmissionId', 
    "state_submission_id" varchar2(20) path 'AssociatedState/StateSubmissionId', 
    "StateOrCityCode" varchar2(4) path 'AssociatedState/StateOrCityCode', 
    "PatternDescription" varchar2(3) path 'PatternDescription', 
    "IPv4AddressTxt" varchar2(15) path 'SourceIPAddress/IPAddress/IPv4AddressTxt', 
    "TCPPortNumber" number path 'SourceIPAddress/TCPPortNumber', 
    "IPTs" varchar2(25) path 'SourceIPAddress/IPTs', 
    "DeviceId" varchar2(48) path 'SourceDeviceId/DeviceId', 
    "DeviceIdTs" varchar2(25) path 'SourceDeviceId/DeviceIdTs', 
    "ReturnSubmStatus" varchar2(1) path 'AdditionalInformation/ReturnSubmStatus', 
    "EFIN" varchar2(10) path 'AdditionalInformation/EFIN', 
    "PTIN" varchar2(10) path 'AdditionalInformation/PTIN', 
    "EmailAddressDomain" varchar2(16) path 'AdditionalInformation/EmailAddressDomain', 
    "PhoneNumberLastFour" varchar2(4) path 'AdditionalInformation/PhoneNumberLastFour' 
) x; 

SubmissionId   state_submission_id Stat Pat IPv4AddressTxt TCPPortNumber IPTs      DeviceId           DeviceIdTs    R EFIN  PTIN  EmailAddressDoma Phon 
-------------------- -------------------- ---- --- --------------- ------------- ------------------------- ------------------------------------------------ ------------------------- - ---------- ---------- ---------------- ---- 
530153999999zdhxxx        OLF 999.99.99.999    443 2016-02-05T13:16:55-05:00 74B3A80AE5C68F2B65753C17XX59E5XX3779999A   2016-02-05T13:16:55-05:00 A 555555    GMAIL.COM  1899 
9999992016108floxxx2 9999992016108xhaxxx2 GAST OLF 172.56.5.100    443 2016-04-17T08:07:54-04:00 6B9D4C4B0155EEE8FA30391BC8A012950009B366   2016-04-17T08:07:54-04:00 A 444444    YAHOO.COM  3822 

は、あなたが実際に期待するものと一致する各columnsエントリのデータ型とサイズを設定する必要があります。私はサンプルデータから近似しました。

select xl."SubmissionId", xas."state_submission_id", xas."StateOrCityCode", 
    xl."PatternDescription", xsi."IPv4AddressTxt", xsi."TCPPortNumber", xsi."IPTs", 
    xl."DeviceId", xl."DeviceIdTs", xl."ReturnSubmStatus", xl."EFIN", xl."PTIN", 
    xl."EmailAddressDomain", xl."PhoneNumberLastFour" 
from lead_reporting_clob ocr 
cross join xmltable(xmlnamespaces(default 'http://www.xxx.yyy/efile'), 
    '/LeadReport/Lead' 
    passing xmltype(ocr.shared_xml) 
    columns "SubmissionId" varchar2(20) path 'SubmissionId', 
    associatedstate xmltype path 'AssociatedState', 
    "PatternDescription" varchar2(10) path 'PatternDescription', 
    sourceipaddress xmltype path 'SourceIPAddress', 
    "DeviceId" varchar2(48) path 'SourceDeviceId/DeviceId', 
    "DeviceIdTs" varchar2(25) path 'SourceDeviceId/DeviceIdTs', 
    "ReturnSubmStatus" varchar2(1) path 'AdditionalInformation/ReturnSubmStatus', 
    "EFIN" varchar2(10) path 'AdditionalInformation/EFIN', 
    "PTIN" varchar2(10) path 'AdditionalInformation/PTIN', 
    "EmailAddressDomain" varchar2(16) path 'AdditionalInformation/EmailAddressDomain', 
    "PhoneNumberLastFour" varchar2(4) path 'AdditionalInformation/PhoneNumberLastFour' 
) xl 
cross join xmltable(xmlnamespaces(default 'http://www.xxx.yyy/efile'), 
    '/AssociatedState' 
    passing xl.associatedstate 
    columns "state_submission_id" varchar2(20) path 'StateSubmissionId', 
    "StateOrCityCode" varchar2(4) path 'StateOrCityCode' 
) xas 
cross join xmltable(xmlnamespaces(default 'http://www.xxx.yyy/efile'), 
    '/SourceIPAddress' 
    passing xl.sourceipaddress 
    columns "IPv4AddressTxt" varchar2(15) path 'IPAddress/IPv4AddressTxt', 
    "TCPPortNumber" number path 'TCPPortNumber', 
    "IPTs" varchar2(25) path 'IPTs' 
) xsi; 

SubmissionId   state_submission_id Stat PatternDes IPv4AddressTxt TCPPortNumber IPTs      DeviceId           DeviceIdTs    R EFIN  PTIN  EmailAddressDoma Phon 
-------------------- -------------------- ---- ---------- --------------- ------------- ------------------------- ------------------------------------------------ ------------------------- - ---------- ---------- ---------------- ---- 
              AZST MI state 98.999.99.115     2016-04-25T10:12:19-07:00                   U      emailchair.33xxx 5553 
              AZST MI state 192.888.888.888    2016-04-25T10:32:10-07:00                   U      emailchair.33xxx 5553 
              MIST MI state 98.999.99.115     2016-04-25T10:12:19-07:00                   U      emailchair.33xxx 5553 
              MIST MI state 192.888.888.888    2016-04-25T10:32:10-07:00                   U      emailchair.33xxx 5553 
              AZST MI state2 98.444.44.444     2016-04-25T10:03:43-07:00                   U      emailchair.33xxx 1744 
              AZST MI state2 192.333.33.333    2016-04-25T10:20:33-07:00                   U      emailchair.33xxx 1744 
              MIST MI state2 98.444.44.444     2016-04-25T10:03:43-07:00                   U      emailchair.33xxx 1744 
              MIST MI state2 192.333.33.333    2016-04-25T10:20:33-07:00                   U      emailchair.33xxx 1744 
9999988861170019999      AZST MI/AZ  98.222.22.222     2016-04-23T22:07:16-07:00                   R      emailchair.33xxx 0503 
9999988861170019999      AZST MI/AZ  192.666.66.666    2016-04-25T21:59:21-07:00                   R      emailchair.33xxx 0503 
9999988861170019999      AZST MI/AZ  198.111.111.111    2016-04-26T00:12:37-07:00                   R      emailchair.33xxx 0503 
9999988861170019999      MIST MI/AZ  98.222.22.222     2016-04-23T22:07:16-07:00                   R      emailchair.33xxx 0503 
9999988861170019999      MIST MI/AZ  192.666.66.666    2016-04-25T21:59:21-07:00                   R      emailchair.33xxx 0503 
9999988861170019999      MIST MI/AZ  198.111.111.111    2016-04-26T00:12:37-07:00                   R      emailchair.33xxx 0503 

14 rows selected 

:あなたは、あなたが最初に自分自身のXMLTypeとしてそれらを取得する必要があるので、各リードの下に2つの繰り返しのノードを持っているし、その後さらにXMLTableのは、それらを分解するために呼び出す必要があり、あなたの更新の例のXMLで


クロスジョインは、予想よりも多くの行になります。リピートIP(例:listagg)のようなものを組み合わせたり、繰り返しノードを別々のリレーショナルテーブルに抽出したりすることができます。これは実際にクエリの結果をどうするかによって異なります。

+0

それはそれを行います。ありがとう、アレックス! – Marianne

+0

これで、すべてのデータをクローブにロードしましたので、問合せを試して、次のエラーが発生しました。ORA-19279:XPTY0004 - XQueryの動的型の不一致:予期されたシングルトンのシーケンス - 複数項目のシーケンスの取得 – Marianne

+0

あなたが提供したサンプルデータ。拡張CLOBには、サブノードの1つの倍数を持つ先導ノードがありますか?もしそうなら、2番目のレベルのXMLTableを持つことができますが、例がなくても説明するのは難しいです。 [この例は役に立ちます](http://stackoverflow.com/a/29942692/266304)? –

関連する問題