嗨,我是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;
该单位是一个城镇,每个区域包含许多单位。以一种简单的方式,程序不会插入数据,我不知道这是否是正确的方法。 (抱歉我的英文:))。
答案 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。