示例一
/*1.删除表脚本*/
declare num number ;
begin
select
count (1) into num
from
user_tables
where
table_name = 'job_test' ;
if num = 1 then
execute immediate 'drop table job_test' ;
end if;
end;
/*2.创建测试表*/
create table job_test(id integer,add_time date);
/*3.创建存储过程*/
create or replace procedure prc_job_test is
begin
insert into job_test values (1,sysdate);
commit;
end prc_job_test;
/*4.删除任务脚本*/
begin
for v in(select job from dba_jobs where what = 'prc_job_test;') loop
dbms_job.remove(v.job);
end loop;
commit;
end;
示例二:
/*5.创建任务*/
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job,--任务名称
'prc_job_test;',--执行的过程
sysdate,--执行时间
'sysdate+1/(24*60*10)');--下次执行时间
commit;
end;
/*6、停止定时任务*/
declare
begin
/*停止一个job,jobid, job的id,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)*/
dbms_job.broken(4008,true,sysdate);
commit;
end;
/*7、启动指定定时任务*/
declare
begin
dbms_job.run(4008); /*4008 job的id*/
commit;
end;
/*8、删除定时任务*/
declare
begin
dbms_job.remove(4008); /*删除自动执行的job,参数是 job的id*/
commit;
end;
/*9、修改定时任务的间隔时间*/
declare
begin
/*第一个参数为job的id,第二个参数interval: 计算下一次任务执行的时间表达式*/
dbms_job.interval(4008,interval => 'trunc(sysdate)+1');
commit;
end;
/*10、修改下一次执行时间*/
declare
begin
/*第一个参数:job的id;第二个参数:要修改后的计算下一次执行的时间表达式*/
dbms_job.next_date(4008,to_date('2020-12-30 11:00:00','yyyy-mm-dd hh24:mi:ss'));
commit;
end;
/*11、修改定时任务要执行的操作*/
declare
begin
/* 第一个参数:job的id;第二个参数:要更改的新操作名称(操作名必须存在)*/
dbms_job.what(4008,'testjob2();');
commit;
end;
附加:
dba_jobs 表中字段含义 | |
JOB | 任务的唯一标识码 |
LOG_USER | 提交任务的用户 |
PRIV_USER | 赋予任务权限的用户 |
SCHEMA_USER | 对用户作语法分析的用户模式 |
LAST_DATE | 最后一次成功执行任务的时间 |
LAST_SEC | 最后一次成功执行任务的时间的时分秒 |
THIS_DATE | 正在执行的任务的开始时间,若没有则为空 |
THIS_SEC | THIS_SEC 正在执行的任务的开始时间的时分秒,若没有则为空 |
NEXT_DATE | 下一次执行定时任务的时间 |
NEXT_SEC | 下一次执行定时任务的时间的时分秒 |
TOTAL_TIME | 执行当前任务所需要的时间,单位:秒 |
BROKEN | 标志参数,Y表示任务中断,以后不会再运行 |
INTERVAL | 计算下一次执行定时任务的时间表达式 |
FAILURES | 当前定时任务执行失败的总次数 |
WHAT | 执行任务的PL/SQL代码块 |
NLS_ENV | 任务执行的NLS会话设置 |
MISC_ENV | 定时任务运行的其他一些参数设置 |
INSTANCE | 标识当前任务运行是否受限,0 没有受限 |
常用的执行频率
select sysdate 当前时间,
sysdate + 1 每天,
sysdate + 1 / 24 每小时,
sysdate + 1 / (24 * 60) 每分钟,
sysdate + 1 / (24 * 60 * 60) 每秒,
sysdate + 7 每周,
trunc(sysdate + 1) 每天午夜12点,
trunc(sysdate + 1) + (8 * 60 + 30) / (24 * 60) 每天早上8点30分,
-- show parameter nls_date_language; 'TUESDAY'
next_day(trunc(sysdate), '星期二') + 12 / 24 每星期二中午12点,
trunc(last_day(sysdate)) + 1 每个月第一天的午夜12点,
trunc(add_months(sysdate + 2 / 24, 3), 'Q') - 1 / 24 每个季度最后一天的晚上11点,
-- 周六 saturday,周日 sunday
trunc(least(next_day(sysdate, '星期六'),
next_day(sysdate, '星期日'))) + (6 * 60 + 10) / (24 * 60) 每周六和周日早上6点10分
from dual;