Oracle dbms_scheduler用法和Job不自動執行原因
阿新 • • 發佈:2019-02-04
本文旨在簡介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;