На мой взгляд, самый простой из возможных решений, которые могли бы работать было бы что-то вроде
CREATE PROCEDURE escalate_cases
AS
BEGIN
UPDATE tickets
SET status = 'ESCALATED'
WHERE status = 'NOT ESCALATED'
AND open_date < sysdate - interval '1' hour;
END escalate_cases;
DECLARE
l_jobno PLS_INTEGER;
BEGIN
dbms_job.submit(
l_jobno,
'BEGIN escalate_cases(); END;',
sysdate + interval '1' minute,
'sysdate + interval ''1'' minute'
);
dbms_output.put_line('Job ' || l_jobno || ' submitted.');
commit;
END;
Процедура обостряется все билеты, которые отвечают вашим критериям и анонимный блок создает работа, выполняющая процедуру каждую минуту. Одно задание, которое выполняется каждую минуту (или каждые несколько минут в зависимости от вашего допуска в течение долгого времени, которое вы можете ждать, чтобы увеличить билет) будет легче управлять, чем отдельное задание для каждого билета, которое выполняется ровно через 1 час после его отправки ,
Теперь, если вы хотите получить немного более сложный, пакет DBMS_SCHEDULER предлагает довольно много функциональности, которой нет в пакете DBMS_JOB. Он обеспечивает некоторую автоматическую регистрацию, обеспечивает возможность цепочки заданий, определять различные окна, в которых выполняются и не выполняются задания (т. Е. Если билет создается в 5:30, вы не можете его эскалировать в 6:30, потому что это послезавтра) и т. д. И DBMS_SCHEDULER - это направление, в котором движется Oracle. Но я все еще нахожусь с помощью DBMS_JOB для относительно простых задач, подобных этому.
Приятной особенностью `DBMS_JOB` является то, что вы можете создать задание из триггера таблицы, если это ваш стиль :). Таким образом, вызывающий процесс просто вставляет билет, а триггер на таблице создает задание для его эскалации. – 2010-12-10 02:37:58