Oracle Изменение частоты планировщика СУБД по выходным - PullRequest
2 голосов
/ 06 августа 2020

Я создал планировщик oracle dbms для выполнения процедуры ежедневно в 05:00, 10:00, 15:00 и 20:00. Ниже приведен код планировщика

DBMS_SCHEDULER.CREATE_JOB
(
   job_name        => 'TEST_JOB'
  ,start_date      => SYSDATE
  ,repeat_interval => 'FREQ=DAILY; BYHOUR=05,10,15,20; BYMINUTE=00 ;BYSECOND=0;'
  ,end_date        => NULL
  ,job_class       => 'DEFAULT_JOB_CLASS'
  ,job_type        => 'PLSQL_BLOCK'
  ,enabled         => TRUE
  ,job_action      => 'BEGIN INSERT_IN_TABLE; END;'
  ,comments        => 'TEST JOB'
);

. Теперь мне нужно изменить тот же планировщик, чтобы выполнить ту же процедуру только дважды по выходным и с той же периодичностью в будние дни.

Я не хочу чтобы создать другой планировщик для выполнения на выходных, потому что иногда процедура занимает более 5 часов.

Пожалуйста, помогите мне, если есть лучший способ добиться этого.

1 Ответ

2 голосов
/ 06 августа 2020

Одним из вариантов может быть использование встроенных календарей, чтобы вы могли создать собственное календарное выражение.

Позвольте мне показать вам пример

SQL> BEGIN
dbms_scheduler.create_schedule('my_schedule_c_1', repeat_interval =>
  'FREQ=DAILY; BYHOUR=05,10,15,20; BYMINUTE=00; BYSECOND=00; ');
dbms_scheduler.create_schedule('my_schedule_c_2', repeat_interval =>
  'FREQ=DAILY; BYDAY=SAT,SUN; BYHOUR=05,10; BYMINUTE=00; BYSECOND=00;');
END;
/  2    3    4    5    6    7

PL/SQL procedure successfully completed.

SQL> begin
   DBMS_SCHEDULER.create_schedule ('MY_CALC', repeat_interval =>'my_schedule_c_1, my_schedule_c_2');
END;
/  2    3    4

PL/SQL procedure successfully completed.

SQL>

Затем вам нужно только применить это расписание для вашего задания

SQL> begin
  2  DBMS_SCHEDULER.CREATE_JOB
(
   job_name        => 'TEST_JOB'
  ,start_date      => SYSDATE
  3    ,repeat_interval => 'MY_CALC'
  4    ,end_date        => NULL
  ,job_class       => 'DEFAULT_JOB_CLASS'
  ,job_type        => 'PLSQL_BLOCK'
  5    6    7    8    9   10    ,enabled         => TRUE
  ,job_action      => 'BEGIN NULL; END;'
  ,comments        => 'TEST JOB'
); 11   12   13
 14  end;
 15  /

PL/SQL procedure successfully completed.

SQL>

Таким образом, мое задание будет выполняться с использованием расписания MAIN_CAL C, которое представляет собой комбинацию двух разных частот.

Конечно, вы можете всегда создавайте два задания, но в 11g нет возможности создавать несовместимости, что является объектом в DBMS_SCHEDULER 12 c и далее, который не позволяет запускать задание до тех пор, пока другое не будет завершено.

Мой совет, используйте календарь расписания, встроенный с несколькими частотами

...