一、什么是Job
Job是一个在Oracle数据库中被定义的单个工作或任务。在数据库中,一个Job可以被指定为运行一次或者多次。
Job包含了执行内容和相关的调度信息,其可以用来在指定的时间及频率内运行某项任务。
Job通常用来自动执行一些日常维护或后台任务,例如每日备份数据库、生成报告等操作。
二、创建Job
在Oracle数据库中,可以使用DBMS_SCHEDULER或DBMS_JOB package来创建Job。
1. 使用DBMS_SCHEDULER package
DBMS_SCHEDULER package提供了强大且灵活的调度功能,可以创建、调度和管理Job。
下面给出一个使用DBMS_SCHEDULER package创建Job的示例:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'daily_backup_job', -- Job名称 job_type => 'PLSQL_BLOCK', -- Job类型 job_action => 'BEGIN my_backup_procedure; END;', -- Job要执行的操作 start_date => SYSTIMESTAMP, -- Job开始时间 repeat_interval => 'FREQ=DAILY;BYHOUR=2', -- Job重复频率 end_date => NULL); -- Job结束时间 DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'daily_backup_job', attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF); DBMS_SCHEDULER.ENABLE( name => 'daily_backup_job'); -- 启用Job END;
2. 使用DBMS_JOB package
DBMS_JOB package是在早期版本的Oracle数据库中使用的调度方式,虽然其使用较为简单,但是功能较为有限,现已不再推荐使用。
下面给出一个使用DBMS_JOB package创建Job的示例:
DECLARE l_jobno PLS_INTEGER; BEGIN DBMS_JOB.SUBMIT ( job => l_jobno, what => 'BEGIN my_backup_procedure; END;', next_date => SYSTIMESTAMP, -- Job开始时间 interval => 'TRUNC(SYSDATE+1)+2/24'); -- Job重复频率 DBMS_OUTPUT.PUT_LINE('Job Number is:' || l_jobno); COMMIT; END;
三、管理Job
对于使用DBMS_SCHEDULER package创建的Job,可以使用DBMS_SCHEDULER package来管理Job。
下面给出一些常见的操作:
1. 禁用或启用Job
-- 禁用Job DBMS_SCHEDULER.DISABLE('daily_backup_job'); -- 启用Job DBMS_SCHEDULER.ENABLE('daily_backup_job');
2. 修改Job
-- 修改Job的重复频率 DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'daily_backup_job', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=3');
3. 删除Job
-- 删除Job DBMS_SCHEDULER.DROP_JOB('daily_backup_job');
对于使用DBMS_JOB package创建的Job,可以使用以下语句来删除Job:
DECLARE l_jobno PLS_INTEGER := 1; BEGIN DBMS_JOB.REMOVE(l_jobno); END;
四、小结
Oracle数据库中的Job是一种非常方便的自动化维护工具,使用起来相对方便,且具备灵活的定时调度功能。
使用DBMS_SCHEDULER package可以实现更多的操作,而早期版本中使用的DBMS_JOB package虽然功能局限,但仍有其特殊的用途。
在使用Job时需要注意其安全性和稳定性,避免对系统造成不必要的影响。