Sauter au contenu

Planification d’un job sous Oracle

30 mai 2011
by

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 :-)

Un commentaire laisser un →
  1. noel g. permalien
    20 juin 2011 16:27

    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

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 385 followers