A mon avis, la solution la plus simple possible qui pourrait éventuellement travailler serait quelque chose comme
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;
La procédure dégénère tous les billets qui répondent à vos critères et le bloc anonyme crée une travail qui exécute la procédure chaque minute. Un seul travail qui s'exécute toutes les minutes (ou toutes les quelques minutes en fonction de votre tolérance pendant une longue période) peut être plus facile à gérer qu'un travail séparé pour chaque ticket qui s'exécute exactement 1 heure après son envoi. . Maintenant, si vous voulez obtenir un peu plus sophistiqué, le paquet DBMS_SCHEDULER offre un peu de fonctionnalités que le paquet DBMS_JOB ne fait pas. Il fournit une fonction de journalisation automatique, il permet de chaîner des tâches, de définir différentes fenêtres où les tâches s'exécutent et ne s'exécutent pas (par exemple, si un ticket est créé à 5h30, vous ne voudrez peut-être pas l'escalader à 6h30 est après les heures), etc. Et DBMS_SCHEDULER est la direction dans laquelle Oracle se déplace. Mais je me trouve toujours en utilisant DBMS_JOB pour des tâches relativement simples comme celle-ci.
Une fonctionnalité intéressante de 'DBMS_JOB' est que vous pouvez créer un travail à partir d'un déclencheur de table - si c'est votre style :). Ainsi, le processus appelant insère simplement le ticket, et un déclencheur sur la table crée un travail pour l'escalader. –
Le fait que le travail doive ou non escalader tout ce qui répond à certains critères est une question à considérer. La procédure pourrait accepter l'ID de ticket en tant que paramètre, ce qui pourrait supprimer le besoin d'index spéciaux pour que les escalate_cases fonctionnent correctement. –