create table testJob(
id number,
create_date date
);
create or replace procedure test_pro is
begin
insert into testJob(id,create_date) values(seq_testjob.nextval,sysdate );
end;
create sequence seq_testjob
maxvalue 999999999999
start with 12
increment by 1
cache 20;
select * from testjob;
创建定时任务
var job_num number;
begin
dbms_job.submit(:job_num,'test_pro;',SYSDATE,'sysdate+2/24/60');
end;
修改定时任务
var job_num number;
begin
dbms_job.change(84,'pro_stock_stop_in;',SYSDATE,'trunc(last_day(sysdate))+20/24');
end;
查询定时任务
select * from user_jobs;
暂定
job:dbms_job.broken(job,broken,nextdate);
禁用
exec dbms_job.broken(21,true);
启用
exec dbms_job.run(21);
每天午夜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)'
DBA_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块
CURRENT_SESSION_LABEL RAW MLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙
CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置
MISC_ENV RAW(32) 任务运行的其他一些会话参数
每天运行一次 |
'SYSDATE + 1' |
每小时运行一次 |
'SYSDATE + 1/24' |
每10分钟运行一次 |
'SYSDATE + 10/(60*24)' |
每30秒运行一次 |
'SYSDATE + 30/(60*24*60)' |
每隔一星期运行一次 |
'SYSDATE + 7' |
不再运行该任务并删除它 |
NULL |
每天午夜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)' |
select TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'MM' ) -1/24 from dual;
select trunc(last_day(sysdate))+8/24 from dual;
表达式可以通过查询获得
CREATE OR REPLACE PROCEDURE pro_stock_stop_in IS
BEGIN
insert into stock_stop_in(ym,year,monthinfo,stop_amount,amount,rate,gt_rate)
select to_char(sysdate, 'yyyy-mm') ym, to_char(sysdate, 'yyyy') year,
to_number(to_char(sysdate, 'mm')) monthinfo, sum(t1.amount) stop_amount,
sum(t2.amount) amount, round(sum(t1.amount) /nvl(sum(t2.amount), 1), 4) rate, 0.02 GT_RATE
from (
select sum(ssd.jy_num * ssd.device_amount) amount from stock_batch sb
inner join stock_surplus_batch_detail ssd on sb.batch = ssd.batch and ADD_MONTHS(sysdate, -6) > sb.create_time and ssd.jy_num > 0 ) t1,
( select sum(amount) amount from contract_orders o where to_char(o.create_date,'yyyy')=to_char(sysdate,'yyyy') ) t2;
END;
var job_num number;
begin
dbms_job.submit(:job_num,'pro_stock_stop_in;',trunc(last_day(sysdate))+21/24,'trunc(last_day(sysdate))+21/24');
end;
var job_num number;
begin
dbms_job.change(84,'pro_stock_stop_in;',trunc(last_day(sysdate))+21/24,'trunc(last_day(sysdate))+21/24');
end;