Comment lancer une procédure stockée dans une base Oracle sans passer par un script lancé par le crontab unix/linux ou le planificateur de tache Windows ? Oracle dispose depuis « toujours » d’une gestion interne de tâches planifiées dédiée pour cela.
La création d’une tache planifiée fait appel à DBMS_SCHEDULER qui est un package interne à Oracle. Pour bien comprendre le fonctionnement, nous allons la créer directement « à la main » dans la base grâce à 3 étapes simples.
La création du programme
- program_name => pour l’identifier, en pensant bien à préciser le propriétaire du job
- program_type => indique le type de programme (généralement PLSQL_BLOCK)
- program_action => appelle la procédure a exécuter entourée de quottes dans
- comments => commentaires quant à l’action du programme
La création d’un programme se concrétise comme ceci :
BEGIN DBMS_SCHEDULER.create_program ( program_name => '"PROPRIETAIRE"."ma_supertache"', program_type => 'PLSQL_BLOCK', program_action => 'BEGIN PROPRIETAIRE.ARCHIVESYSPERF; END;', enabled => TRUE, comments => 'un petit descriptif de la procédure stockée qui sera lancée'); END; /
La création du planificateur ou scheduler
Pour cela il faut bien préciser une fois de plus le nom de l’utilisateur qui va lancer le job
- schedule_name => le nom du planificateur qui est lancé par un utilisateur proprietaire
- start_date => la date de mise en route de ce planificateur
-> SYSTIMESTAMP correspond à l’heure présente.
-> pour définir une heure précise par exemple 19h, il faudra préciser dans quelle durée à partir de la date prévue de lancement à minuit : TRUNC(SYSDATE)+19/24 soit la date du jour a minuit + 19/24e d’une journée. Si la tache doit se lancer a 19h30, il faudra penser en 1/48e de journée (soit 19/24+1/48 = 39/48 de journée) et réflechir ainsi de suite pour les quart d’heure etc..
- repeat_interval => l’intervalle de répétition
-> freq : précise la fréquence DAILY, HOURLY…
-> interval : Précise si il y a lieu l’intervalle de temps entre deux lancements de la tache (freq=HOURLY;interval=1 repetera le programme toutes les heures)
-> BYDAY, BYHOUR, BYMINUTE : précise à quel jour ou quelle heure se lance la tache planifiée ‘FREQ=DAILY; BYDAY=MON; BYHOUR=22;’, lancera un job tous les lundi a 22h
- end_date => à renseigner si le job a une fenêtre de réalisation sinon NULL
BEGIN DBMS_SCHEDULER.create_schedule ( schedule_name => 'PROPRIETAIRE.mon_scheduler', start_date => TRUNC(SYSDATE)+39/48, repeat_interval => 'freq=DAILY; BYHOUR=08', end_date => NULL, comments => 'répetition tous les jours à 8h, lancement ce soir a partir de 19h30'); END; /
La dernière étape consiste à créer le job, c’est à dire à rattacher le programme au planificateur.
On renseigne ici:
- job_name=> le nom qu’on donne à la tache créee
- program_name => le nom du programme à rattacher
- schedule_name => le nom du planificateur
- job_class => soit une classe de tache que l’on a créé
- auto_drop est utilisé pour les taches destinées à être exécutées une seule fois, le job s' »auto-détruit » (peut être utilisé dans le cas d’une insertion dans une table avec une clé primaire unique)
BEGIN sys.dbms_scheduler.create_job( job_name => '"PROPRIETAIRE"."ma_supertache"', program_name => 'PROPRIETAIRE.mon_scheduler', schedule_name => 'PROPRIETAIRE.mon_scheduler',', job_class => 'DEFAULT_JOB_CLASS', comments => 'Ce que doit faire la tache', auto_drop => FALSE, enabled => TRUE); END; /
Requêtes permettant de vérifier le bon fonctionnement des actions planifiées.
Il est ainsi possible de voir si les 3 objets sont bien crées avec la requête suivante :
Select OWNER, OBJECT_TYPE, OBJECT_NAME, CREATED, STATUS From DBA_OBJECTS Where OBJECT_TYPE In ('PROGRAM', 'JOB', 'JOB CLASS', 'SCHEDULE', 'WINDOW') and owner='PROPRIETAIRE' Order By OBJECT_TYPE, OBJECT_NAME;
et plus tard de contrôler qu’ils se réalisent bien, grâce à la collecte des dates de dernière réalisation et le status à SUCCEDED que renvoie cette requête:
Select LOG_ID, LOG_DATE, OWNER, JOB_NAME, STATUS From DBA_SCHEDULER_JOB_LOG where owner='PROPRIETAIRE' order by LOG_DATE ASC;
Bien évidemment, il est tout à fait possible de réaliser ces opérations avec la console graphique d’Enterprise Manager Console ou Grid Control, mais c’est moins fun 🙂
1 réflexion sur “Planification d'un job sous Oracle”
Bonjour
Dans le cas ou l’on souhaite exécuter le job à la demande (run_job) et une seule fois, peut on préciser une date bidon dans le schedule, ex « 01/01/2030 » afin qu’il ne s’exécute pas de lui même lorsqu’on le passe à enable ?
Merci
Les commentaires sont fermés.