2016-06-20 8 views
0

'agg'テーブルに 'requirement'の値を挿入するタスクがあります。どうすればいいの?現在のコードは、値のうちの1つだけの結果を示しています。最初のものは具体的なものです。どのようにして3つの値すべてを得ることができますか?データベースに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

場合にのみ行を挿入しますので、それは最初の行のみを挿入されています3行、あなたはカウンターを変更するか、それを削除する必要があります。

0

すでにようにあなたが簡単に、INSERT文で直接それを使用することができ、XML列を照会するXMLTABLEを使用していると見て:場合は、その後、上記のステートメント上の任意の追加フィルタを追加することができ

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; 

テーブルなどに既に存在する行を除外する必要があります。

データベースを操作するときには、行単位で処理することは面倒で非効率的ですあなたのドライブの一番下にレンガを配達してから、一度に1つずつピックアップしてpあなたがそれらを使用しているレース。代わりに、その代わりにその場所に右にそれらを提供するためにバンを得るために、より良い?)

関連する問題