oracle里for循环问题

sql小白,两张测试表user1,user2,里面表结构相同,8条数据,做一个将user1表数据插入到user2表数据,之前如果要全量移植表数据我一般这样写:insert into user2 select * from user1
clipboard.png

但看了下公司用的存储过程里是使用for循环写的,仿照在test库里写了一段如下

declare
begin
  for i in (select u_id, u_name, u_age, u_schoolid from user1 u1) 
   loop
    insert into user2 select i.u_id, i.u_name, i.u_age, i.u_schoolid from user1;
    commit;
  end loop;
end;

debug测试时发现,按我本来理解是6,7,8,1,2,3,4,5一次插入,反复8次,但在这里ID6的数据第一次就循环了8次??求解答

clipboard.png

阅读 4.2k
2 个回答

因为你的insert语句写得不对

insert into user2 select i.u_id, i.u_name, i.u_age, i.u_schoolid from user1;

你这样写,等同于把i插了N遍,N为user1的记录数。
而且你外层又循环了N遍,结果就是你把user1表的每条记录都插了8遍

你要这么写才是对的:

insert into user2 select i.u_id, i.u_name, i.u_age, i.u_schoolid from dual;

要不就正常点,既然你是一行一行的读,那你就一行一行的插

insert into user2 (u_id,u_name,u_age,u_schoolid)
values(i.u_id, i.u_name, i.u_age, i.u_schoolid);

循环中一般用INSERT ... VALUES ...的方法

没用特殊的逻辑,就不用在存储过程中自己用循环语句操作了,效率低,写起来还麻烦。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进