【问题标题】:Oracle DBMS_SCHEDULE to run at 8am, 12pm, 4pm and 8pm every day of the weekOracle DBMS_SCHEDULER 在每周的每一天早上 8 点、中午 12 点、下午 4 点和晚上 8 点运行
【发布时间】:2020-01-26 07:28:24
【问题描述】:

我不确定如何使用 Oracle DBMS_SCHEDULER 解决问题。我被要求在以下位置运行特定的 PL/SQL 过程作业:

8AM, 12PM, 4PM and lastly at 8PM every day of the week 

然后在第二天的同一时间再次重新开始:8AM, 12PM, 4PM and lastly at 8PM

我知道我首先需要创建一个时间表,但不知道频率设置应该是什么,即:

dbms_scheduler.create_schedule( schedule_name   => 'MY_JOB',
                                repeat_interval => 'FREQ=DAILY;BYHOUR=8;BYMINUTE=00'
                                start_date      => SYSTIMESTAMP
                              );

【问题讨论】:

    标签: oracle plsql oracle11g dbms-scheduler


    【解决方案1】:

    您不必创建一个命名的 SCHEDULE(但如果您愿意,也可以这样做),您可以将重复间隔直接放在作业中:

    DBMS_SCHEDULER.CREATE_JOB (
       job_name        => ...
      ,start_date      => SYSTIMESTAMP
      ,repeat_interval => 'FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00'
    

    请注意,对于频率低于每日的工作,您必须考虑夏令时。 SYSTIMESTAMP 的时区是数据库服务器操作系统的时区,通常设置为静态 UTC 偏移量(例如 +02:00)。为了将夏令时考虑在内,此 UTC 偏移量每年更改两次。

    如果作业必须遵循夏令时调整,那么您必须为start_date 的时区指定区域名称。例如你可以做

    DBMS_SCHEDULER.CREATE_JOB (
       job_name        => ...
      ,start_date      => SYSTIMESTAMP AT TIME ZONE 'Europe/Zurich'
      ,repeat_interval => 'FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00'
    

    看看这个 PL/SQL 块,看看有什么不同。

    DECLARE
       next_run_date TIMESTAMP WITH TIME ZONE;
       start_date TIMESTAMP WITH TIME ZONE; 
    BEGIN
       DBMS_OUTPUT.PUT_LINE('Static UTC offset:');
       start_date := TIMESTAMP '2019-10-26 00:00:00 +02:00';
       FOR i IN 1..10 LOOP
          DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00', start_date, next_run_date, next_run_date);
          DBMS_OUTPUT.PUT_LINE(next_run_date AT LOCAL);
       END LOOP;
    
       DBMS_OUTPUT.PUT_LINE('Time zone region name:');
        next_run_date := NULL;
       start_date := TIMESTAMP '2019-10-26 00:00:00 Europe/Zurich';
       FOR i IN 1..10 LOOP
          DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=HOURLY;INTERVAL=1;BYHOUR=08,12,16,20;BYMINUTE=00', start_date, next_run_date, next_run_date);
          DBMS_OUTPUT.PUT_LINE(next_run_date AT LOCAL);
       END LOOP;
    
    END;
    
    Static UTC offset:
    2019-10-26 08:00:00.000 +02:00
    2019-10-26 12:00:00.000 +02:00
    2019-10-26 16:00:00.000 +02:00
    2019-10-26 20:00:00.000 +02:00
    2019-10-27 07:00:00.000 +01:00
    2019-10-27 11:00:00.000 +01:00
    2019-10-27 15:00:00.000 +01:00
    2019-10-27 19:00:00.000 +01:00
    2019-10-28 07:00:00.000 +01:00
    2019-10-28 11:00:00.000 +01:00
    
    Time zone region name:
    2019-10-26 08:00:00.000 +02:00
    2019-10-26 12:00:00.000 +02:00
    2019-10-26 16:00:00.000 +02:00
    2019-10-26 20:00:00.000 +02:00
    2019-10-27 08:00:00.000 +01:00
    2019-10-27 12:00:00.000 +01:00
    2019-10-27 16:00:00.000 +01:00
    2019-10-27 20:00:00.000 +01:00
    2019-10-28 08:00:00.000 +01:00
    2019-10-28 12:00:00.000 +01:00
    

    详情请见Repeat Intervals and Daylight Savings

    【讨论】:

    • 是否有超过 1 个支持的选项?我这边有 100 人对此表示赞同。
    • 我知道 bounites,但只有问了这个问题,我才能把它们给你。我的意思是说我非常喜欢你的回答,但除了点赞之外我什么都做不了。
    • @AnkitBajpai:任何人都可以提供赏金,只要他们有足够的代表,并且已经过去了两天。欢迎您为其他人的问题添加赏金。
    • 仍在查看您的回复@WernfriedDomscheit 但想问一下,如果我想暂停这个计划的作业并再次重新启动这个暂停的作业,需要什么?
    • @tonyf,你可以使用DBMS_SCHEDULER.DISABLEDBMS_SCHEDULER.ENABLE
    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多