OracleJob的使⽤(定时执⾏)
oracle中的job能为你做的就是在你规定的时间格式⾥执⾏存储过程,定时执⾏⼀个任务。下⾯是⼀个⼩案例,定时每15分钟向⼀张表插⼊⼀条数据
1.创建⼀张测试表
-- Create table
create table A8
(
a1 VARCHAR2(500)
)
tablespace DSP_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
2.创建存储过程实现向测试表插⼊数据
create or replace procedure proc_add_test as
begin
insert into a8 values (to_char(sysdate, 'yyyy-mm-dd hh:mi'));/*向测试表插⼊数据*/
commit;
end;
3.创建job定时任务实现⾃动调⽤存储过程(当前时间 17:03)
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job,  /*⾃动⽣成JOB_ID*/
WHAT =>'proc_add_test;',  /*需要执⾏的存储过程名称或SQL语句*/
NEXT_DATE => sysdate+3/(24*60),  /*初次执⾏时间-下⼀个3分钟*/
INTERVAL =>'trunc(sysdate,''mi'')+1/(24*60)'/*每隔1分钟执⾏⼀次*/
);
commit;
end;
4.也就是应该从17:06开始每隔1分钟执⾏⼀次存储过程下⾯是截⽌17:12分的测试表的数据
1.可以通过查询系统表查看该job信息
select*from user_jobs;
2.⼿动sql调⽤job  (直接调⽤job可以忽略开始时间)
begin
DBMS_JOB.RUN(40); /*40 job的id*/
end;
3.删除任务
beginoracle手动调用存储过程
/*删除⾃动执⾏的job*/
ve(40);
end;
4.停⽌job
dbms.broken(job,broken,nextdate);
dbms_job.broken(v_job,true,next_date);        /*停⽌⼀个job,⾥⾯参数true也可是false,next_date(某⼀时刻停⽌)也可是sysdate(⽴刻停⽌)。  */
5.修改间隔时间
dbms_job.interval(job,interval);
6.修改下次执⾏时间
_date(job,next_date);
7.修改要执⾏的操作
dbms_job.what(jobno,'sp_fact_charge_code;');--修改某个job名
三其他知识
1.存job信息的表user_jobs主要字段说明
列名数据类型解释
JOB NUMBER任务的唯⼀标⽰号
LOG_USER VARCHAR2(30)提交任务的⽤户
PRIV_USER VARCHAR2(30)赋予任务权限的⽤户
SCHEMA_USER VARCHAR2(30)对任务作语法分析的⽤户模式
LAST_DATE DATE最后⼀次成功运⾏任务的时间
LAST_SEC VARCHAR2(8)如HH24:MM:SS格式的last_date⽇期的⼩时,分钟和秒
THIS_DATE DATE 正在运⾏任务的开始时间,如果没有运⾏任务则为null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date⽇期的⼩时,分钟和秒
NEXT_DATE DATE下⼀次定时运⾏任务的时间
NEXT_SEC VARCHAR2(8)如HH24:MM:SS格式的next_date⽇期的⼩时,分钟和秒
TOTAL_TIME NUMBER该任务运⾏所需要的总时间,单位为秒
BROKEN VARCHAR2(1)标志参数,Y标⽰任务中断,以后不会运⾏
INTERVAL VARCHAR2(200)⽤于计算下⼀运⾏时间的表达式
FAILURES NUMBER任务运⾏连续没有成功的次数
WHAT VARCHAR2(2000)执⾏任务的PL/SQL块
2.INTERVAL参数常⽤值⽰例
1. 每天午夜12点            ''TRUNC(SYSDATE + 1)''
2. 每天早上8点30分        ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''
3. 每星期⼆中午12点        ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24''
4. 每个⽉第⼀天的午夜12点    ''TRUNC(LAST_DAY(SYSDATE ) + 1)''
5. 每个季度最后⼀天的晚上11点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24''
6. 每星期六和⽇早上6点10
分    ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''
7. 每3秒钟执⾏⼀次            'sysdate+3/(24*60*60)'
8. 每2分钟执⾏⼀次          'sysdate+2/(24*60)'
9.
10. 1:每分钟执⾏
11. Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执⾏
12. interval => 'sysdate+1/(24*60)'  --每分钟执⾏
13. interval => 'sysdate+1'    --每天
14. interval => 'sysdate+1/24'  --每⼩时
15. interval => 'sysdate+2/24*60' --每2分钟
16. interval => 'sysdate+30/24*60*60'  --每30秒
17. 2:每天定时执⾏
18. Interval => TRUNC(sysdate+1)  --每天凌晨0点执⾏
19. Interval => TRUNC(sysdate+1)+1/24  --每天凌晨1点执⾏
20. Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60)  --每天早上8点30分执⾏
21. 3:每周定时执⾏
22. Interval => TRUNC(next_day(sysdate,'星期⼀'))+1/24  --每周⼀凌晨1点执⾏
23. Interval => TRUNC(next_day(sysdate,1))+2/24  --每周⼀凌晨2点执⾏
24. 4:每⽉定时执⾏
25. Interval =>TTRUNC(LAST_DAY(SYSDATE)+1)  --每⽉1⽇凌晨0点执⾏
26. Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24  --每⽉1⽇凌晨1点执⾏
27. 5:每季度定时执⾏
28. Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q')  --每季度的第⼀天凌晨0点执⾏
29. Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24  --每季度的第⼀天凌晨1点执⾏
30. Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24  --每季度的最后⼀天的晚上11点执⾏
31. 6:每半年定时执⾏
32. Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24  --每年7⽉1⽇和1⽉1⽇凌晨1点
33. 7:每年定时执⾏
34. Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24  --每年1⽉1⽇凌晨1点执⾏