DBMS_SCHEDULER.create_job 自动触发的BUG

Scheduler Job Runs Immediately After Enable When Using PL/SQL-expression (Doc ID 2420041.1)

APPLIES TO:

Oracle Database - Enterprise Edition - Version 11.2.0.4 to 18.1.0.0.0 [Release 11.2 to 18]

Oracle Database Cloud Schema Service - Version N/A and later

Oracle Database Exadata Cloud Machine - Version N/A and later

Oracle Cloud Infrastructure - Database Service - Version N/A and later

Oracle Database Cloud Exadata Service - Version N/A and later

Information in this document applies to any platform.

SYMPTOMS

A job created using DBMS_SCHEDULER, runs automatically after it is enabled, when REPEAT_INTERVAL is calculated by a function (repeat_interval =>'nextExecution',).

The job runs after it is enabled even if the NEXT_RUN_DATE is in the future.

  1. Create a table named testJobTab

SQL> create table testJobTab ( insertdate date);

  1. Create a procedure to insert into the table

SQL> create or replace procedure testJobinsert

is

BEGIN

insert into testJobTab (insertdate) values ( sysdate);

END;

/

  1. Create a function to calculate the date

SQL> create or replace function nextExecution

return date

is

BEGIN

return trunc(sysdate + 10);

END;

/

  1. make sure the table is empty

SQL> truncate table testJobTab;

  1. Create a job (disabled)

SQL> BEGIN

DBMS_SCHEDULER.create_job (

job_name => 'TESTJOB',

job_type => 'PLSQL_BLOCK',

job_action => 'BEGIN testJobinsert; commit; END;',

start_date => systimestamp at TIME zone 'EUROPE/BERLIN',

repeat_interval => 'nextExecution',

end_date => NULL,

enabled => FALSE,

comments => 'TESTJOB'

);

END;

/

  1. check the table

SQL> select * from testJobTab;

no rows selected

  1. check user_scheduler_jobs

SQL> set lines 300

SQL> col start_date for a50

SQL> col last_start_date for a50

SQL> col next_run_date for a50

SQL> col repeat_interval for a25

SQL> select start_date,run_count,last_start_date,next_run_date,enabled,schedule_type,repeat_interval from user_scheduler_jobs where job_name = 'TESTJOB';

START_DATE RUN_COUNT LAST_START_DATE

NEXT_RUN_DATE

ENABL SCHEDULE_TYP REPEAT_INTERVAL





13-MAR-18 08.45.52.057030 AM EUROPE/BERLIN 0

FALSE PLSQL nextExecution

  1. enable the job

SQL> exec DBMS_SCHEDULER.ENABLE('TESTJOB');

  1. check the table (job started after it was ENABLED)

SQL> select * from testJobTab;

INSERTDATE


13-MAR-2018 07:47:01

  1. check user_scheduler_jobs

There is a difference of 10 days between START_DATE/LAST_START_DATE and NEXT_RUN_DATE. LAST_START_DATE and RUN_COUNT confirms that the job has run.

SQL> select start_date,run_count,last_start_date,next_run_date,enabled,schedule_type,repeat_interval from user_scheduler_jobs where job_name = 'TESTJOB';

START_DATE RUN_COUNT LAST_START_DATE

NEXT_RUN_DATE

ENABL SCHEDULE_TYP REPEAT_INTERVAL





13-MAR-18 08.45.52.057030 AM EUROPE/BERLIN 1 13-MAR-18

08.47.01.342411 AM EUROPE/BERLIN 23-MAR-18 12.00.00.000000 AM +00:00

TRUE PLSQL nextExecution

  1. disable the job

SQL> exec DBMS_SCHEDULER.DISABLE('TESTJOB');

  1. check the table (the job did not run after it was DISABLED)

SQL> select * from testJobTab;

INSERTDATE


13-MAR-2018 07:47:01

  1. check user_scheduler_jobs

No modifications to RUN_COUNT, LAST_START_DATE and NEXT_RUN_DATE.

SQL> select start_date,run_count,last_start_date,next_run_date,enabled,schedule_type,repeat_interval from user_scheduler_jobs where job_name = 'TESTJOB';

START_DATE RUN_COUNT LAST_START_DATE

NEXT_RUN_DATE

ENABL SCHEDULE_TYP REPEAT_INTERVAL





13-MAR-18 08.45.52.057030 AM EUROPE/BERLIN 1 13-MAR-18

08.47.01.342411 AM EUROPE/BERLIN 23-MAR-18 12.00.00.000000 AM +00:00

FALSE PLSQL nextExecution

  1. enable the job again

SQL> exec DBMS_SCHEDULER.ENABLE('TESTJOB');

  1. check the table (notice that the job has run again)

SQL> select * from testJobTab;

INSERTDATE


13-MAR-2018 07:47:01

13-MAR-2018 07:53:32

  1. check user_scheduler_jobs

SQL> select start_date,run_count,last_start_date,next_run_date,enabled,schedule_type,repeat_interval from user_scheduler_jobs where job_name = 'TESTJOB';

START_DATE RUN_COUNT LAST_START_DATE

NEXT_RUN_DATE

ENABL SCHEDULE_TYP REPEAT_INTERVAL





13-MAR-18 08.45.52.057030 AM EUROPE/BERLIN 1 13-MAR-18

08.53.32.442546 AM EUROPE/BERLIN 23-MAR-18 12.00.00.000000 AM +00:00

TRUE PLSQL nextExecution

  1. drop the job

SQL> exec DBMS_SCHEDULER.drop_job ('TESTJOB');

SQL> drop table testJobTab purge;

SQL> drop function nextExecution;

SQL> drop procedure testJobinsert;

If REPEAT_INTERVAL is used with FREQ and INTERVAL (repeat_interval => 'FREQ=Minutely;INTERVAL=30'), the job does not run when is enabled which is the expected behavior.

CHANGES

CAUSE

This is caused by

BUG 27697734 - SCHEDULER JOB RUNS IMMEDIATELY AFTER DISABLE/ENABLE WHEN USING PL/SQL-EXPRESSION

SOLUTION

The BUG 27697734 - is regressed and tracking in Bug 28174090

Bug 28174090 - IMPDP FAILS WITH ORA-12005 WHEN USING JOBS HAVING PL/SQL REPEAT_INTERVAL

Download the Patch 28174090 from MOS and apply the Patch 28174090 to your current release and platform.

相关推荐
05大叔30 分钟前
微服务Day01 MP
数据库·oracle
问今域中1 小时前
使用 JWT 升级 Spring Security 登录认证系统的两个关键问题与解决方案
数据库·sql·oracle
l1t1 小时前
将追赶法求连续区间的Oracle SQL改写成DuckDB
数据库·sql·oracle·duckdb
聆风吟º10 小时前
Oracle到KingbaseES数据库迁移:全流程实战指南与避坑总结
数据库·oracle·数据库迁移·kingbasees
哈__10 小时前
Oracle至KingbaseES数据库迁移全攻略:痛点拆解、配置实操与问题排查
数据库·oracle
知识分享小能手11 小时前
Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)
数据库·学习·oracle
颜颜yan_12 小时前
Oracle 迁移到 KingbaseES 实战:从评估到追平的一套可落地流程
数据库·oracle
砚边数影12 小时前
Oracle迁移替换实战:金仓数据库如何破解企业数据迁移难题
数据库·oracle·kingbase·kingbasees·数据库平替用金仓·金仓数据库
Pocker_Spades_A13 小时前
Oracle向KingbaseES迁移:核心痛点拆解与根源分析
数据库·oracle
檀越剑指大厂16 小时前
迁移之路的隐形陷阱:破解Oracle数据库国产化替代的核心痛点与策略
数据库·oracle