在 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>';