我通过 DBMS_JOB 包创建了简单的工作(在 oracle 12.2 和 11.2 下测试)
begin
sys.dbms_job.submit(job => :job,
what => 'null;',
next_date => to_date('19-06-2020 22:26:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'trunc(sysdate,''MI'')+1/24/60');
commit;
end;
它应该每分钟运行一次(没有秒延迟)
然后我用
select last_date, last_sec, next_date, what,interval from all_jobs where job=:job
为了监控上次开始时间和下次开始时间,我每分钟抓取一次输出并将其放在下面的表格中。以下是作业运行的结果:
| LAST_DATE | LAST_SEC | NEXT_DATE | WHAT | INTERVAL |
| 2020-06-19 22:33:02 | 22:33:02 | 2020-06-19 22:34:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:34:07 | 22:34:07 | 2020-06-19 22:35:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:35:13 | 22:35:13 | 2020-06-19 22:36:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:36:18 | 22:36:18 | 2020-06-19 22:37:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:37:24 | 22:37:24 | 2020-06-19 22:38:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:38:30 | 22:38:30 | 2020-06-19 22:39:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:39:05 | 22:39:05 | 2020-06-19 22:40:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:40:10 | 22:40:10 | 2020-06-19 22:41:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:41:16 | 22:41:16 | 2020-06-19 22:42:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:42:21 | 22:42:21 | 2020-06-19 22:43:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:43:27 | 22:43:27 | 2020-06-19 22:44:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:44:02 | 22:44:02 | 2020-06-19 22:45:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:45:08 | 22:45:08 | 2020-06-19 22:46:00 | null; | trunc(sysdate,'MI')+1/24/60 |
嗯...NEXT_DATE
显示正确的时间,但LAST_DATE
/LAST_SEC
显示延迟的时间。开始作业时间的延迟不断从零增长到 30 秒:2、7、13、18、24、30。然后又从零开始:5、10、16、21、27,然后又是 2、8、...等等
为什么它每次都不完全在 :00 秒开始并且不断增长?如何在所需时间准确启动它?
通常,我不能将 DBMS_SCHEDULER 与日历语法一起使用。我需要根据我的复杂算法使用 pl/sql 函数精确计算下一个工作时间。
what
另外:如果您将参数设置为以下内容,则可以看到启动作业的相同延迟:
insert into my_table(last_date) values(sysdate);