IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème de communication d'un DBMS_JOB avec une table


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut Problème de communication d'un DBMS_JOB avec une table
    Bonjour, je désire créer un job qui permet d'éxécuter une procédure stockée selon un paramètre (la valeur de ce paramètre est le contenue d'une colonne dans une table), par exemple si je veux lancer la procédure chaque début de semaine, j'ai une colonne NBJOURS = 7, donc mon job doit lire la valeur de cette colonne et faire comparaison avec la date system pour voir si on doit lancer la procédure ou pas.
    problème 1):
    merci de m'indiquer comment faire pour que mon job puisse communiquer avec la table FREQUENCE si c est fesable avec le JOB.?

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    La solution consiste à utiliser un trigger BEFORE UPDATE OF NBJOURS ON FREQUENCE et rajouter un nojob dans la table FREQUENCE pour garder le dernier numero de job lancé, à chaque fois quand change le champ nbjours dans la table fréquence le trigger va supprimer l'ancien job et va creer un job avec le nouveau nbjours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    SQL>   SELECT JOB,WHAT,NEXT_DATE FROM USER_JOBS;
     
    no rows selected
     
    SQL>   DROP TABLE FREQUENCE;
     
    Table dropped.
     
    SQL>  CREATE TABLE FREQUENCE (NBJOURS NUMBER, NOJOB NUMBER);
     
    Table created.
     
    SQL>  INSERT INTO FREQUENCE VALUES(7,NULL);
     
    1 row created.
     
    SQL> DROP PROCEDURE P;
     
    Procedure dropped.
     
    SQL>  CREATE OR REPLACE PROCEDURE P IS 
      2          BEGIN 
      3         NULL;
      4          END ;
      5         /
     
    Procedure created.
     
    SQL> 
    SQL> 
    SQL>  DECLARE  
      2      V_JOBNO NUMBER;
      3      V_NBJOURS NUMBER:=7;
      4       BEGIN 
      5      SELECT NBJOURS 
      6      INTO V_NBJOURS 
      7      FROM FREQUENCE ;
      8       DBMS_JOB.SUBMIT(V_JOBNO, 'P;', TRUNC(SYSDATE) + V_NBJOURS , ' TRUNC(SYSDATE) +'|| V_NBJOUR
    S); 
      9      UPDATE FREQUENCE SET NOJOB=V_JOBNO ;
     10      COMMIT ; 
     11      END; 
     12      / 
     
    PL/SQL procedure successfully completed.
     
    SQL> 
    SQL> 
    SQL> 
    SQL>  SELECT * FROM FREQUENCE;
     
       NBJOURS      NOJOB
    ---------- ----------
             7         81
     
    SQL> 
    SQL>  DESC USER_JOBS;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     JOB                                       NOT NULL NUMBER
     LOG_USER                                  NOT NULL VARCHAR2(30)
     PRIV_USER                                 NOT NULL VARCHAR2(30)
     SCHEMA_USER                               NOT NULL VARCHAR2(30)
     LAST_DATE                                          DATE
     LAST_SEC                                           VARCHAR2(8)
     THIS_DATE                                          DATE
     THIS_SEC                                           VARCHAR2(8)
     NEXT_DATE                                 NOT NULL DATE
     NEXT_SEC                                           VARCHAR2(8)
     TOTAL_TIME                                         NUMBER
     BROKEN                                             VARCHAR2(1)
     INTERVAL                                  NOT NULL VARCHAR2(200)
     FAILURES                                           NUMBER
     WHAT                                               VARCHAR2(4000)
     NLS_ENV                                            VARCHAR2(4000)
     MISC_ENV                                           RAW(32)
     INSTANCE                                           NUMBER
     
    SQL>  
    SQL> 
    SQL>  COLUMN WHAT FORMAT A50;
    SQL> 
    SQL>   SELECT JOB,WHAT,NEXT_DATE FROM USER_JOBS UJ WHERE EXISTS( SELECT 1 FROM FREQUENCE F WHERE UJ.
    JOB=F.NOJOB);
     
           JOB WHAT                                               NEXT_DATE
    ---------- -------------------------------------------------- ---------
            81 P;                                                 23-NOV-08
     
    SQL> 
    SQL>  
    SQL>  CREATE TRIGGER FREQUENCE_CHANGE 
      2      BEFORE UPDATE OF NBJOURS ON FREQUENCE
      3       FOR EACH ROW 
      4      BEGIN 
      5      DBMS_JOB.REMOVE(:OLD.NOJOB );
      6      DBMS_JOB.SUBMIT(:NEW.NOJOB, 'P;',TRUNC(SYSDATE) +  :NEW.NBJOURS, ' TRUNC(SYSDATE) +'||:NEW.
    NBJOURS); 
      7      END ;
      8      /
     
    Trigger created.
     
    SQL> 
    SQL> UPDATE FREQUENCE SET NBJOURS=5;
     
    1 row updated.
     
    SQL> 
    SQL> SELECT * FROM FREQUENCE;
     
       NBJOURS      NOJOB
    ---------- ----------
             5         82
     
    SQL> 
    SQL> SELECT JOB,WHAT,NEXT_DATE FROM USER_JOBS UJ WHERE EXISTS( SELECT 1 FROM FREQUENCE F WHERE UJ.JO
    B=F.NOJOB);
     
           JOB WHAT                                               NEXT_DATE
    ---------- -------------------------------------------------- ---------
            82 P;                                                 21-NOV-08
     
    SQL> 
    SQL> 
    SQL> SELECT JOB,WHAT,NEXT_DATE FROM USER_JOBS ;
     
           JOB WHAT                                               NEXT_DATE
    ---------- -------------------------------------------------- ---------
            82 P;                                                 21-NOV-08
     
    SQL>

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    En faite et malheureusement le nombre de jour ne change pas dans la table frequence, donc je peux pas y faire un trigger qui se lance aprés ce update, je vous donne un exemple :
    voici la structure de la table frequence :
    je veux lancer ma procédure stocké chaque deux jours, donc mon job doit faire l 'opération suivante :
    lire la valeur de colonne nbJours de la table frequence (dans ce cas va contenir la valeur 2),et lire la valeur de la colonne dateDerniereExécution et voir si la date de (derniere exécution + 2 jours) coincide avec la date d'aujourd huit,si c'est le cas, on exécute la procédure.
    j'espère que c'est un peu claire.
    Merci infiniment pour votre aide.

  4. #4
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    dbms_job fait tout ca sans passer par une autre table ,trigger ....

    par ex : tous les 2 jours à 6 H du mat

    DECLARE jobno number;
    BEGIN
    DBMS_JOB.SUBMIT(job => jobno, what => 'MA_PROC;',next_date => trunc(SYSDATE + 2) + 6/24 ,
    interval => 'trunc(sysdate + 2) + 6/24');
    END;
    /

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Citation Envoyé par fatsora Voir le message
    dbms_job fait tout ca sans passer par une autre table ,trigger ....
    Salut fatsora,

    Dans mon post j'ai utilisé le trigger en pensant que la fréquence d'exécution de la procédure depant du champ nbjours.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Par défaut
    Salut fatsora, Le problème c'est que ce paramètre (dans ton exemple tu as donné deux jours à 6h du matin), le problème ce paramètre on doit le lire à partir d'une table.
    est-ce fesable?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de communication d'un JOB avec une table
    Par amine1980 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 16/11/2008, 18h15
  2. Réponses: 6
    Dernier message: 03/04/2006, 09h42
  3. [JSTL] Problème avec une table
    Par lionelh dans le forum Taglibs
    Réponses: 3
    Dernier message: 22/02/2006, 21h26
  4. Problème avec une table
    Par Paulinho dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 15/12/2005, 10h17
  5. Réponses: 11
    Dernier message: 28/12/2004, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo