2012-06-19 2 views
1

Привет, я новичок в планировщике Oracle. Мой вопрос: можем ли мы дать как интервал повторения, так и условие события в объекте Schedule для одного задания?Oracle Scheduler - может ли одно задание работать как на основе событий, так и по времени?

У меня есть это требование при планировании заданий - задание должно выполняться в запланированное время, но только в случае возникновения определенного события.

Для примера.

Job1 должен работать - в 10:00 каждый день - но только если такая же работа со вчерашнего дня больше не работает. (Это я выясню, основываясь на записи в таблице.) Таким образом, событие станет записью ячейки: «ENDED» в таблице job_statuses.

Было бы проще, если бы я мог предоставить обе данные в одной и той же работе. Еще один подход, который я попробую, - запланировать работу, основанную на времени. Если предыдущий экземпляр все еще запущен, перенастройте задание на основе события. Но это выглядит неуклюжим.

Заранее спасибо.

Mayank

+0

Попытайтесь использовать Цепочную Цепь для этого. Вы можете определить правила цепи и зависимости между заданиями. – arnep

ответ

1

Я бы кодировать условие в PL/SQL самой процедуры. то есть он работает в 10 утра каждый день, но первое, что он делает, это проверить, завершилось ли предыдущее задание.

+0

Да, это второй подход, о котором я говорил. Но это будет означать, что если предыдущая работа не будет выполнена, мне нужно будет создать новое задание, проверяющее событие «предыдущее задание», работающее только один раз. –

+0

Понятно, что я отделил бы работу от самой задачи; каждый раз, когда выполняется задание, он сначала определяет, какая задача (или задачи) еще не выполнена, и делает это. Если это не удается, в следующий раз, когда будет выполняться задание, он увидит, что задачи, которые предыдущая работа должна была сделать, не были выполнены, и попытаются сделать их снова. Что-то вроде того, что предложил ik_zelf. –

1

Что вы могли бы сделать, это создать 3 рабочих мест

  1. EVENT_JOB
  2. REPEAT_JOB
  3. ACTUAL_WORK_JOB

EVENT_JOB и REPEAT_JOB просто начать ACTUAL_WORK_JOB. Если это уже - или все еще - работает, вы получаете ошибку, от которой вы можете реагировать соответствующим образом.