将xmltable中的多个值插入数据库

时间:2016-06-20 12:07:59

标签: sql xml oracle xmltable

有一项任务是将'requirement'的值插入表'agg'中。请告诉我怎么办?这里的当前代码只显示其中一个值的结果,第一个是具体的,如何才能使结果全部三个值?

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;    

不介意俄语字母,这里没有任何用西里尔语写的命令。

2 个答案:

答案 0 :(得分:1)

它只插入第一行,因为使用 regNum 字段有一个寄存器计数,只有当计数器为0时才会插入行。

由于此字段对于所有三行具有相同的值,您应该更改计数器或将其删除。

答案 1 :(得分:0)

看到您已经使用xmltable查询xml列,您可以直接在insert语句中使用它,例如:

// Variables
var waarde = {
amount:2
};

$(document).ready(function(){
updateValues();

$('#click2').click(function(){
waarde.amount++;
updateValues();
});

});

function updateValues(){
document.getElementById("click2").innerHTML = waarde.amount;
}

如果您需要排除表格中已有的行等,则可以在上述语句中添加任何其他过滤器。

请记住,在处理数据库时,您应该考虑集合 - 逐行处理(例如您正在进行的处理)极其低效(有点像在驱动器底部交付砖块然后选择它们)一次一个,把它们带到你正在使用它们的地方。更好的方法是让面包车把它们送到那个地方,对吧?!)