本文旨在简介dbms_scheduler的用法,包括创建带参数的任务、任务状态查看、日志查看等,看完掌握日常用法,更深入的研究建议看官方文档。
1、前提:job_queue_processes参数
根据官档的描述,该参数用来:设定每个实例、用来执行job的最大子进程数,该限制对dbms_job和dbms_scheduler的共享。
1. 为0时,job不自动执行;但可以手动执行。
2. job数>参数时,后续的job会排队等待。
3. 实际执行job的子进程数由多个因素确定:
- 1.这个参数确定并发的最大子进程数
- 2.系统可用资源
- 3.resource manager的设定
- 4.当前正在执行的job
ps:这就是job创建提交后,不自动执行的原因。
job排队的例子见《Oracle Job排队执行实验》。
2、dbms_scheduler用法
2.1 创建带参数的job
begin
dbms_scheduler.create_job(job_name =>'MONITER',
job_type =>'STORED_PROCEDURE',
job_action =>'sp_insert',
number_of_arguments =>2,
start_date =>to_date('20180821151800','yyyymmddhh24miss'),
repeat_interval =>'FREQ=minutely; INTERVAL=2',
comments =>'scheduler test');
dbms_scheduler.SET_JOB_ARGUMENT_VALUE(
JOB_NAME => 'moniter',
ARGUMENT_POSITION => 1,
ARGUMENT_VALUE => 'scheduler1');
dbms_scheduler.SET_JOB_ARGUMENT_VALUE(
JOB_NAME => 'moniter',
ARGUMENT_POSITION => 2,
ARGUMENT_VALUE => '10');
dbms_scheduler.enable('MONITER');
end;
说明
1参数create_job(number_of_arguments=>)
dbms_scheduler不能直接传参数,必须先在创建job时定义参数的个数。否则,后续传递参数时报错ora-27465。
2参数传递方式不同:
如执行过程sp_insert(‘scheduler1’,10);为例
与dbms_job不同,dbms_job里可以直接传递参数,用转义字符串即可。
dbms_job.submit(jobid,
what => 'sp_insert(''key1'',10);',
next_date => to_date('20180821150500', 'yyyymmddhh24miss'));
scheduler通过函数SET_JOB_ARGUMENT_VALUE传参。
3函数enable:必须使能才有效。
4其他dbms_scheduler.drop_job(job_name)
2.2 查看当前job
select sysdate,
t.job_name,
t.JOB_ACTION, /*job执行的sp*/
t.STATE, /*job状态,应为enable*/
t.start_date,
t.REPEAT_INTERVAL,
t.*
from user_scheduler_jobs t;
2.3 查看job执行日志
select *
from all_scheduler_job_log t
where owner = 'HF'
and t.job_name = 'MONITER'
order by t.LOG_DATE desc;
select *
from all_scheduler_job_run_details t
where owner = 'HF'
and t.job_name = 'MONITER'
order by t.LOG_DATE desc;