DBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。
设置初始化参数来进行的。下面就是该参数:
JOB_QUEUE_PROCESSES = n
其中,n可以是0到36之间的任何一个数。
名称 | 类型 | 描述 |
DBMS_JOB.ISUBMIT | 过程 | 提交一个新任务,用户指定一个任务号 |
DBMS_JOB.SUBMIT | 过程 | 提交一个新任务,系统指定一个任务号 |
DBMS_JOB.REMOVE | 过程 | 从队列中删除一个已经存在的任务 |
DBMS_JOB.CHANGE | 过程 | 更改用户设定的任务参数 |
DBMS_JOB.WHAT | 过程 | 更改PL/SQL任务定义 |
DBMS_JOB.NEXT_DATE | 过程 | 更改任务下一次运行时间 |
DBMS_JOB.INTERVAL | 过程 | 更改任务运行的时间间隔 |
DBMS_JOB.BROKEN | 过程 | 将任务挂起,不让其重复运行 |
DBMS_JOB.RUN | 过程 | 在当前会话中立即执行任务 |
DBMS_JOB.USER_EXPORT | 过程 | 创建文字字符串,用于重新创建一个任务 |
DBMS_JOB包参数
名称 | 类型 | 注释 |
Job | BINARY_INTEGER | 任务的唯一识别号 |
What | VARCHAR2 | 作为任务执行的PL/SQL代码 |
Next_date | VARCHAR2 | 任务下一次运行的时间 |
Interval | VARCHAR2 | 日期表达式,用来计算下一次任务运行的时间 |
任务重复运行间隔和间隔设计算法
描述 | Interval参数值 |
每天运行一次 | 'SYSDATE + 1' |
每小时运行一次 | 'SYSDATE + 1/24' |
每10分钟运行一次 | 'SYSDATE + 10/(60*24)' |
每30秒运行一次 | 'SYSDATE + 30/(60*24*60)' |
每隔一星期运行一次 | 'SYSDATE + 7' |
不再运行该任务并删除它 | NULL |
定时到特定日期或时间的任务例子
描述 | INTERVAL参数值 |
每天午夜12点 | 'TRUNC(SYSDATE + 1)' |
每天早上8点30分 | 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' |
每星期二中午12点 | 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' |
每个月第一天的午夜12点 | 'TRUNC(LAST_DAY(SYSDATE ) + 1)' |
每个季度最后一天的晚上11点 | 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' |
每星期六和日早上6点10分 | 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)' |
例子:
create or replace procedure joblog_deleter is
daynum number:= 7 ;
begin
delete from pamirs_schedule_jobblog where trunc(sysdate-exe_time)>daynum ;
commit ;
end joblog_deleter;
/
variable nob number ;
begin
sys.dbms_job.submit(job =>:nob,
what => 'JOBLOG_DELETER;',
next_date => trunc(sysdate)+23/24,
interval => 'sysdate+7');
commit;
end;
/
查看任务: select * from user_jobs
删除任务:
begin
2 dbms_job.remove(88); --删除任务
3 end;
4 /
运行任务:
dbms_job.run(nob); --删除任务