问题描述
如果员工年龄超过60岁,我该如何编写一个pl / sql脚本来自动从员工表中删除记录?
解决方法
从我的角度来看,如果正确设置了数据模型,则无法执行此操作-数据库不允许这样做。
为什么?因为员工并不孤单。读取:它们仅在employee
表中不存在。他们为工作付费,有人检查了他们的出勤,他们使用某些设备来完成工作(有人记录了下来),等等。
这意味着employee
表是一个 master 表,而所有其他表(可能还有更多)都是它的明细。如果一切都按原样设置,那么在您庆祝Scott 60岁生日后尝试删除它时,就会违反 zillion 外键约束。所以-不,您将无法像这样从employee
表中删除他的记录。
但是,如果我们假设这是一个家庭作业问题,那么:数据库应该怎么知道Scott才60岁?不是。您必须编写一个程序来检查每个人的年龄,如果满足某些条件,则删除记录。例如:
create or replace procedure p_delete_60 is
begin
delete from employee
where months_between(trunc(sysdate),date_of_birth) / 12 >= 60;
end;
但是,您必须每天手动运行该过程。这远非“自动”。那么,为什么不指示数据库为您完成呢?怎么样?安排工作。您可以使用两个软件包:DBMS_JOB
和DBMS_SCHEDULE
。对于这样一个简单的任务,第一个将要做:
declare
l_job number;
begin
dbms_job.submit(job => l_job,what => 'p_delete_60;',next_date => trunc(sysdate) + 1,interval => 'trunc(sysdate) + 1'
);
commit;
end;
/
检查作业是否存在:
SQL> select job,last_date,next_date,what from user_jobs;
JOB LAST_DATE NEXT_DATE WHAT
---------- ------------------- ------------------- --------------------
121 04.09.2020 00:00:00 p_delete_60;
SQL>
现在,您只需要等到午夜才能看到发生了什么。也许 something (如果某人年满60岁,或者-在第一次运行过程中-已经超过60岁),也许 thingthing (如果每个人都小于60岁)。 >