2016-06-20 4 views
0

Есть задача вставить значения «требования» в таблицу «agg». Скажите, пожалуйста, как я могу это сделать? Текущий код здесь показывает результат только одного из значений, во-первых, чтобы быть конкретным, как я могу заставить его привести все три значения?Вставить несколько значений из xmltable в базу данных

INSERT INTO test 
    VALUES (4,xmltype (
    '<export> 
    <responsibleOrg> 
    <regNum>01731000018</regNum> 
    </responsibleOrg> 
     <requirements> 
      <requirement> 
       <code>8403975</code> 
       <name>Требование об отсутствии в предусмотренном Федеральным законом № 44-ФЗ реестре недобросовестных поставщиков </name> 
      </requirement> 
      <requirement> 
       <code>8632410</code> 
       <name>Единые требования к участникам </name> 
      </requirement> 
      <requirement> 
       <code>8361978</code> 
       <name>Иные дополнительные требования к участникам </name> 
      </requirement> 
     </requirements> 
    </export>')); 



DECLARE res NUMBER; 
BEGIN 
FOR r IN 
(
SELECT t.id 
FROM test t 
)loop 
sys.DBMS_OUTPUT.put_line('Номер файла №'|| ' '||r.id); 
FOR r2 IN 
(
SELECT x.*,k.* 
FROM test t, 
     xmltable('export/responsibleOrg' 
       passing t.DATA 
       COLUMNS 
       regnum varchar2(50) path 'regNum')k, 
     XMLTABLE ('export/requirements/requirement' 
       PASSING t.DATA 
       COLUMNS 
         code VARCHAR2(100) PATH 'code', 
         name varchar2(100) path 'name') x 
     WHERE t.id = 4 
)loop 

    IF r2.regNum IS NOT NULL THEN 

    SELECT COUNT(*) 
    INTO res 
FROM agg a 
WHERE a.regNum = r2.regNum; 
IF res = 0 THEN 
INSERT INTO agg(REGNUM,code,name)VALUES(r2.regnum,r2.code,r2.name); 
END IF; 
END IF; 
END loop; 
END loop; 
END;  

Не против русских писем, здесь нет никаких команд, написанных с кириллицей.

ответ

1

Она ввод только первая строку, потому что есть счетчик регистров с использованием Regnum поля, и он будет вставить строку только если счетчик равен 0.

Поскольку это поле имеет такое же значение для всех три строки, вы должны изменить счетчик или удалить его.

0

Видя, как вы уже используете XMLTABLE для запроса столбец XML, вы можете легко использовать, что непосредственно в операторе вставки, как:

insert into agg (regnum, code, name) 
    select t.id, 
     k.regnum, 
     x.code, 
     x.name 
from test t 
     cross join xmltable('export/responsibleOrg' 
          passing t.data 
          columns regnum varchar2(50) path 'regNum', 
            requirements xmltype path 'requirements') k 
     cross join xmltable ('export/requirements/requirement' 
          passing t.data 
          columns code number path 'code', 
            name varchar2(100) path 'name') x; 

Затем Вы можете добавить дополнительные фильтры на вышеуказанном заявлении, если вам нужно исключить строки, которые уже находятся в таблице, и т. д.

Помните, что при работе с базами данных вы должны думать в терминах множеств, поскольку обработка строк за строкой, например, вы делаете, ужасно неэффективна (a бит, как получение кирпичей, доставленных в нижней части вашего диска, а затем их сбор по одному и перенос их на p кружева вы их используете. Гораздо лучше получить фургон, чтобы доставить их прямо на это место, верно ?!)

Смежные вопросы