dbms_scheduler - 在基于事件的作业中传递log_id

时间:2016-09-26 21:09:34

标签: oracle dbms-scheduler

我正在尝试使用oracle dbms_scheduler创建基于事件的作业,如下所述。有没有办法可以将引发事件的作业信息传递给基于该事件执行的作业。

订阅队列

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;

我有没有办法将当前log_id的{​​{1}}传递给TEST_PROGRAM_JOB?我想记录UPDATE_STATUS_JOB的状态。现在,我尝试使用TEST_PROGRAM_JOB,但没有成功。

1 个答案:

答案 0 :(得分: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。