Oracle 的定时任务管理还是蛮有意思的,尤其是用DBMS_JOB这个老牌包来搞自动化,挺适合应对一些周期性的数据需求。创建任务只要一个SUBMIT,定好时间间隔、写好执行逻辑,就能让它自己跑,嗯,响应也快,代码也简单。

像下面这样,你只要写一段小脚本,就能把MY_Procedure挂上作业队列:

variable job_num number;
begin
  dbms_job.submit(:job_num, 'MY_Procedure;', sysdate, 'sysdate+1');
  commit;
end;

任务有变?可以用CHANGE方法随时调整时间或逻辑,挺灵活的。甚至直接用RUN让它马上跑。删除任务也是一句话的事,REMOVE走起。对了,所有作业信息都能从USER_JOBS里查出来,还挺直观的。

如果你每天固定时间执行,比如每天下午两点,配合trunc和时间加法就行:

trunc(sysdate+1)+14/24

记得,interval控制的是下一次什么时候执行,写得灵活点,系统帮你省不少事。如果设置成null,那就只跑一次,自动清理,挺适合临时任务。

另外,时间函数像SYSDATETRUNCNEXT_DAY这些,要用好才不会误触雷区。比如你去掉时分秒,就用:

select TRUNC(TO_DATE('2008-01 12:30:00', 'yyyy-mm-dd hh24:mi:ss')) from dual;

,这套方案不算新,但还挺管用。如果你做运维脚本、数据批,又不想搞太复杂,Oracle Job就是个省心又实用的小工具。