plsql - 在循环中插入多个值
问题描述
我以为我能够做这种事情:
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;
解决方案
问题来自插入,它试图插入一个已经相似的现有行的 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;
推荐阅读
- python - 生成 n 叉树时的无限递归
- kotlin - 遍历一个集合并只打印一条消息,而不是为集合中的每个项目打印一条消息
- flutter - 我有一个要在多条路线中使用的小部件。我需要这个小部件来使用不同的自定义类实例,具体取决于它是哪个路由
- python - 如何在 Plotly 中将一个月内的所有数据组合成一个代表一个月的列?
- javascript - npm 错误!enoent ENOENT:没有这样的文件或目录,renD:\E-commerceJs\frontend\node_modules\.axios.DELETE'
- python - Python 项目设置
- python - Python 请求 - 如何获得更短版本的 html 页面?
- python - 尝试删除时间和更改日期格式时解析错误?
- node.js - Node JS:有没有办法在 svg 模板中注入数据并从中生成 pdf?
- python - 数据框未显示整个表格