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 :

Trigger before update erreur ORA-04091


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut Trigger before update erreur ORA-04091
    Bonjour,

    Je viens de créer un trigger before update a son exécution, j'ai l'erreur

    ORA-04091: la table ATLOG.LMP est en mutation ; le déclencheur ou la fonction ne peut la voir
    ORA-06512: à "ATLOG.TBU_OLDLMP", ligne 10
    ORA-04088: erreur lors d'exécution du déclencheur 'ATLOG.TBU_OLDLMP'

    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
     
    create or replace TRIGGER TBU_OLDLMP BEFORE  update of LMP_DTPOSE ON LMP  
    FOR EACH ROW  
    BEGIN  
     
     
       UPDATE LMP SET LMP.LMP_AN1 = (SELECT RLMP_LIB FROM RLMP WHERE RLMP.RLMP_ICODE= :NEW.RLMP_ICODE) WHERE LMP.LMP_ICODE=:NEW.LMP_ICODE;
     
       UPDATE LMP SET LMP.LMP_AN2 = (SELECT MLMP_LIB FROM MLMP, RLMP WHERE AND RLMP.MLMP_ICODE = MLMP.MLMP_ICODE AND RLMP.RLMP_ICODE= :NEW.RLMP_ICODE )  WHERE LMP.LMP_ICODE=:NEW.LMP_ICODE;
     
       UPDATE LMP SET LMP.LMP_NU1 = :OLD.LMP_AGE WHERE LMP.LMP_ICODE=:NEW.LMP_ICODE;
     
       UPDATE LMP SET LMP.LMP_DATE1 = :OLD.LMP_DTPOSE WHERE LMP.LMP_ICODE=:NEW.LMP_ICODE;
     
     
    END;
    En clair, j'aimerai avant de valider la modification de la colonne LMP_DTPOSE
    qui se trouve dans la table LMP

    Copier la valeur de la colonne RLMP_LIB (table RLMP) dans la colonne LMP_AN1 (table LMP), l'identifiant de la table RLMP se trouve dans la table LMP (RLMP_ICODE)
    Copier la valeur de la colonne MLMP_LIB dans la colonne LMP_AN2 (table LMP)
    l'identifiant de la table MLMP (MLMP_ICODE) se trouve dans la table RLMP

    Copier la valeur de la colonne LMP_AGE dans la colonne LMP_NU1, LMP_AGE et LMP_NU1 sont des colonnes de la table LMP
    Copier la valeur de la colonne LMP_DTPOSE dans la colonne LMP_DATE1
    LMP_DTPOSE et LMP_DATE1
    sont des colonnes de la table LMP

    Je chercher d'ou peut venir cette erreur.

    Cdt

    Cyril

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Arg... 4 updates qui modifient les mêmes lignes, un seul aurait suffit !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UPDATE LMP 
    SET LMP.LMP_AN1 = (SELECT RLMP_LIB FROM RLMP WHERE RLMP.RLMP_ICODE= :NEW.RLMP_ICODE),
    		LMP.LMP_AN2 = (SELECT MLMP_LIB FROM MLMP, RLMP WHERE AND RLMP.MLMP_ICODE = MLMP.MLMP_ICODE AND RLMP.RLMP_ICODE= :NEW.RLMP_ICODE ) 
    		LMP.LMP_NU1 = :OLD.LMP_AGE,
        LMP.LMP_DATE1 = :OLD.LMP_DTPOSE
    WHERE LMP.LMP_ICODE=:NEW.LMP_ICODE;
    Mais bon, ça ne va pas corriger le Mutating Table
    LMP_ICODE, c'est pas une clé unique ?
    Parce que si tu dois mettre à jour la ligne de LMP actuellement traitée par le trigger (grâce au for each row), il suffit d'affecter les new
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :SELECT RLMP_LIB INTO :NEW.LMP_AN1 FROM RLMP WHERE RLMP.RLMP_ICODE= :NEW.RLMP_ICODE;
    SELECT MLMP_LIB INTO :NEW.LMP_AN2 FROM MLMP, RLMP WHERE AND RLMP.MLMP_ICODE = MLMP.MLMP_ICODE AND RLMP.RLMP_ICODE= :NEW.RLMP_ICODE;
    :NEW.LMP_NU1 = :OLD.LMP_AGE;
    :NEW.LMP_DATE1 = :OLD.LMP_DTPOSE;

  3. #3
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    merci de ta réponse
    Le code LMP_ICODE est unique.
    Je vais tester.

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

Discussions similaires

  1. Trigger Before Update
    Par sat83 dans le forum Débuter
    Réponses: 1
    Dernier message: 14/04/2009, 10h52
  2. erreur ora-04091:table mutante
    Par lido dans le forum PL/SQL
    Réponses: 7
    Dernier message: 09/02/2009, 12h26
  3. Syntaxe Trigger before update
    Par dcabe dans le forum PL/SQL
    Réponses: 8
    Dernier message: 21/07/2008, 09h53
  4. Trigger before update
    Par Virtuosity dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/05/2008, 10h26
  5. Problème trigger BEFORE UPDATE
    Par berceker united dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 30/08/2006, 16h55

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