首页 > 解决方案 > 在循环中插入多个值

问题描述

我以为我能够做这种事情:

BEGIN
    FOR r_var IN (select var1 from schema.table1 where var2 = 2)
    LOOP
        insert into schema.table2(col1,col2,col3,col4) 
        select r_var.var1, count(*), 'aString', 0
        from schema.table2 
        where col1 = r_var.var1 group by r_var.var1;
    END LOOP;
END;

问题是“违反了唯一约束”。我认为当我在同一张表上使用选择而不是用于插入时出现问题。我怎样才能解决这个问题?

谢谢!

编辑:table2 对 col1 和 col2 进行了检查不是空约束,并且两个外键针对 table1 和另一个未使用的表。

EDIT2:我仍然没有找到解决方案,所以我拆分了我的问题。首先,我检查了我是否能够使用此查询正确获取计数:

SET SERVER OUTPUT ON
DECLARE
    count_rows NUMBER;
BEGIN
    FOR r_var IN (select var1 from schema.table1 where var2 = 2) 
    LOOP
        select count(*) into count_rows from schema.table2 where col1 = r_var .var1;
        DBMS_OUTPUT.PUT_LINE('order for var1 : ' || r_var.col1 || ' is ' || count_rows + 1);
    END LOOP;
 END;

结果:

order for var1: 144 is 20
order for var1: 3000 is 10
order for var1: 3001 is 9
order for var1: 3003 is 3
order for var1: 110 is 10
order for var1: 114 is 12
order for var1: 115 is 81
order for var1: 116 is 11
order for var1: 123 is 10

然后我尝试在表中只插入一行:

insert into schema.table2(col1, col2, col3, col4) values(144, 20, 'aString', 0);

哪个没有问题!

但是,当我运行下面的循环时,我遇到了“违反唯一约束”的问题:

DECLARE
count_rows NUMBER;
BEGIN
    FOR r_var IN (select var1 from schema.table1 where var2 = 2) 
    LOOP
        select count(*) into count_rows from schema.table2 where col1 = r_var.var1;
        insert into schema.table2(col1, col2, col3, col4) values(r_var.var1, count_rows + 1, 'aString', 0);
    END LOOP;
END;

标签: plsql

解决方案


问题来自插入,它试图插入一个已经相似的现有行的 col1 和 col2 行。当存在具有相同 col1 和 col2 的现有行时,约束阻止插入行。查询并没有完全按照我的意愿做,用 max(col2) 替换 count(*) 解决了这个问题:

DECLARE
    max_rows NUMBER;
BEGIN
    FOR r_var IN (select var1 from schema.table1 where var2 = 2) 
    LOOP
        select max(col2) into max_rows from schema.table2 where col1 = r_var.var1;
        insert into schema.table2(col1, col2, col3, col4) values(r_var.var1, max_rows + 1, 'aString', 0);
    END LOOP;
END;

推荐阅读