oracle:使用PL / sql过程从另一个模式填充表

时间:2017-12-31 11:40:15

标签: oracle

嗨,我是pl / sql中的新手:),这仅适用于教育事务。 schama 调度包括名为雇员。和 PRF 的模式,其中包含名为 ZONE 的表。

调度:雇员(num_emp编号,名称nvarchar2,design_unit varchar2,design_zone varchar2)  和 PRF:ZONE(num_zone number,design_zone varchar2,number_of_units number)。 问题是编写一个pl / sql过程来从Employes表填充ZONE表。这是我的程序:

create or replace procedure zoneD as

cursor   cur is select design_zone,design_unit from dispatching.employes group by design_zone,design_unit;  
varzone  cur%rowtype;



begin

open cur;

fetch cur into varzone;loop
exit when cur%notfound;

 insert into zone(num_zone,design_zone,nbr_of_unit) values (num_zone.nextval,varzone.design_zone,0);

 update zone set nbr_of_unit =( select count(design_unit) from dispatching.employes);

end loop;


close cur;


end zoneD;
该单位是一个城镇,每个区域包含许多单位。以一种简单的方式,程序不会插入数据,我不知道这是否是正确的方法。 (抱歉我的英文:))。

1 个答案:

答案 0 :(得分:1)

您似乎已连接为PRF并想要获取属于DISPATCHING用户的值。为了做到这一点,DISPATCHING必须在其EMPLOYEES表上授予(至少)SELECT到PRF:

-- connect as DISPATCHING
grant select on employees to prf;

一个过程(当你练习PL / SQL时)应该使用游标FOR循环,因为它比使用显式声明游标的循环更容易维护(因为你不需要声明它和变量(s)你需要存储它的值,打开它,担心什么时候退出循环,最后 - 关闭它。游标FOR循环为你做了所有这些(好的,除了编写一个SELECT语句,它与你声明显式游标时使用的语句相同)。

-- connect as PRF
create or replace procedure zoned as
begin
  -- cursor FOR loop - you can select both DESIGN_ZONE and count number of
  -- units so that you wouldn't have to update that value separately
  for cur_r in (select e.design_zone, count(*) number_of_units
                from dispatching.employees e  -- naming the owner which granted SELECT on its table to PRF user
                group by e.design_zone
               )
  loop
    insert into zone (num_zone, design_zone, number_of_units)
      values (num_zone.nextval, cur_r.design_zone, cur_r.number_of_units);
  end loop;
end;
/

应该这样做(除非我写错字)。

最后,如果可能的话,建议:正确格式化代码。你发布的那个是一个很难读的东西 - 没有缩进,太长的行(打破它们!),它只包含几行。想象一下当您拥有数千行代码时会发生什么 - 您希望调试哪些代码?在你完成代码后的一两个月内,你会忘记你做了什么以及为什么(所以评论它),并且 - 如果它没有格式化 - 你将会头疼。今天的GUI工具提供自动格式化,所以 - 使用它。否则,有免费的在线格式化程序,例如Instant SQL Formatter