使用不同的参数多次运行查询

时间:2019-03-28 11:45:14

标签: oracle for-loop cursor

我想在一个循环中运行查询。有两个表,我想从一个表中获取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;

1 个答案:

答案 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;