2016-11-09 12 views
0

xmltable에서 INSERT INTO .. ​​SELECT를 수행하려고했습니다. 이 삽입이 없으면 프로 시저가 성공적으로 (빠르게) 완료되지만이 코드가 9999 행을 삽입하기 위해 포함되면 완료까지 시간이 걸리지 만 테이블에는 레코드가 없습니다.대용량 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 
          ); 

효율성을 높이고 삽입 작업을하는 데 도움이되는 제안 사항. 추가 힌트가있는 삽입을 시도했지만 차이는 없습니다.

오라클 데이터베이스 11g 엔터프라이즈 에디션 출시 11.2.0.3.0 - 64 비트 생산
PL/SQL 릴리스 11.2.0.3.0 - 생산
CORE 11.2.0.3.0 생산
Solaris 용 TNS : 버전 11.2.0.3 .0 - 생산
NLSRTL 버전 11.2.0.3.0 - 생산

+0

으로 바꿀 수 있습니다. "완료하는 데 시간이 걸립니다." 그게 무슨 뜻 이죠? 시간, 주, 년? 저지른거야? 당신은 "절차"라고 말합니다. 이것은 pl/sql 프로 시저에 있습니까? – OldProgrammer

+0

커밋 안함. 프로 시저를 완료하는 데 약 15 분이 걸리고 insert 문에 걸리지 만 레코드가 삽입되지 않으며 실행시 오류가 생성되지 않습니다. 코드 블록을 빼고 30 초가 걸립니다. – QuickDrawMcgraw

+0

위의 SQL에서 "select"부분 만 실행하면 데이터가 반환됩니까? 무슨 뜻이야, "붙어 있니?" 어딘가에 커밋이 없다면 왜 테이블에있는 데이터를 기대합니까? 나는 혼란 스럽다. – 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하지 xyz

2) http://www.xyzcompany.com/Canonical는 기본 네임 스페이스 및 연산자를 좋아는 XQuery에서 그런 식으로 default 'http://www.xyzcompany.com/Canonical',

3) cmn:AddInfoCmpType = "PMTREL%"하지 거기 장식한다 xyzcompany입니다. pmt:SingAddInfo[contains(upper-case(cmn:AddInfoCmpType),"PMTREL")]

+0

조항을 개정 해 주셔서 감사합니다. 이 문제의 성능 부분은 여전히 ​​유효하며 9999 개의 행을 삽입하면 20 분 가까이 실행됩니다. 어떤 아이디어? 힌트를 사용해야합니까? – QuickDrawMcgraw

+0

INSERT/* + PARALLEL (4) */INTO .. ​​select/*/NO_MERGE */...는 select에 인수없이'NO_MERGE'를 시도하고, insert에'parallel'을 넣으려고합니다. –

+0

INSERT/* + PARALLEL 이 모든 직접적인 부하를 허용하기 위해 모든 제약 조건을 사용할 수 없습니다. – QuickDrawMcgraw