创建job两种方式:强列建议使用第二种
1.dbms_job创建job(不推荐使用)
举例说明:
DECLARE
JOB NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOB=>JOB,
WHAT=>'p_sms_notice;',
NEXT_DATE=>sysdate,
INTERVAL=> 'sysdate+1/24'
);
COMMIT;
END;
查询job:
select * from dba_jobs where lower(what) like 'p_sms_notice%'
删除:
exec dbms_job.remove(1001)
运行:
exec dbms_job.run(201)
停止:
exec dbms_job.broke(783,true)
EXEC DBMS_JOB.BROKEN(783, TRUE);
修改job
exec DBMS_JOB.INTERVAL(201, 'sysdate + 2/24');--改变一个定时器的执行频率成每隔二小时执行一次
--修改某个job名 修改下一次运行时间
exec dbms_job.next_date(201,sysdate)
2.使用schedule_job建立作业(强烈推荐)
举例说明:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name =>'p_sms_notice_job',
job_type =>'STORED_PROCEDURE',
job_action =>'p_sms_notice',
repeat_interval =>'FREQ=HOURLY;INTERVAL=1',
enabled => true,
comments => 'p_sms_notice');
END;
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name =>'statists_gathering_job',
job_type =>'STORED_PROCEDURE',
job_action =>'statists_gathering',
start_date => to_date('2020-08-20 01:00','yyyy-mm-dd hh24:mi:ss'),
repeat_interval =>'FREQ=WEEKLY;INTERVAL=1',
enabled => true,
comments => 'statists_gathering');
END;
各参数的含义:
job_name:顾名思义给job起个名字,相比较用dbms_job创建job使用数字代表job,schedule_job更具可读性
job_type:job类型;目前支持三种类型:PL/SQL块: PLSQL_BLOCK,存储过程: STORED_PROCEDURE,外部程序: EXECUTABLE (外部程序可以是一个shell脚本,也可以是操作系统级别的指令)
备注:我们一般常用的就是STORED_PROCEDURE
job_action:根据job_type的不同,job_action有不同的含义,这里我们指定的是存储过程类型,这里就写的是相对应的存储过程名字
repeat_interval:执行频率:其中最重要的是FREQ和INTERVAL两个关键字。
FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。
INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-99。
enabled:指定任务是否启用,默认false
comments:备注
常用命令:
禁用
BEGIN
DBMS_SCHEDULER.DISABLE(name => 'p_sms_notice_job');
END;
BEGIN
DBMS_SCHEDULER.DISABLE(name => 'p_sms_notice_job',force=>true);
END;
启用:
BEGIN
DBMS_SCHEDULER.ENABLE(name => 'p_sms_notice_job');
END
删除
exec dbms_scheduler.drop_job('JOB_PUSH_NOTICE')
exec dbms_scheduler.drop_job(job_name=>'JOB_PUSH_NOTICE',force=>true)
查询:
select * from dba_SCHEDULER_JOBS where lower(job_name)='p_sms_notice_job'
logs:job执行情况都会记录在log里,这也方便我们去监控job执行情况
SELECT * FROM dba_SCHEDULER_JOB_RUN_DETAILS WHERE lower(job_name)='p_sms_notice_job';