2016-11-09 28 views
0

xmltableからINSERT INTO .. SELECTを実行しようとしていました。この挿入がなくてもプロシージャは正常に(すぐに)完了しますが、このコードを挿入して9999行を挿入すると完了までに時間がかかりますが、テーブルにはレコードがありません。一括テーブルにbulk xmlデータを挿入

FILEスニペット:

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

上記のファイルがPMTRELINFO9999の最大までPMTRELINFO001を持っています。私はこれらを取得するだけで、INDIVIDなどの他のデータは取得せず、宛先テーブルに挿入するだけです。私のコードは以下の通りです。

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 
          ); 

効率を高めて挿入作業を行うための任意の提案があります。私はまた、差をつけずに追加ヒントを挿入してみました。

Oracle Database 11gのEnterprise Editionのリリース11.2.0.3.0 - 64ビットの生産
PL/SQLリリース11.2.0.3.0 - Solaris用の生産
CORE 11.2.0.3.0生産
TNS:バージョン11.2.0.3 .0 - 生産
NLSRTLバージョン11.2.0.3.0 - 生産

+0

と置き換えることができます "完了に時間がかかります。"どういう意味ですか?時間、週、年?あなたはコミットしましたか?あなたは、 "手続き"と言います。これはpl/sqlプロシージャでですか? – OldProgrammer

+0

コミットしません。手続きを完了するのに約15分かかり、insertステートメントでスタックされますが、レコードは挿入されず、実行時にエラーが生成されません。コードブロックを除いて、30秒かかります。 – QuickDrawMcgraw

+0

上記のSQLの「選択」部分を実行するだけで、データが返されますか?あなたはどういう意味ですか?どこかにコミットがない場合、なぜテーブル内のデータを期待していますか?私は混乱しています。 – OldProgrammer

答えて

0

私はあなたの質問に3つの間違いを見ます。

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)ルートnoodがxyzcompanyないxyz

2)http://www.xyzcompany.com/Canonicalは、デフォルトの名前空間であり、そのようdefault 'http://www.xyzcompany.com/Canonical',

3で装飾されるべきである)cmn:AddInfoCmpType = "PMTREL%" XQueryでオペレータが好きではありません。それはpmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]

+0

この条項を改正していただきありがとうございます。問題のパフォーマンス部分はまだ有効です.9999行の挿入時に20分近く実行されています。何か案は?私はヒントを使うべきですか? – QuickDrawMcgraw

+0

SELECTで引数なしで 'NO_MERGE'を試してください。挿入に' parallel'を入れてください。 –

+0

INSERT/* + PARALLEL(4)*/INTO .. SELECT/* + NO_MERGE */...は役に立ちません。私はすべての制約を無効にして、この直接負荷を許容します。 – QuickDrawMcgraw

関連する問題