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

Posted

技术标签:

【中文标题】oracle:使用 PL/sql 过程从另一个模式填充表【英文标题】:oracle: populate a table from another schema using PL/sql procedure 【发布时间】:2017-12-31 11:40:15 【问题描述】:

嗨,我是 pl/sql 的新手 :),这仅用于教育目的。 schama Dispatching 包括一个名为 Employes 的表。以及 PRF 架构,其中包括一个名为 ZONE 的表。

派遣:雇员(num_emp number,name 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;

单位是一个城镇,每个区域包含许多单位。以一种简单的方式,该过程不会插入数据,我不知道这是否是正确的方法。 (对不起我的英语:))。

【问题讨论】:

您是否提交了更改? 我迟到了,我想“e”是employees表的对象? 【参考方案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。

【讨论】:

谢谢您,先生,我从您那里学到了很多东西,尤其是关于使用控制语句。 是用“create type”创建的“e”吗? 在这种情况下,eEMPLOYEES 的所谓“别名”。在此查询中,它可以在您通常使用EMPLOYEES 的任何地方使用 - 因此,如您所见,编写查询的人写的是SELECT e.DESIGN_ZONE 而不是SELECT EMPLOYEES.DESIGN_ZONE。这只是引用EMPLOYEES的一种简短方式。 我明白,别名'e'只是一个指向员工表的指针,我可以在没有任何预先声明的情况下使用它,谢谢鲍勃。 我想从区域表和雇员表中填充 PRF : unit_d(num_unit number,design_unit varchar2,nbr_employes number, num_zone) ,问题是一个光标是否足够?我必须使用 join 或 group by。

以上是关于oracle:使用 PL/sql 过程从另一个模式填充表的主要内容,如果未能解决你的问题,请参考以下文章

如何从 11g Oracle (PL/SQL) 上的 URL 传递凭据和下载文件?

使用 PL/SQL 过程在 oracle 10g 中转储表

oracle SQL语句中怎么样调用存储过程

使用 Oracle 的块过程 PL/SQL

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

ORACLE PL/SQL:以最大执行时间调用外部 Oracle PL/SQL 过程