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;

最初のジョブのイベントに基づいてトリガーされる 2 番目のジョブを作成します。

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_JOBに渡す方法はあり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 に答える