我想创建一个基于事件的计划作业。每当调度程序生成 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;
/
我希望代码也停止其他模式中存在的调度程序作业
有点复杂……
首先,您将属性设置为必须在启用/运行之前引发事件的作业:
DBMS_SCHEDULER.set_attribute (name => 'Job_Name_that_Expire', attribute => 'max_run_duration', VALUE => NUMTODSINTERVAL (2, 'HOUR'));
其次,您必须创建一个“捕获”事件并停止发送“过期”事件的作业的作业:
DBMS_SCHEDULER.CREATE_JOB
(
工作名称 => '