На мой взгляд, самое простое решение, которое могло бы работать, было бы что-то вроде
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 для относительно простых задач, подобных этой.