XML 데이터를 여러 테이블로 구문 분석하는 프로 시저를 만들었습니다. 기본 키 제약 조건에 대한 예외를 잡아 내고 결과에 중복이 있으면 DUPLICATE라는 테이블에 삽입됩니다. 내가 커서를 사용할 때
지금이 시대의 필요한 수보다 더 많은 반복하는 경향 즉 1
어떻게이 상황을 처리하기 위하여려고하고있다중첩 된 XQUERY에 대한 중복 항목을 만드는 커서 for 루프
DECLARE
PER_ID varchar2(20);
NAME varchar2(20);
SECTIONS_ID varchar2(20);
SECTIONS_NAME varchar2(20);
var1 number;
exception_var number;
CURSOR C1 IS
select d.department_id
, d.department_name
, s.sections_id
, s.sections_name
from xml_unit_download t
, xmltable(
'/ROWSET/DATA'
passing t.xml_file
columns
DEPARTMENT_ID varchar2(20) path 'DEPARTMENT/DEPARTMENT_ID'
, DEPARTMENT_NAME varchar2(30) path 'DEPARTMENT/DEPARTMENT_NAME'
, SECTIONS xmltype path 'SECTIONS'
) d
, xmltable(
'/SECTIONS'
passing d.sections
columns
SECTIONS_ID varchar2(20) path 'SECTIONS_ID'
, SECTIONS_NAME varchar2(30) path 'SECTIONS_NAME'
) s
where
t.Status = 4;
BEGIN
FOR R_C1 IN C1 LOOP
BEGIN
insert into DEPARTMENT(id, name) values(R_C1.PER_ID, R_C1.name);
insert into SECTIONS(id, name) values(R_C1.SECTIONS_ID, R_C1.SECTIONS_NAME);
var1:= var1+1;
dbms_output.put_line('Insert=' || var1);
commit;
--dbms_output.put_line('Duplicate='||var);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('Duplicate=');
insert into duplicate(id, name)values(R_C1.id, R_C1_name);
END;
END LOOP;
END;
절차? INSERT ALL을 사용하여 시도했지만 작동하지 않는 것 같습니다. 여기에 INSERT 내 시도 모든 절차
DECLARE
PER_ID varchar2(20);
NAME varchar2(200);
var1 number;
exception_var number;
BEGIN
insert all
into SECTIONS (id) values(department_id)
--into sect (id, name) values(s.SECTIONS_ID, s.SECTIONS_NAME)
select d.department_id
, d.department_name
, s.sections_id
, s.sections_name
from xml_unit_download t
, xmltable(
'/ROWSET/DATA'
passing t.xml_file
columns
"DEPARTMENT_ID" varchar2(20) path 'DEPARTMENT/DEPARTMENT_ID'
, "DEPARTMENT_NAME" varchar2(30) path 'DEPARTMENT/DEPARTMENT_NAME'
, "SECTIONS" xmltype path 'SECTIONS'
) d
, xmltable(
'/SECTIONS'
passing d.sections
columns
"SECTIONS_ID" varchar2(20) path 'SECTIONS_ID'
, "SECTIONS_NAME" varchar2(30) path 'SECTIONS_NAME'
) s
where
t.Status = 4;
dbms_output.put_line('Insert=' || var1);
var1:= var1+1;
dbms_output.put_line('Insert=' || var1);
commit;
--dbms_output.put_line('Duplicate='||var);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
--insert into
dbms_output.put_line('Duplicate=');
END;
부서의 섹션 데이터가 포함 된 조회되는 XML입니다. DEPARTMENT는 SECTIONS와 일대일로 많은 관계가 있습니다. 즉, DEPARTMENT에는 하나 이상의 SECTIONS가있을 수 있으며 DEPARTMENT에는 SECTIONS가없는 인스턴스가있을 수 있습니다.
XML 구조는 태그가 DEPARTMENT와 해당 SECTIONS 세트를 식별하는 것과 같습니다. 각 부서의 여러 섹션을 가질 수 있기 때문에
XML
<ROWSET>
<DATA>
<DEPARTMENT>
<DEPARTMENT_ID>DEP1</DEPARTMENT_ID>
<DEPARTMENT_NAME>myDEPARTMENT1</DEPARTMENT_NAME>
</DEPARTMENT>
<SECTIONS>
<SECTIONS_ID>6390135666643567</SECTIONS_ID>
<SECTIONS_NAME>mySection1</SECTIONS_NAME>
</SECTIONS>
<SECTIONS>
<SECTIONS_ID>6390135666643567</SECTIONS_ID>
<SECTIONS_NAME>mySection2</SECTIONS_NAME>
</SECTIONS>
</DATA>
<DATA>
<DEPARTMENT>
<DEPARTMENT_ID>DEP2</DEPARTMENT_ID>
<DEPARTMENT_NAME>myDEPARTMENT2</DEPARTMENT_NAME>
</DEPARTMENT>
<SECTIONS>
<SECTIONS_ID>63902</SECTIONS_ID>
<SECTIONS_NAME>mySection1</SECTIONS_NAME>
</SECTIONS>
</DATA>
<DATA>
<DEPARTMENT>
<DEPARTMENT_ID>DEP3</DEPARTMENT_ID>
<DEPARTMENT_NAME>myDEPARTMENT3</DEPARTMENT_NAME>
</DEPARTMENT>
</DATA>
</ROWSET>
부서에 두 개의 섹션이있는 경우 검색어는 동일한 부서 정보와 다른 섹션 정보로 두 행을 반환합니다 (자체적으로 쿼리를 실행하는 것처럼 볼 수 있음). 따라서 중복 부서가 '유효'하며 한 부서의 두 섹션과 한 섹션을 가진 두 개의 동일한 부서를 구분할 수 없습니다. 어느 쪽이든, 당신의 중복 부서가 예외를 얻었 기 때문에, 두 번째 섹션은 절대로 삽입되지 않습니다. 첫 번째 삽입 주위에 예외 처리기를 넣을 수도 있지만 이것이 최선의 접근 방식처럼 보이지는 않습니다. –