2016-11-09 2 views
0

Ich habe versucht, eine INSERT INTO .. ​​SELECT aus XML-Tabelle. Die Prozedur wird erfolgreich (schnell) ohne diese Einfügung abgeschlossen, aber wenn dieser Code zum Einfügen von 9999 Zeilen eingefügt wird, dauert es zwar etwas, bis die Tabelle abgeschlossen ist, aber die Tabelle enthält keine Datensätze.fügen Sie Massen-XML-Daten in einzelne Tabelle ein

FILE SNIPPET:

<xyzcompany xmlns="http://www.xyzcompany.com/Canonical" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pmt="http://xyzcompany.com/PmtInfo" xmlns:cmn="http://xyzcompany.com/CommonTypes"> 
<Pmt> 
<pmt:Payments> 
<pmt:PayInfo> 
<pmt:Single> 
<pmt:SingExtRef>HH00000066530</pmt:SingExtRef> 
<pmt:SingSequence>0001</pmt:SingSequence> 
<pmt:SingAddInfo> 
    <cmn:AddInfoCmpType>IndivID</cmn:AddInfoCmpType> 
    <cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
    <cmn:AddInfoCmpText>30UAT23203</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
<pmt:SingAddInfo> 
    <cmn:AddInfoCmpType>Transaction Reference</cmn:AddInfoCmpType> 
    <cmn:AddInfoCmpText>062001180000553</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
<pmt:SingAddInfo> 
<cmn:AddInfoCmpType>EntryDesc</cmn:AddInfoCmpType> 
<cmn:AddInfoCmpText>TRADE PYMT</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
<pmt:SingAddInfo> 
<cmn:AddInfoCmpType>ACH Company ID</cmn:AddInfoCmpType> 
<cmn:AddInfoCmpText>1444444444</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
<pmt:SingAddInfo> 
<cmn:AddInfoCmpType>PmtRelInfo0001</cmn:AddInfoCmpType> 
<cmn:AddInfoCmpText>IV</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>UAT9999_00001</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>100.01</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
<pmt:SingAddInfo> 
<cmn:AddInfoCmpType>PmtRelInfo0002</cmn:AddInfoCmpType> 
<cmn:AddInfoCmpText>IV</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>UAT9999_00002</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>100.01</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
<cmn:AddInfoCmpText>NA</cmn:AddInfoCmpText> 
</pmt:SingAddInfo> 
</pmt:Single> 
</pmt:PayInfo> 
</pmt:Payments> 
</Pmt> 
</xyzcompany> 

Die obige Datei hat PMTRELINFO001 bis zu einem Maximum von PMTRELINFO9999. Ich muss nur diese und nicht die anderen Daten wie INDIVID greifen und in die Zieltabelle einfügen. Mein Code dafür ist unten.

INSERT INTO ach_addenda(ach_id,rmr_number,rmr_code,invoice_number,rmr_paid_amt,rmr_orig_amt,rmr_disc_amt,rmr_date,ref_code,ref_id,ref_name,ref_instructions,adx_instructions, 
     ent_number) 
     (SELECT app_data_seq.currval, 

       sing_d1.sing_info_type, 
       sing_d1.sing_info_text1, 
       sing_d1.sing_info_text2, 
       sing_d1.sing_info_text3, 
       sing_d1.sing_info_text4, 
       sing_d1.sing_info_text5, 
       sing_d1.sing_info_text6, 
       sing_d1.sing_info_text7, 
       sing_d1.sing_info_text8, 
       sing_d1.sing_info_text9, 
       sing_d1.sing_info_text10, 
       sing_d1.sing_info_text11, 
       sing_d1.sing_info_text12 


      FROM XMLTABLE (
        xmlnamespaces (
         'http://www.xyzcompany.com/Canonical' AS "xyz", 
         'http://xyzcompany.com/PmtInfo' AS "pmt", 
         'http://xyzcompany.com/CommonTypes' AS "cmn", 
         'http://www.w3.org/2001/XMLSchema-instance' AS "xsi"), 
        '/xyz:xyz/xyz:Pmt/pmt:Payments/pmt:PayInfo/pmt:Single/pmt:SingAddInfo[cmn:AddInfoCmpType = "PMTREL%"]' 
        PASSING payXml 
        COLUMNS sing_info_type VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpType', 
          sing_info_text1 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[1]', 
          sing_info_text2 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[2]', 
          sing_info_text3 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[3]', 
          sing_info_text4 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[4]', 
          sing_info_text5 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[5]', 
          sing_info_text6 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[6]', 
          sing_info_text7 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[7]', 
          sing_info_text8 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[8]', 
          sing_info_text9 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[9]', 
          sing_info_text10 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[10]', 
          sing_info_text11 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[11]', 
          sing_info_text12 VARCHAR2(4000) 
            PATH 'cmn:AddInfoCmpText[12]' 
          ) sing_d1 
          ); 

Alle Vorschläge, um die Effizienz zu erhöhen und den Einsatz arbeiten zu lassen, werden geschätzt. Ich habe auch den Einsatz mit dem Append-Tipp ausprobiert, kein Unterschied.

Oracle Database 11g Enterprise Edition Veröffentlichung 11.2.0.3.0 - 64-Bit-Produktion
PL/SQL Release 11.2.0.3.0 - Produktion
CORE 11.2.0.3.0 Produktion
TNS für Solaris: Version 11.2.0.3 .0 - Produktion
NLSRTL Version 11.2.0.3.0 - Produktion

+0

"es braucht seine Zeit zu vervollständigen." Was bedeutet das? Stunden, Wochen, Jahre? Hast du dich verpflichtet? Sie erwähnen "Prozedur". ist das in einem pl/sql-Verfahren? – OldProgrammer

+0

Kein Festschreiben. Es dauert ungefähr 15 Minuten, um die Prozedur abzuschließen, bleibt bei der INSERT-Anweisung hängen, aber es werden keine Datensätze eingefügt, bei der Ausführung wird kein Fehler generiert. Minus der Codeblock, dauert 30 Sekunden. – QuickDrawMcgraw

+0

Wenn Sie also nur den "select" Teil des obigen SQL ausführen, gibt es Daten zurück? Was meinst du, "bleibt stecken?" Wenn Sie irgendwo keinen Commit machen, warum erwarten Sie Daten in der Tabelle? Ich bin verwirrt. – OldProgrammer

Antwort

0

Ich sehe 3 Fehler in Ihrer Anfrage.

XMLTABLE (
        xmlnamespaces (
         default 'http://www.xyzcompany.com/Canonical', 
         'http://xyzcompany.com/PmtInfo' AS "pmt", 
         'http://xyzcompany.com/CommonTypes' AS "cmn", 
         'http://www.w3.org/2001/XMLSchema-instance' AS "xsi"), 
        '/xyzcompany/Pmt/pmt:Payments/pmt:PayInfo/pmt:Single/pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]' 
        PASSING a). 

1) Wurzel nood ist xyzcompany nicht xyz

2) http://www.xyzcompany.com/Canonical Standard-Namespace ist und sollte es auf diese Weise default 'http://www.xyzcompany.com/Canonical',

3) cmn:AddInfoCmpType = "PMTREL%" in XQuery eingerichtet wird, ist nicht Betreiber mögen. Er kann ersetzt werden mit pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]

+0

Vielen Dank für die Änderung der Klausel. Der Leistungsteil des Problems ist immer noch gültig und wurde beim Einfügen von 9999 Zeilen fast 20 Minuten lang ausgeführt. Irgendwelche Ideen? Sollte ich Hinweise verwenden? – QuickDrawMcgraw

+0

versuche mit 'NO_MERGE' ohne irgendein Argument in select und' parallel' in Einfügung –

+0

INSERT/* + PARALLEL (4) */INTO .. ​​SELECT/* + NO_MERGE */... hilft nicht. Ich habe alle Beschränkungen deaktiviert, um diese direkte Last zu lassen. – QuickDrawMcgraw

Verwandte Themen