今天工作中遇到了这样一个需求,觉得很有代表性,所以记录一下:
就是在oracle11g数据库中如何创建一个定时job,要求是:每天中午12点执行一次
首先公布正确的创建方式如下:
DECLARE
jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => jobno,
what => 'BEGIN prc_12am_daily; END;',
next_date => TRUNC(SYSDATE) + 12/24, -- 明天中午12点(12小时)
interval => 'TRUNC(SYSDATE) + 1 + 12/24' -- 每日中午12点(1天+12小时)
no_parse => FALSE -- 确保动态SQL被解析
);
COMMIT; -- 提交事务必须放在END;之后
END;
/
SQL>
PL/SQL procedure successfully completed
然后我分享一下在调试该job中学习到的一些oracle job知识:
刚开始我用如下命令:
3、创建定时job,每天中午12点执行一次
DECLARE
jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => jobno,
what => 'BEGIN prc_12am_daily; END;',
next_date => TRUNC(SYSDATE) + 12, -- 首次执行时间为当天中午12点
interval => 'TRUNC(SYSDATE) + 1 + 12', -- 每日中午12点执行(次日0点+12小时)
no_parse => FALSE -- 确保动态SQL被解析
);
COMMIT; -- 提交事务必须放在END;之后
END;
/
SQL>
PL/SQL procedure successfully completed
可是查询出来的job有问题,显示下次执行时间是12天后,而不是每天。
select * from dba_jobs WHERE what LIKE '%prc_12am_daily%';
查询结果:
JOB LOG_USER PRIV_USER SCHEMA_USER LAST_DATE LAST_SEC THIS_DATE THIS_SEC NEXT_DATE NEXT_SEC TOTAL_TIME BROKEN INTERVAL FAILURES WHAT NLS_ENV MISC_ENV INSTANCE
1 2682 APPS APPS APPS 2025/4/2 12:00:02 12:00:02 2025/4/15 00:00:00 454 N TRUNC(SYSDATE) + 1 + 12 0 BEGIN prc_12am_daily; END; NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA' NLS_CURRENCY='