Как изменить задание оракула, чтобы оно запускалось каждые 12 часов

Мне нужно, чтобы задание выполнялось каждые 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; 

person Yoyo Tech    schedule 07.09.2020    source источник


Ответы (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>
person Littlefoot    schedule 07.09.2020
comment
И стоит отметить, что dbms_scheduler новее и поэтому предпочтительнее dbms_job. Синтаксис каландра dbms_scheduler гораздо более гибкий и интуитивно понятный. - person EdStevens; 08.09.2020
comment
Более того, поскольку процедуры dbms_jobs Oracle 19 внутренне вызывают dbms_scheduler: nofollow noreferrer">mikedietrichde.com/2019/05/24/ - person Sayan Malakshinov; 08.09.2020
comment
кстати, trunc(sysdate+1) возвращается на следующий день, так что это будет только один раз в день. Если вам нужно два раза в день, интервал в dbms_job должен быть trunc(sysdate, 'hh') + 12/24 + 30/(24*60) - person Sayan Malakshinov; 08.09.2020