修改Oracle Job实现每日23:00至次日05:35每5秒执行
如何配置Oracle Scheduler作业每日在指定时间段内按固定间隔重复执行?
你的问题核心在于之前的配置用了固定的单次起止时间(start_date和end_date),所以作业只会运行一个周期就停止了。要实现每日重复在23:00-次日05:35每5秒执行一次,我们需要调整repeat_interval的表达式,并移除固定的end_date(或者设置一个长期的结束日期)。
正确的配置方案
下面是直接可用的SQL代码,我会一步步解释每个部分的作用:
1. 先清除之前的固定end_date设置
如果之前设置了单次的end_date,先把它清空,让作业可以每日重复:
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'test_job', attribute => 'end_date', value => NULL ); END; /
2. 设置start_date和最终的repeat_interval
这里我们用repeat_interval同时指定5秒执行间隔、每日重复和时间范围限制:
BEGIN -- 设置第一次执行的起始时间(可以是任意未来的23:00,Oracle会从这天开始每日重复) DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'test_job', attribute => 'start_date', value => TO_TIMESTAMP_TZ('2024-01-01 23:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR') ); -- 核心配置:每日在23:00-次日05:35之间每5秒执行一次 DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'test_job', attribute => 'repeat_interval', value => 'FREQ=SECONDLY;INTERVAL=5; BETWEEN TIME ''23:00:00'' AND TIME ''05:35:00''' ); END; /
配置解释
FREQ=SECONDLY;INTERVAL=5:指定作业每5秒执行一次的基础规则BETWEEN TIME ''23:00:00'' AND TIME ''05:35:00'':限制执行时间在每日23:00到次日05:35之间,Oracle会自动处理跨午夜的时间范围,不需要额外配置跨天逻辑start_date:设置第一次启动的时间,之后Oracle会按照repeat_interval的规则每日重复这个周期
关于duration参数的说明
你提到的duration参数其实不是用来控制每日执行时间段的——它是用来限制单个作业实例的运行时长(比如某个作业实例启动后,最多运行多久就强制终止)。在你的场景里,我们需要的是作业在指定时间段内重复触发多次,所以duration并不是正确的选择,用repeat_interval的时间范围限制才是最优解。
可选:设置作业的全局结束日期
如果你希望作业在未来某个日期自动停止,可以重新设置end_date,比如让它在2024年底停止:
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'test_job', attribute => 'end_date', value => TO_TIMESTAMP_TZ('2024-12-31 23:59:59.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR') ); END; /
内容的提问来源于stack exchange,提问作者GomuGomuZoro
相关产品推荐
相关产品推荐

