Oracle DBMS 调度程序在周末的频率发生变化

标签 oracle oracle11g dbms-scheduler

我创建了一个 Oracle dbms 调度程序,每天早上 5 点、上午 10 点、下午 3 点和晚上 8 点执行一个过程。下面是调度程序代码

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 个小时才能执行。

如果有更好的方法来实现这一点,请指导我。

最佳答案

一种选择是使用嵌入式日历,以便您可以创建自己的日历表达式。

让我给你举个例子

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_CALC 计划运行,该计划是两种不同频率的组合。

当然,您始终可以创建两个作业,但在 11g 中没有创建不兼容的选项,这是 DBMS_SCHEDULER 12c 及以后版本中的一个对象,它会阻止一个作业在另一个作业完成之前启动。

我的建议,使用嵌入多个频率的日程日历

关于Oracle DBMS 调度程序在周末的频率发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63279854/

相关文章:

oracle - Oracle 中计划作业失败时发送通知电子邮件

database - 为什么where子句中无用的语句会降低sql查询速度?

Oracle dbms_scheduler - 对系统日期的更改使用react

sql-server - 使用乐观锁会出现死锁吗?

java - ORA-01017: 用户名/密码无效;使用 wss4j 时登录被拒绝

sql - SAS 中删除重复项类似于 Oracle 中的 ROW_NUMBER () 函数

java - 在 Spring 中使用 JPA 在 Oracle 上重复读取

oracle - 如何安排存储过程每天在特定时间运行?

oracle - 如何将 DBMS_OUTPUT.PUT_LINE 的输出重定向到文件?

oracle - 为什么这个包会泄漏打开的游标?