2016-08-24 1 views
1

Ich habe ein XML in einem Clob-Feld gespeichert. Das XML hat sich wiederholende Knoten. Mein Auszug funktioniert, wenn es keine sich wiederholenden Knoten gibt (eine Einreichung mit dem clob). Ich erhalte einen Fehler EXTRACT Wert gibt den Wert eines Knotens zurück. Was sind meine Optionen in Bezug auf meine Oracle-Version und die Tatsache, dass das Eingabefeld vom Typ CLOB auf meiner Oracle-Tabelle ist? Ich habe versucht, XMLtable, aber es war nicht in der Lage, es zum Laufen zu bringen und ich bin nicht wirklich sicher, dass es mit meinen Daten arbeiten kann, die in einem clob gespeichert werden.Oracle 11.2.0.3 EXTRACT Wert gibt den Wert eines Knotens zurück

Meine Tabelle:

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

Mein 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> 

Meine Auswahl:

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; 

Antwort

1

Die extractvalue() function ohnehin veraltet. Und die nvl() Aufruf sin Ihren Code sind redundant, wie Sie Null durch eine leere Zeichenfolge ersetzen, die gleich Null in Oracle ist.

Sie können XMLTable() verwenden, um die Informationen von mehreren Knoten zu extrahieren:

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 

Sie müssen den Datentyp und die Größe jedes columns Eintrag einstellen zu entsprechen, was man eigentlich erwarten; Ich habe aus den Beispieldaten approximiert.


Mit Ihrem aktualisierten Beispiel XML Sie unter jeder Führung zwei sich wiederholende Knoten haben, so müssen Sie zunächst sie als ihre eigenen XMLTypes zu bekommen, und haben dann weiter XMLTable nennt sie dekonstruieren:

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 

Die Cross-Joins machen mehr Zeilen als erwartet; Sie können entweder Dinge wie die sich wiederholende IP (z. B. mit listagg) kombinieren oder die sich wiederholenden Knoten in separate relationale Tabellen extrahieren - es hängt wirklich davon ab, was Sie mit den Ergebnissen Ihrer Abfrage zu tun beabsichtigen.

+0

Das wird es tun. Vielen Dank, Alex! – Marianne

+0

Jetzt, da ich alle Daten in den Clob geladen habe, habe ich die Abfrage versucht und den folgenden Fehler erhalten: ORA-19279: XPTY0004 - XQuery dynamischen Typ Mismatch: erwartete Singleton-Sequenz - habe Multi-Item-Sequenz – Marianne

+0

Ich testete es mit die von Ihnen bereitgestellten Beispieldaten. Hat Ihr maximierter CLOB einen Hauptknoten mit Vielfachen eines der Unterknoten? Wenn ja, können Sie eine zweite Ebene von XMLTable haben, aber ohne ein Beispiel ist es schwer zu erklären. [Dieses Beispiel kann helfen] (http://stackoverflow.com/a/29942692/266304)? –

Verwandte Themen