2016-09-26 10 views
0

以下で説明するように、oracle dbms_schedulerを使用してイベントベースのジョブを作成しようとしています。そのイベントに基づいて実行されるジョブにイベントを発生させたジョブ情報を渡す方法がありますか。キューにdbms_scheduler - イベントベースのジョブでlog_idを渡す

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; 

私は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に置き換えることもできます。

関連する問題