【问题标题】:DBMS_SCHEDULER next run dateDBMS_SCHEDULER 下次运行日期
【发布时间】: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”格式的日期,从先前准备的表格或确定何时需要开始工作的函数中替换?

【问题讨论】:

    标签: oracle oracle19c dbms-scheduler


    【解决方案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 分钟运行一次的新作业中

      【讨论】:

        猜你喜欢
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 2013-08-14
        • 2012-11-07
        • 2018-02-01
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多