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;
另外请注意,DATE
或 TIMESTAMP
本身没有任何格式。这些值存储为内部字节值,您看到的是根据当前会话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 下次运行日期的主要内容,如果未能解决你的问题,请参考以下文章
Oracle DBMS_SCHEDULER sysdate 参数
Oracle DBMS_Scheduler 每天上午 9:10 和 11:30 运行 DBMS_JOB
如何使用 dbms_scheduler 在 oracle 中禁用作业