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 :

[11g] Problème avec trigger


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut [11g] Problème avec trigger
    Hello,
    j'ai un petit problème avec un trigger.

    J'ai une table "employes" qui contient entre autre le salaire de l'employé et le nombre d'enfants qu'il a.
    Il faut que quand on modifie le nombre d'enfant, on enlève/ajoute 200.- par enfant au salaire.

    Mon code actuel est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace trigger TRG_PRIME_ENFANT
    after update
    on EMPLOYES        -- sur la table EMPLOYES
    for each row  -- pour chaque ligne
    begin
      if (:new.NB_ENF !=  :old.NB_ENF) then
        UPDATE EMPLOYES SET salaire = salaire  + 200 * (:NEW.NB_ENF -  :OLD.NB_ENF);
      end if ;
    end ;
    Mais lors de la modification du nombre d'enfants d'un employé, j'ai l'erreur suivante :

    UPDATE "ELCD42"."EMPLOYES" SET NB_ENF = '1' WHERE ROWID = 'AAAW+NAAEAAAEJkAAA' AND ORA_ROWSCN = '37229262'

    One error saving changes to table "ELCD42"."EMPLOYES":
    Row 1: ORA-04091: la table ELCD42.EMPLOYES est en mutation ; le déclencheur ou la fonction ne peut la voir
    ORA-06512: à "ELCD42.TRG_PRIME_ENFANT", ligne 3
    ORA-04088: erreur lors d'exécution du déclencheur 'EJR21.TRG_PRIME_ENFANT'
    Je ne comprend pas d'où vient le problème, quelqu'un aurait une piste pour m'aider ?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    hello

    Je pense que ca ne marche pas à cause du after on ne peut pas modifier la valeur de :new.nom_col dans un trigger after.

    Essaye plutot qqch dans ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE TRIGGER TRG_PRIME_ENFANT
    before UPDATE
    ON employes        -- sur la table EMPLOYES
    FOR each row       -- pour chaque ligne
    begin
      IF (:new.NB_ENF !=  :old.NB_ENF)   then
       :new.salaire := :old.salaire +200 *(:NEW.NB_ENF -  :OLD.NB_ENF) ;
      end IF ;
    end ;
    J'espere que ca t'aidera

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Je te remercie beaucoup !
    C'était bien ça et la requête de mise à jour qui avait une mauvaise syntaxe.

    Bon après-midi

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    No prob...
    bonne aprem

  5. #5
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Reviens ... XDATA ... tu as oublié le tag

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Ah oui !

    Voilà c'est tout bon

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je me demande c'est quoi le résultat si tu modifié simultanément le salaire et le nombre d'enfants avec ce trigger ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    yep,

    je me permet de répondre ce trigger modifie le salaire qu'on on fait un update sur le nombre d'enfant

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par PonGe Voir le message
    yep,

    je me permet de répondre ce trigger modifie le salaire qu'on on fait un update sur le nombre d'enfant
    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
    Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
    Connected as mni
    
    
    SQL> 
    SQL> create table employes
      2  (id         number,
      3   salaire    number(15,2),
      4   nb_enf    number(3)
      5  )
      6  /
    
    Table created
    
    SQL> Insert into employes values (1,1000, 0)
      2  /
    
    1 row inserted
    
    SQL> CREATE OR REPLACE TRIGGER TRG_PRIME_ENFANT
      2  before UPDATE
      3  ON employes        -- sur la table EMPLOYES
      4  FOR each row       -- pour chaque ligne
      5  begin
      6    IF (:new.NB_ENF !=  :old.NB_ENF)   then
      7     :new.salaire := :old.salaire +200 *(:NEW.NB_ENF -  :OLD.NB_ENF) ;
      8    end IF ;
      9  end ;
     10  /
    
    Trigger created
    
    SQL> Select * From employes
      2  /
    
            ID           SALAIRE NB_ENF
    ---------- ----------------- ------
             1           1000,00      0
    
    SQL> update employes
      2    Set salaire = 1100,
      3        nb_enf = 2
      4  /
    
    1 row updated
    
    SQL> Select * From employes
      2  /
    
            ID           SALAIRE NB_ENF
    ---------- ----------------- ------
             1           1400,00      2
    
    SQL>
    N'importe quoi ...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    Excuse j'avais lu trop vite ta question...

    Du coup il ne prend pas l'update du salaire en compte...

  11. #11
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par PonGe Voir le message
    Excuse j'avais lu trop vite ta question...

    Du coup il ne prend pas l'update du salaire en compte...
    Ce n’est pas grave mais je trouve que c’est un bel exemple des conneries qu’on peut faire avec les triggers.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    O pire si on veut prendre en compte l'update du salaire avec on fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE TRIGGER TRG_PRIME_ENFANT
    before UPDATE
    ON employes        -- sur la table EMPLOYES
    FOR each row       -- pour chaque ligne
    begin
      IF (:new.NB_ENF !=  :old.NB_ENF)   then
       :new.salaire := :new.salaire +200 *(:NEW.NB_ENF -  :OLD.NB_ENF) ;
      end IF ;
    end ;

  13. #13
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Toi tu utiliserais une application avec pareil comportement ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    Envoyé par mnitu
    Ce n’est pas grave mais je trouve que c’est un bel exemple des conneries qu’on peut faire avec les triggers.
    C klr c là qu'on voit qu'il faut se poser les bonnes questions mais bon on acquiert ça avec l'expérience.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    Tout dépend les besoins de Xdata...

    Si une personne se fait augmenter et à un enfant en même temps? Comment calcule t'on son augmentation de salaire?(sur le nouveau ou l'ancien salaire?).

    En tout cas aprés ta remarque pour moi le second code me parait plus adéquat.

  16. #16
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par PonGe Voir le message
    Tout dépend les besoins de Xdata...

    Si une personne se fait augmenter et à un enfant en même temps? Comment calcule t'on son augmentation de salaire?(sur le nouveau ou l'ancien salaire?).
    Null besoin d'un trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> Select id, salaire, nb_enf, salaire + Nb_enf * 200 As Salaire_Total
      2  From employes
      3  /
     
            ID           SALAIRE NB_ENF SALAIRE_TOTAL
    ---------- ----------------- ------ -------------
             1           1400,00      2          1800

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 69
    Par défaut
    C klr ... bien vu

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

Discussions similaires

  1. Problème avec trigger MySQL
    Par el_kiko dans le forum MySQL
    Réponses: 1
    Dernier message: 28/02/2010, 14h23
  2. Problème avec trigger for delete
    Par tornade69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/10/2008, 09h37
  3. Problème avec trigger (table INSERTED)
    Par ygrim dans le forum Développement
    Réponses: 1
    Dernier message: 20/04/2008, 21h00
  4. [WPF] Problème avec Trigger
    Par Heroes dans le forum C#
    Réponses: 7
    Dernier message: 16/07/2007, 16h58
  5. [9i] problème avec trigger after logon
    Par Michael# dans le forum Oracle
    Réponses: 2
    Dernier message: 17/03/2005, 12h14

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