这就是我对问题的理解。
样本数据:
SQL> select * from passwordresetlink
2 order by date_created;
ID DATE_CREATED
---------- ---------------
1 10.06.2021
2 14.06.2021
程序应该删除超过 2 天的行;现在,可以对其进行修改,使其包含 time 组件,或者 - 就像在我的示例中一样 - 将其设置为 midnight,但这并不重要。
SQL> create or replace procedure p_del_resetlink
2 is
3 begin
4 delete from passwordresetlink
5 where date_created < trunc (sysdate) - 2;
6 end;
7 /
Procedure created.
这就是您的问题的答案,即如何“自动触发”该程序。创建数据库作业。我在 11g 上,这是 DBMS_JOB 示例,因为任务非常简单 - 每天运行一次该过程。我将它设置为凌晨 3 点(所以是的,这是夜间工作)。考虑改用DBMS_SCHEDULER。
SQL> set serveroutput on
SQL> declare
2 newjobid number;
3 begin
4 sys.dbms_job.submit (
5 job => newjobid,
6 what => 'p_del_resetlink;',
7 next_date => to_date ('16.06.2021 03:00:00', 'DD.MM.YYYY HH24:MI:SS'),
8 interval => 'TRUNC(SYSDATE + 1) + 3/24',
9 no_parse => false);
10 sys.dbms_output.put_line ('Job Number is: ' || to_char (newjobid));
11 commit;
12 end;
13 /
Job Number is: 2983310
PL/SQL procedure successfully completed.
好的,让我们手动运行它:
SQL> exec dbms_job.run(2983310);
PL/SQL procedure successfully completed.
SQL> select * from passwordresetlink;
ID DATE_CREATED
---------- ---------------
2 14.06.2021
SQL>
看起来不错;超过 2 天前创建的行现已删除。
这份工作本身看起来如何?
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';
Session altered.
SQL> select job, what, last_date, next_date from user_jobs where job = 2983310;
JOB WHAT LAST_DATE NEXT_DATE
---------- -------------------- ---------------- ----------------
2983310 p_del_resetlink; 15.06.2021 09:19 16.06.2021 03:00
SQL>
最后一次执行是在几分钟前(今天 09:19),下一次执行将在明天 03:00(之后的每一天,再次执行 03:00)。