DBMS_SCHEDULER 下次运行日期

Posted

技术标签:

【中文标题】DBMS_SCHEDULER 下次运行日期【英文标题】:DBMS_SCHEDULER next run date 【发布时间】:2021-12-18 16:12:46 【问题描述】:

美好的一天。 一点背景... 有一个 Oracle 12.2 数据库。 它使用了 DBMS_JOBS 包并使用了表达式 dbms_job.next_date (job, nvl (datetime, sysdate)); 最近将数据库迁移到 Oracle 19 请告诉我如何在 DBMS_SCHEDULER 中出现下一个作业开始? 是否可以更新下一次发布的日期,将日期替换为“DD.MM.YYYY HH24: MI: SS”格式的日期,从先前准备的表格或确定何时需要开始工作的函数中替换?

【问题讨论】:

【参考方案1】:

在 DBMS_SCHEDULER 中,您甚至可以创建复杂的计划时间,参见示例 calculate hours based on business hours in Oracle SQL

你如何运行dbms_job.next_date?也许不用设置作业的开始时间,只需使用 DBMS_SCHEDULER.RUN_JOB(job_name, FALSE); 手动执行作业即可。

或者创建一个没有开始时间的Scheduler Job

BEGIN
    DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => '<job_name>'
      ,start_date      => NULL
      ,repeat_interval => NULL
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      => '<PL/SQL procedure>'
    );
    DBMS_SCHEDULER.SET_ATTRIBUTE
    ( NAME      => '<job_name>'
     ,attribute => 'AUTO_DROP'
     ,VALUE     => FALSE);
END;

然后设置你喜欢运行的开始时间:

BEGIN
  DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => '<job_name>'
     ,attribute => 'START_DATE'
     ,value     => TIMESTAMP '2021-11-05 12:30:00');
END;

另外请注意,DATETIMESTAMP 本身没有任何格式。这些值存储为内部字节值,您看到的是根据当前会话NLS_DATE_FORMAT/NLS_TIMESTAMP_FORMAT 的(默认)输出格式。您应该切勿将日期/时间值存储为字符串,这是设计缺陷。

如果您只是想知道,下次您的作业何时运行,请运行以下查询:

SELECT JOB_NAME, START_DATE, END_DATE, LAST_START_DATE, NEXT_RUN_DATE
FROM ALL_SCHEDULER_JOBS
WHERE JOB_NAME = '<job_name>';

【讨论】:

【参考方案2】:

据我所知,那里没有next_date。调度程序使用(如documentation 所说)

丰富的日历语法,让您能够定义重复的日程安排,例如“每周二和周五下午 4:00”。或“每个月的第二个星期三”。此日历语法用于许多包子程序的 repeat_interval 参数中的日历表达式。

据此,我不确定您是否可以轻松地将存储在表格中的日期“转换”为这样的日历

不过,您可以调度一个只运行一次的作业,一次从您的表中获取,并将其用作调度程序的 start_date 参数。

【讨论】:

有一个想法是创建一个单独的作业并更新 START_DATE,但据我了解这并不完全正确.. BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE ('DBMS_JOB$_'||svc.get_setting('PLANNER_JOB'),'start_date',to_date(app_plan.svc.get_setting('PLANNER_NEXT_TIME'),'DD.MM .YYYY HH24:MI:SS')); DBMS_SCHEDULER.enable('DBMS_JOB$_'||svc.get_setting('PLANNER_JOB'));结束;【参考方案3】:

因此,我做了以下操作:Created,其中下一个作业开始的时间是从调优表中获取的。

 
.....................
    declare
    planner_time DATE :=to_date(app_plan.svc.get_setting('PLANNER_NEXT_TIME'),'DD.MM.YYYY HH24:MI:SS');
.....................        
        IF SYSDATE> = planner_time
    THEN
    dbms_scheduler.run_job (job_name => JOB_NAME || PLANNER_ID);
    END IF;
.....................

我将这个程序放在每 2 分钟运行一次的新作业中

【讨论】:

以上是关于DBMS_SCHEDULER 下次运行日期的主要内容,如果未能解决你的问题,请参考以下文章

dbms_scheduler vs dbms_job

Oracle DBMS_SCHEDULER sysdate 参数

Oracle DBMS_Scheduler 每天上午 9:10 和 11:30 运行 DBMS_JOB

如何使用 dbms_scheduler 在 oracle 中禁用作业

DBMS_SCHEDULER.set_job_argument_value - ORA-27473: 参数不存在

带有 dbms_scheduler 的嵌套链,无法控制步骤的顺序