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 - 생산
으로 바꿀 수 있습니다. "완료하는 데 시간이 걸립니다." 그게 무슨 뜻 이죠? 시간, 주, 년? 저지른거야? 당신은 "절차"라고 말합니다. 이것은 pl/sql 프로 시저에 있습니까? – OldProgrammer
커밋 안함. 프로 시저를 완료하는 데 약 15 분이 걸리고 insert 문에 걸리지 만 레코드가 삽입되지 않으며 실행시 오류가 생성되지 않습니다. 코드 블록을 빼고 30 초가 걸립니다. – QuickDrawMcgraw
위의 SQL에서 "select"부분 만 실행하면 데이터가 반환됩니까? 무슨 뜻이야, "붙어 있니?" 어딘가에 커밋이 없다면 왜 테이블에있는 데이터를 기대합니까? 나는 혼란 스럽다. – OldProgrammer