1. 程式人生 > >Oracle dbms_scheduler用法和Job不自動執行原因

Oracle dbms_scheduler用法和Job不自動執行原因

本文旨在簡介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;