Planification d'un job sous Oracle

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”

  1. 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.