如果员工年龄超过 60 岁,如何编写 pl/sql 脚本自动删除员工 table 的记录?

How do I write a pl/sql script that automatically deletes a record from the employee table if the employee age exceeds 60 years?

如果员工年龄超过 60 岁,如何编写 pl/sql 脚本自动删除员工 table 的记录?

从我的角度来看,如果数据模型设置正确,你不能这样做——数据库不允许。

为什么?因为员工在宇宙中并不孤单;阅读:它们不仅仅存在于 employee table 中。他们的工作是有报酬的,有人检查他们的出勤情况,他们使用某些设备来完成他们的工作(并且有人记录下来)等等

这意味着 employee table 是 master table,而所有其他(可能还有更多)是它的详情。如果一切都按应有的方式设置,则存在 zillion 外键约束,如果您在 Scott 庆祝 60 岁生日后尝试将其删除,就会违反这些约束。所以 - 不,你不能像那样从 employee table 中删除他的记录。


不过,如果我们假设这是某种 家庭作业 问题,那么:数据库应该如何知道斯科特今天刚满 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_JOBDBMS_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 岁),也许 nothing(如果每个人都不到 60 岁)。