Я использую процедуру PL/SQL для вставки значений из XML в реляционные таблицы. XML-файл находится в столбце XMLTYPE.
Колонны таблицы (OFFLINE_XML), содержащие XML являются
Разбор PL/SQL XML в реляционные таблицы
ID, XML_FILE, STATUS
Есть две таблицы, в которой я хочу, чтобы вставить значения, т.е. ПОДРАЗДЕЛЕНИЕ и РАЗДЕЛЫ Структура ОТДЕЛ как в соответствии с: -
ID, NAME
Структура таблицы разделов: -
ID, NAME, DEPARTMENT_ID
Теперь есть третья таблица (LIST_1) в бее ch i хочу вставить значения, которые уже существуют в обеих вышеупомянутых таблицах.
Структура LIST_1 является: -
ID, DEPARTMENT_ID,DEPARTMENT_NAME,SECTIONS_ID, SECTIONS_NAME
формат XML, как в соответствии: -
<ROWSET>
<DEPARTMENT>
<DEPARTMENT_ID>DEP22681352268280797</DEPARTMENT_ID>
<DEPARTMENT_NAME>myDEPARTMENT</DEPARTMENT_NAME>
<SECTIONS_ID>6390135666643567</SECTIONS_ID>
<SECTIONS_NAME>mySection</SECTIONS_NAME>
</DEPARTMENT>
<DEPARTMENT>
<DEPARTMENT_ID>DEP255555555550797</DEPARTMENT_ID>
<DEPARTMENT_NAME>myDEPARTMENT2</DEPARTMENT_NAME>
<SECTIONS_ID>63901667779243567</SECTIONS_ID>
<SECTIONS_NAME>mySection2</SECTIONS_NAME>
</DEPARTMENT>
</ROWSET>
DECLARE
BEGIN
insert all
into department (id, name)
values (unit_id, unit_name)
into sections (id, name, department _id)
values (sect_id, sect_name, department _id)
select department .id as department _id
, department.name as department_name
, sect.id as sect_id
, sect.name as sect_name
from OFFLINE_XML
, xmltable('/ROWSET/DEPARTMENT'
passing OFFLINE_XML.xml_file
columns
"ID" varchar2(20) path 'UNIT_ID'
, "NAME" varchar2(20) path 'UNIT_NAME'
) department
, xmltable('/ROWSET/DEPARTMENT'
passing OFFLINE_XML.xml_file
columns
"ID" varchar2(20) path 'SECTIONS_ID'
, "NAME" varchar2(20) path 'SECTIONS_NAME'
) sect
where status = 3;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('Duplicate='|| department.id);
--insert into LIST_1 values(ID,DEPARTMENT_ID, SECTIONS_ID, DEPARTMENT_NAME,SECTIONS_NAME);
END;
Теперь проблема заключается в том, что как я могу вставить или определить значения на основе первичного ключа, который уже существует в таблице DEPARTMENT и SECTIONS и после этого вставляет существующие значения в таблицу LIST_1. ------ Обновленное усилие --------------
Я придумал другое решение, но это снова дает мне проблемы. В указанной процедуре курсор имеет тенденцию повторяться для каждого xquery. Я не знаю, как я буду решать этот вопрос ..
DECLARE
department_id varchar2(20);
department_name varchar2(20);
sect_id varchar2(20);
sect_name varchar2(20);
sections_unit_id varchar2(20);
var number;
CURSOR C1 IS
select
sect.id as sect_id
, sect.name as sect_name
, sect.unit_id as sections_unit_id
from OFFLINE_XML
, xmltable('/ROWSET/DEPARTMENT'
passing OFFLINE_XML.xml_file
columns
"ID" varchar2(20) path 'UNIT_ID'
, "NAME" varchar2(20) path 'UNIT_NAME'
) DEPARTMENT
, xmltable('/ROWSET/DEPARTMENT'
passing OFFLINE_XML.xml_file
columns
"ID" varchar2(20) path 'SECTIONS_ID'
, "NAME" varchar2(20) path 'SECTIONS_NAME'
, "DEPARTMENT_ID" varchar2(20) path 'DEPARTMENT_ID'
) sect
where status = 3;
BEGIN
FOR R_C1 IN C1 LOOP
BEGIN
var :=1;
--insert into sections_temp_1 (id, name)values (R_C1.sect_id, R_C1.sect_name);
-- commit;
dbms_output.put_line('Duplicate='||var);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('Duplicate='||R_C1.sect_id);
END;
var:=var+1;
END LOOP;
END;
Интересно, как это поможет мне вставлять уже существующие значения в таблицу DEPARTMENT и SECTIONS в таблицу LIST_1? –
Я предполагаю, что у вас есть первичные ключи, определенные в этих таблицах: в этом случае LOG ERROR INTO будет обрабатывать уникальные нарушения ключа, записывая дубликаты записей в таблицы журналов. – APC
То есть, используйте отдельные журналы для каждой целевой таблицы, а не одну таблицу для обоих. – APC