pl / sql中的过程

时间:2012-05-16 08:17:01

标签: sql oracle stored-procedures plsql

我面临这个问题的一个小问题..我做了我所知道的事情 如果你能帮助

a)创建一个过程'insert_History',将新记录插入'历史'表中 b)编写一个小的PL / SQL程序,调用“insert_History”程序,根据下面给出的事实插入三个记录:

我。 Mark Jackop于2009年5月4日获得雇佣,因为'SH-CLERK'在2009年6月4日获得了销售代表(Job_ID ='SA-REP')的新职位。假设前一个职位的结束日期是'31 / 05/2009'。

表:历史---> emp_id,start_date,end_date,job_id,dep_id
表:员工----> emp_id,name,job_id,dep_id

这就是我所做的!

create or replace
procedure insert_History(emp_id in integer , job_id in number) 
is 
begin 
update History
set ?????? = insert into history(.....) 
where employees.emp_id= emp_id;
end;

1 个答案:

答案 0 :(得分:0)

首先,我会将你的工作放入包装中,因为这样可以使事情井井有条,更容易阅读/调用,并且让我们更容易回去并记住事情是如何运作的(因为我知道在不看之后几个月的过程我会忘记它究竟是做什么的。)我可以想象一下,当它的所有代码只是堆积在几乎没有解释它如何工作的程序时,试图对某人的代码进行逆向工程的噩梦。你不只是在一个类中创建一个java / oop程序!

另外一个侧面说明,使用包只是一个很好的做法,养成做的习惯,并确保你从代码中剔除废话来解释它的作用。

注意看起来并纠正我,如果我错了指示要你插入不更新3条记录。此外,它似乎不仅仅需要emp_id和job_id(开始和结束日期以及dep_id。所以这些值需要通过程序获得。

  create or replace
    PACKAGE "history" AS 
       procedure insert_history(pEmp_id integer, pstart_date date, pend_date date, pJob_id number, pdep_id);
    end history;

create or replace 
package body "history" as 
 procedure insert_history(pEmp_id in integer, pstart_date in date, pend_date in date,               pJob_id in number, pdep_id in number)
 is 
 begin
   insert into history(emp_id , start_date , end_date , job_id, dep_id)
   values(pEmp_id, pstart_date, pend_date, pJob_id, pdep_id );
   commit;
 end insert_history;

这就是插入程序。现在您需要一些可以调用此过程的东西。在这里,我假设您从应用程序或应用程序中的更高级别获取这些日期,因此开始和结束日期以及emp名称作为参数进入。 所以我们只是创建这个和优秀的程序。

create or replace procedure call_insert_history(Pemp_name in varchar2(256), varchar2(256), Pstart_date in date, Pend_date in date)
is
Vemp_id number;
Vdep_id number;
Vjob_id number;
begin
--first get the emp_id, dep_id, job_id
select emp_id, dep_id, job_id into Vemp_id, Vdep_id, Vjob_id from employees where emp_name = Pemp_name;
--now call the insert_history procedure using the obtained variables.
history.insert_history(Vemp_id, Pstart_date, Pend_date, Vjob_id, Vdep_id);
end call_insert_history;

应该是它。

注意:

这只是我最好的猜测,我还没有测试过。我只是从相当含糊的方向走了我理解的东西。如果您没有从应用程序中获取这些值,则必须存储每个值,然后在不使用参数的情况下调用上述过程的其余部分。

希望这有助于或至少指出正确的方向!