2016-06-20 50 views
0

有一項任務是將'require'的值插入到表'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

作爲該字段具有所有相同值三行,你應該改變計數器或刪除它。因爲你已經在使用XMLTABLE查詢XML列

0

來看,你可以很容易地使用直接在INSERT語句,如:

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你正在使用它們的花邊。更好地讓麪包車把它們送到那個地方,對嗎?!)

相關問題