基于事件的 Oracle 调度程序作业

问题描述 投票:0回答:1

我想创建一个基于事件的计划作业。每当调度程序生成 JOB_OVER_MAX_DUR 类型的事件时,该作业就应该停止。我编写了以下代码,目前仅适用于管理模式中的调度程序作业。但是,我打算让它也停止其他模式中的作业,但它不起作用,你能帮我看看我缺少什么吗?

exec dbms_scheduler.add_event_queue_subscriber('MYAGENT');

BEGIN
   DBMS_SCHEDULER.create_job (
      job_name        => 'TEST_JOB',
      job_type        => 'PLSQL_BLOCK',
      job_action      => 
         'BEGIN
            -- Retrieve the job owner and job name based on the event condition
            FOR job_rec IN (SELECT owner, job_name
            FROM dba_scheduler_jobs
            where state = ''RUNNING'' and raise_events like ''%JOB_OVER_MAX_DUR%'') LOOP
            -- Stop the retrieved job
                IF job_rec.job_name IS NOT NULL THEN
                DBMS_SCHEDULER.stop_job(job_rec.owner || ''.'' || job_rec.job_name, TRUE);
                END IF;
            END LOOP;
         END;',
      event_condition => 'tab.user_data.event_type = ''JOB_OVER_MAX_DUR''',
      queue_spec      => 'sys.scheduler$_event_queue,MYAGENT',
      enabled         => TRUE
   );
END;
/

我希望代码也停止其他模式中存在的调度程序作业

oracle oracle-sqldeveloper oracle-autonomous-db advanced-queuing
1个回答
0
投票

有点复杂…… 首先,您将属性设置为必须在启用/运行之前引发事件的作业: DBMS_SCHEDULER.set_attribute (name => 'Job_Name_that_Expire', attribute => 'max_run_duration', VALUE => NUMTODSINTERVAL (2, 'HOUR')); 其次,您必须创建一个“捕获”事件并停止发送“过期”事件的作业的作业: DBMS_SCHEDULER.CREATE_JOB ( 工作名称 => '' ,开始日期 => NULL ,event_condition => 'tab.user_data.object_owner = '''' AND tab.user_data.object_name = '''' AND tab.user_data.event_type = ''JOB_OVER_MAX_DUR''' ,queue_spec => 'SYS.SCHEDULER$_EVENT_QUEUE, ' ,结束日期 => NULL ,job_class => 'DEFAULT_JOB_CLASS' ,job_type => 'PLSQL_BLOCK' ,job_action => 'DBMS_SCHEDULER.STOP_JOB(''.""'',false);' ,评论=> NULL );

© www.soinside.com 2019 - 2024. All rights reserved.