【问题标题】:Alter an oracle job to run every 5 seconds from a specific time till a specific time everyday将 oracle 作业更改为从特定时间到每天特定时间每 5 秒运行一次
【发布时间】:2018-07-08 06:07:35
【问题描述】:

编辑:我需要每天在该窗口中每 5 秒从晚上 11 点到凌晨 5:35 运行以下作业。

所以,到目前为止,我所做的是将以下设置为每 5 秒运行一次。

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
    attribute => 'repeat_interval',
    value => 'freq=secondly;bysecond=5;'
);

END;

然后是 start_date 和 end_date,使其从今天晚上 9 点运行到明天早上 5 点 35 分。

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
    attribute => 'start_date',
    value => TO_TIMESTAMP_TZ('2018-01-29 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR')
);

END;

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE (
    name => 'test_job',
   attribute => 'end_date',
    value => TO_TIMESTAMP_TZ('2018-01-30 05:35:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR')
);

END;

现在的问题是这将运行一次。我不确定如何在不放弃每 5 秒规则的情况下让它每天运行。我假设我可能需要使用 start_date 和 duration 并省略 end_date 来实现我的目标,尽管我不确定如何指定持续时间。

【问题讨论】:

    标签: oracle plsql dbms-scheduler


    【解决方案1】:

    您可以创建这样一个作业,调用名为pr_test 的存储过程,每五秒执行一次操作:

    begin
    dbms_scheduler.create_job (
       job_name           =>  'test_job',
       job_type           =>  'STORED_PROCEDURE',
       job_action         =>  'pr_test',
       start_date         =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR'),
       end_date           =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR') + (17/48), -- 8.5 hours
       repeat_interval    =>  'freq=secondly; interval=5;',
       enabled            =>  true); 
    end;
    /
    

    如果您希望您的调度程序作业每天运行,结束时间和间隔定义会更加复杂(将今天的日期视为开始),如果没有 end_date,这将持续到第二天早上 06:00:

    begin
    dbms_scheduler.create_job (
       job_name           =>  'test_job',
       job_type           =>  'STORED_PROCEDURE',
       job_action         =>  'pr_test',
       start_date         =>  TO_TIMESTAMP_TZ('2018-01-30 21:00:00.000000000 EUROPE/BERLIN','YYYY-MM-DD HH24:MI:SS.FF TZR'),
       repeat_interval    =>  'freq=secondly;interval=5;byhour=21,22,23,0,1,2,3,4,5;byday=tue,wed,thu,fri,sat,sun,mon;',
       enabled            =>  true); 
    end;
    /
    

    并且可以从这个视图跟踪:

    select * 
      from dba_scheduler_job_log l
     where l.job_name = 'TEST_JOB'
     order by l.log_date desc;
    

    【讨论】:

    • 但这只会运行到 2018-01-30 05:35:00 对吗?我需要它每天从晚上 11 点到凌晨 5:35 运行,在那个窗口中每 5 秒运行一次。我不确定如何实现这一目标,或者是否有可能
    • @GomuGomuZoro 是的,确切地说,这会持续到 2018-01-30 05:35:00。请更新您的问题以包括日常选项。顺便说一句,在这种情况下 end_date 参数将毫无意义。
    • 已更新。是的,我正在尝试弄清楚如何编辑作业以使其每天运行,而不是使用让它只运行一次的结束日期。
    【解决方案2】:

    以下 PL/SQL 块创建一个轻量级作业。轻量级作业必须引用程序,并且程序类型必须是“PLSQL_BLOCK”或“STORED_PROCEDURE”。此外,该程序必须在您创建作业时已启用。

    查看示例供您参考。如果有帮助,请告诉我。

    BEGIN
          DBMS_SCHEDULER.CREATE_JOB (
           job_name         =>  'my_lightweight_job1',
           program_name     =>  'polling_prog_n2',
           repeat_interval  =>  'FREQ=SECONDLY;INTERVAL=5',
           end_date         =>  '30-JAN-18 05.35.00 AM',
           job_style        => 'LIGHTWEIGHT',
           comments         => 'Job that polls device n2 every 5 seconds');
        END;
        /
    

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2012-08-08
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多