2016-09-26 4 views
0

아래에 설명 된 것처럼 oracle dbms_scheduler를 사용하여 이벤트 기반 작업을 생성하려고합니다. 해당 이벤트를 발생시키는 작업 정보를 해당 이벤트를 기반으로 실행되는 작업으로 전달할 수있는 방법이 있습니까?dbms_scheduler - 이벤트 기반 작업에서 log_id 전달

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.add_event_queue_subscriber ('my_queue_agent'); 
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; 

내가 UPDATE_STATUS_JOBTEST_PROGRAM_JOB의 현재 log_id를 전달할 수있는 방법이 있나요? 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를 사용해보십시오. p_job_name을 job_name으로 대체 할 수도 있습니다.