执行Oracle 中 Job 的定时排程执行技巧(oracle中job定时)
执行Oracle 中 Job 的定时排程执行技巧
在Oracle 数据库中,Job 是一种非常有用的工具,可以用来定时执行一些重复性的任务,或者是周期性的任务。Job 可以在数据库服务器上执行,非常方便,而且可以在一定程度上自动化一些数据库管理的工作。本文将介绍如何使用 Oracle 中的 Job 工具进行定时排程执行,并且给出一些实用技巧。
一、创建 Job
要使用 Job 工具,首先需要在数据库中创建一个 Job。使用如下 SQL 语句可以创建一个 Job:
BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => 'my_job',
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN MY_PROCEDURE; END;',
start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
end_date => NULL, enabled => TRUE,
comments => 'This is a test job.');END;
上述代码中创建了一个名为 my_job 的 Job,类型为 PLSQL_BLOCK,表示执行一个 PL/SQL 块。块中执行的具体内容可以在 job_action 参数中指定。start_date 指定了 Job 开始时间,repeat_interval 制定了 Job 的重复执行间隔,end_date 制定了 Job 的结束时间。enabled 参数表示该 Job 是否启用,如果为 FALSE,则不会执行该 Job。
二、修改 Job
有时候需要修改已经创建的 Job,可以使用 ALTER_JOB 语句来修改 Job 的相关配置信息,例如重复执行间隔、开始时间、结束时间、启用状态等:
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'my_job',
attribute => 'repeat_interval', value => 'FREQ=MINUTELY; INTERVAL=5');
DBMS_SCHEDULER.SET_ATTRIBUTE ( name => 'my_job',
attribute => 'enabled', value => FALSE);
END;
上述代码中先使用 SET_ATTRIBUTE 函数来修改 my_job Job 的重复执行间隔为每 5 分钟执行一次,然后将该 Job 禁用。
三、删除 Job
如果需要删除 Job,可以使用 DROP_JOB 语句,如下所示:
BEGIN
DBMS_SCHEDULER.DROP_JOB ('my_job');END;
上述代码中删除了名为 my_job 的 Job。
四、查询 Job
如果需要查询 Job 的相关信息,可以使用如下语句查询:
SELECT * FROM dba_scheduler_jobs WHERE job_name = 'my_job';
上述语句会查询出所有名为 my_job 的 Job 的相关信息。
五、Job 的定时排程执行技巧
在使用 Job 工具时,有一些技巧可以帮助实现更加灵活和高效的定时排程执行,以下是一些常用技巧:
1. 使用 FREQ 和 INTERVAL 参数
在创建 Job 时,可以使用 FREQ 和 INTERVAL 参数来制定 Job 的定时排程。例如下面的代码指定了该 Job 每天执行一次:
BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => 'my_job',
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN MY_PROCEDURE; END;',
start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DLY; INTERVAL=1',
end_date => NULL, enabled => TRUE,
comments => 'This is a test job.');END;
其他常用的 FREQ 和 INTERVAL 参数包括:
– HOURLY:每小时执行一次;
– MINUTELY:每分钟执行一次;
– SECONDLY:每秒钟执行一次;
– BYHOUR=n:在第 n 小时执行;
– BYMINUTE=n:在第 n 分钟执行;
– BYSECOND=n:在第 n 秒执行。
2. 使用 START_DATE 和 END_DATE
在创建 Job 时,可以使用 START_DATE 和 END_DATE 参数来制定 Job 的开始时间和结束时间。在 START_DATE 之前和 END_DATE 之后,该 Job 不会执行。例如下面的代码指定了该 Job 从 2022 年 1 月 1 日开始执行,到 2022 年 12 月 31 日结束执行:
BEGIN
DBMS_SCHEDULER.CREATE_JOB ( job_name => 'my_job',
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN MY_PROCEDURE; END;',
start_date => TO_DATE('2022-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), repeat_interval => 'FREQ=DLY; INTERVAL=1',
end_date => TO_DATE('2022-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS'), enabled => TRUE,
comments => 'This is a test job.');END;
3. 使用 EXCLUDE 和 INCLUDE 参数
在创建 Job 时,可以使用 EXCLUDE 和 INCLUDE 参数来排除或包含某些日期时间点,以实现更加精细的定时排程。例如下面的代码指定该 Job 在每天 9:00 到 18:00 之间每小时执行一次,但是在每天 12:00 到 13:00 之间不执行:
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE ( schedule_name => 'my_schedule',
repeat_interval => 'FREQ=HOURLY; INTERVAL=1; BYHOUR=9,10,11,14,15,16,17,18; BYMINUTE=0', start_date => SYSTIMESTAMP,
comments => 'This is a test schedule.');
DBMS_SCHEDULER.CREATE_JOB ( job_name => 'my_job',
job_type => 'PLSQL_BLOCK', job_action => 'BEGIN MY_PROCEDURE; END;',
start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
end_date => NULL, enabled => TRUE,
comments => 'This is a test job.', schedule_name => 'my_schedule',
exclude_time => 'FREQ=HOURLY; INTERVAL=1; BYHOUR=12,13; BYMINUTE=0');END;
上述代码中创建了一个名为 my_schedule 的 Schedule,表示在每天 9:00 到 18:00 之间每隔一个小时执行一次。然后在创建 my_job Job 时,将 my_schedule 分配给该 Job,同时指定了一个 EXCLUDE 时间段,表示该 Job 在每天 12:00 到 13:00 之间不执行。
总结
Job 工具是 Oracle 数据库中非常有用的定时排程执行工具,可以用来执行一些重复性的任务,或者是周期性的任务。通过本文所介绍的技巧,可以让 Job 工具更加灵活和高效,为数据库管理提供更多的自动化支持。