【问题标题】:How to alter oracle job to run every 12hrs如何将 oracle 作业更改为每 12 小时运行一次
【发布时间】:2020-12-26 05:59:14
【问题描述】:

我需要每 12 小时运行一次以下作业(例如:作业需要在每天上午 12:30 和下午 12:30 运行)请人帮忙

代码:

BEGIN
SYS.DBMS_JOB.CHANGE
(
job => 123
,what => 'SP_ABC;'
,next_date => TO_DATE('08/09/2020 00:30:00','dd/mm/yyyy hh24:mi:ss')
,INTERVAL => 'TRUNC(sysdate+1)+30/1440'
);
END;
/
COMMIT; 

【问题讨论】:

    标签: oracle oracle11g job-scheduling dbms-scheduler dbms-job


    【解决方案1】:

    应该是这样的:

    SQL> set serveroutput on
    SQL> declare
      2    l_job number;
      3  begin
      4    dbms_job.submit
      5      (job       => l_job,
      6       what      => 'p_test;',
      7       next_date =>  trunc(sysdate + 1) +  0/24 + 30/(24*60),
      8       interval  => 'trunc(sysdate + 1) + 12/24 + 30/(24*60)'
      9      );
     10    commit;
     11    dbms_output.put_line('job number = ' || l_job);
     12  end;
     13  /
    job number = 151
    
    PL/SQL procedure successfully completed.
    
    SQL> select job, last_date, next_date from user_jobs;
    
           JOB LAST_DATE           NEXT_DATE
    ---------- ------------------- -------------------
           151                     08.09.2020 00:30:00
    
    SQL>
    

    或者,如果你切换到DBMS_SCHEDULER

    SQL> begin
      2    sys.dbms_scheduler.create_job
      3      (job_name            => 'test',
      4       job_type            => 'plsql_block',
      5       job_action          => 'begin p_test; end;',
      6       start_date          =>  sysdate,
      7       repeat_interval     => 'freq=daily; byhour=0,12; byminute=30',
      8       enabled             => true
      9      );
     10  end;
     11  /
    
    PL/SQL procedure successfully completed.
    
    SQL> select repeat_interval, next_run_date from user_scheduler_jobs;
    
    REPEAT_INTERVAL                          NEXT_RUN_DATE
    ---------------------------------------- ----------------------------------------
    freq=daily; byhour=0,12; byminute=30     08.09.20 00:30:05,000000 +02:00
    
    SQL>
    

    【讨论】:

    • 值得指出的是 dbms_scheduler 更新,因此比 dbms_job 更可取。 dbms_scheduler 的日历语法更加灵活和直观。
    • 另外,由于Oracle 19 dbms_jobs过程内部调用dbms_scheduler:mikedietrichde.com/2019/05/24/…
    • 顺便说一句,trunc(sysdate+1) 第二天返回,所以每天只有一次。如果一天需要两次,dbms_job 中的时间间隔应该是trunc(sysdate, 'hh') + 12/24 + 30/(24*60)
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2018-07-08
    • 2018-10-17
    相关资源
    最近更新 更多