2016-09-26 31 views
0

我正在嘗試使用oracle dbms_scheduler創建基於事件的作業,如下所述。有沒有辦法讓我們傳遞將事件引發到基於事件執行的作業的作業信息。dbms_scheduler - 在基於事件的作業中傳遞log_id

訂閱隊列

BEGIN 
    sys.DBMS_SCHEDULER.add_event_queue_subscriber ('my_queue_agent'); 
END; 

創建計劃,將通過第一份工作

begin 
    sys.dbms_scheduler.create_program(program_name  => 'PROGRAM_TEST', 
            program_type  => 'STORED_PROCEDURE', 
            program_action  => 'PROC_TEST_SCHEDULER', 
            number_of_arguments => 2, 
            enabled    => false, 
            comments   => ''); 
    sys.dbms_scheduler.define_program_argument(program_name  => 'PROGRAM_TEST', 
              argument_position => 1, 
              argument_name  => 'P_JOB_NAME', 
              argument_type  => 'VARCHAR2', 
              default_value  => ''); 

    sys.dbms_scheduler.define_metadata_argument(program_name  => 'PROGRAM_TEST', 
               metadata_attribute => 'LOG_ID', 
               argument_position => 2, 
               argument_name  => 'LOG_ID'); 
    sys.dbms_scheduler.enable(name => 'PROGRAM_TEST'); 
end; 

創建工作,利用該程序被調用。

begin 
    sys.dbms_scheduler.create_job(job_name   => 'TEST_PROGRAM_JOB', 
           program_name  => 'PROGRAM_TEST', 
           start_date   => to_date(null), 
           repeat_interval  => '', 
           end_date   => to_date(null), 
           job_class   => 'DEFAULT_JOB_CLASS', 
           enabled    => false, 
           auto_drop   => false, 
           comments   => ''); 
    sys.dbms_scheduler.set_job_argument_value(job_name  => 'TEST_PROGRAM_JOB', 
              argument_name => 'P_JOB_NAME', 
              argument_value => 'TEST_PROGRAM_JOB'); 

sys.dbms_scheduler.set_attribute(name => 'TEST_PROGRAM_JOB', attribute => 'raise_events', value => sys.dbms_scheduler.job_started + sys.dbms_scheduler.job_succeeded + sys.dbms_scheduler.job_failed); 
end; 

創建將根據第一份工作的事件觸發的第二份工作。

BEGIN 
    sys.DBMS_SCHEDULER.create_job (
     job_name   => 'UPDATE_STATUS_JOB', 
     job_type   => 'PLSQL_BLOCK', 
     job_action  => 'insert into t_log values (''UPDATE'' || tab.user_data.log_id,sysdate);', 
     event_condition => '(tab.user_data.event_type = ''JOB_SUCCEEDED'' OR 
          tab.user_data.event_type = ''JOB_FAILED'' or 
          tab.user_data.event_type = ''JOB_STARTED'' or 
          tab.user_data.event_type = ''JOB_COMPLETED'') AND tab.user_data.object_name = ''TEST_PROGRAM_JOB''', 
     queue_spec  => 'sys.scheduler$_event_queue,my_queue_agent', 
     enabled   => TRUE); 
END; 

有沒有辦法我可以傳遞的TEST_PROGRAM_JOB當前log_idUPDATE_STATUS_JOB?我想記錄TEST_PROGRAM_JOB的狀態。現在,我嘗試使用tab.user_data.log_id但沒有成功。

回答

0

sys.dbms_scheduler.define_metadata_argument僅適用於'job_name','job_subname','job_owner','job_start','window_start','window_end'和'event_message。

在你的情況嘗試使用event_message。您也可以用job_name替換p_job_name。