0

我正在尝试使用 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_idTEST_PROGRAM_JOBinto UPDATE_STATUS_JOB?我想记录TEST_PROGRAM_JOB. 现在,我尝试使用tab.user_data.log_id但没有成功。

4

1 回答 1

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。

于 2016-09-27T07:52:38.190 回答