Oracle定时任务,定时去调存储过程执行存储过程的sql
--1、先写要执行的SQL语句,这里以:每个人助记码更新为每个人最新工作记录所属组织的助记码 为例。
UPDATE bd_psndoc
SET bd_psndoc.mnecode = (select HR_PSNMNECODE.mnecode from HR_PSNMNECODE where HR_PSNMNECODE.pk_psndoc = bd_psndoc.pk_psndoc)
WHERE EXISTS(SELECT 1 FROM HR_PSNMNECODE WHERE HR_PSNMNECODE.pk_psndoc = bd_psndoc.pk_psndoc);
--2、建立存储过程
CREATE or replace PROCEDURE PSNMNECODE
is
BEGIN
--s
UPDATE bd_psndoc
SET bd_psndoc.mnecode = (select HR_PSNMNECODE.mnecode from HR_PSNMNECODE where HR_PSNMNECODE.pk_psndoc = bd_psndoc.pk_psndoc)
WHERE EXISTS(SELECT 1 FROM HR_PSNMNECODE WHERE HR_PSNMNECODE.pk_psndoc = bd_psndoc.pk_psndoc);
--e
end;
--3、查看存储任务
Select text from user_source where name='PSNMNECODE' order by line;
--4、.创建任务(对某个数据库模式创建定时任务一定是该数据库用户登录,否则权限有问题)
declare tm_jobb number; --tm_joba定时任务名称
begin
sys.dbms_job.submit(
tm_jobb, --任务名称
'PSNMNECODE;',--执行的过程
sysdate,--执行时间
'TRUNC(sysdate) + 1 +1.5/ (24)');--下次执行时间
--'sysdate+1/(24*60*10)');--下次执行时间
COMMIT;
end;
--5、查看有哪些定时任务
--当前用户定时任务
select * from user_jobs;
--有权限访问的定时任务
select * from all_jobs;
--整个数据库所有定时任务
select * from dba_jobs;
--手工执行定时任务
begin
dbms_job.run(21);
end;
--
--6 停止任务
begin
dbms_job.broken(21,true);
end;
--删除定时任务
begin
dbms_job.remove(21);--ALL_JOBS.job的值
end;
如果正常建的定时任务到点未执行,可能原因如下:点击查询
其他知识:
1、存job信息的表user_jobs主要字段说明:
2、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)''
每3秒钟执行一次 'sysdate+3/(24*60*60)'
每2分钟执行一次 'sysdate+2/(24*60)'
每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分钟执行
interval => 'sysdate+1/(24*60)' --每分钟执行
interval => 'sysdate+1' --每天
interval => 'sysdate+1/24' --每小时
interval => 'sysdate+2/24*60' --每2分钟
interval => 'sysdate+30/24*60*60' --每30秒
每天定时执行
Interval => TRUNC(sysdate+1) --每天凌晨0点执行
Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执行
Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8点30分执行
每周定时执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2点执行
每月定时执行
Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每月1日凌晨0点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每月1日凌晨1点执行
每季度定时执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第一天凌晨0点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最后一天的晚上11点执行
每半年定时执行
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7月1日和1月1日凌晨1点
每年定时执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1月1日凌晨1点执行