我想在一个循环中运行查询。有两个表,我想从一个表中获取ID,然后向另一个表中添加新行,并为每个ID添加新值。
我有两个表格,如下所示:
个人资料表:
ID NAME VALUE
1 AAA 111
2 BBB 222
3 CCC 333
4 DDD 444 ```
属性表:
ID ATTRIBUTE_ID VALUE
1 1 VAL1
2 1 VAL2
3 2 VAL2
4 2 VAL3
现在,我想从配置文件表中获取每个唯一ID,并在属性表中插入具有新值的相应行。茶几看起来应该像这样:
ID ATTRIBUTE_ID VALUE
1 1 VAL1
2 1 VAL2
3 2 VAL2
4 2 VAL3
5 1 VAL4
6 2 VAL4
我尝试了以下游标,但失败了:
DECLARE
-- Store the SELECT query in a cursor
CURSOR l_cur IS SELECT DISTINCT(ID) FROM PROFILE table;
--Create a variable that will hold each result from the cursor
l_cur_rec l_cur%ROWTYPE;
BEGIN
-- Open the Cursor so that we may retrieve results
OPEN l_cur;
LOOP
-- INSERT INTO another table
INSERT INTO ATTRIBUTE table (ID, ATTRIBUTE_ID, PLATFORM_ID)
VALUES((select max(ID)+1 from ATTRIBUTE_PLATFORM), (l_cur) , VAL4);
-- EXIT the loop if there are no more results
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
-- Close the cursor to release the memory
CLOSE l_cur;
END;
答案 0 :(得分:0)
您应该使用序列和触发器在属性表中填充id
,或者在Oracle 12中可以使用自动生成的列。由于会话并发,select max(id)+1
在实际表中不是一个好主意。然后,您可以在一条语句中插入:
insert into attribute_table (attribute_id, value)
select distinct id, 'VAL4' from profile_table
如果您想坚持自己的解决方案,请按如下所示更正您的代码:
declare
cursor l_cur is select distinct(id) from profile_table;
l_cur_rec l_cur%rowtype;
begin
open l_cur;
loop
fetch l_cur into l_cur_rec;
exit when l_cur%notfound;
dbms_output.put_line(l_cur_rec.id);
insert into attribute_table (id, attribute_id, value)
values((select max(id)+1 from attribute_table), l_cur_rec.id, 'VAL4');
end loop;
close l_cur;
end;