아래에 설명 된 것처럼 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_JOB
에 TEST_PROGRAM_JOB
의 현재 log_id
를 전달할 수있는 방법이 있나요? TEST_PROGRAM_JOB
의 상태를 기록하고 싶습니다. 지금 당장은 tab.user_data.log_id
을 사용해 보았지만 성공하지 못했습니다.