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 :

PL/SQL problème sur Trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Par défaut PL/SQL problème sur Trigger
    Bonjour,

    Je débute en ce qui concerne les trigger sous Oracle et j'ai beau m'acharner mais celui que j'essaye de faire ne marche pas...

    Je travaille sur 2 tables : Emp et Dept (Employés et Départements)

    Dans la table Emp j'ai les employés avec leur métier (JOB) et leur numéro de département (DEPTNO).
    Dans la table Dept j'ai les départements (DEPTNO) et le nombre de métier par département (NbMetierDep).

    Pour mettre à jour la colonne NbMetierDep j'ai créer une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE FUNCTION Departement (dept NUMBER) RETURN NUMBER IS
    metier NUMBER;
    BEGIN
    	SELECT COUNT(DISTINCT JOB) INTO metier FROM emp WHERE DEPTNO = dept;
    	RETURN metier;
    END;
    /
    Pour mon trigger voici ma 1ere version (qui ne marche pas) :

    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
     
    CREATE OR REPLACE TRIGGER majNbMetierDept
    BEFORE INSERT OR DELETE OR UPDATE OF JOB ON Emp
    	FOR EACH ROW
     
    BEGIN
        CASE
    	WHEN INSERTING THEN
    		UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
    		WHERE deptno = :NEW.deptno;
    	WHEN DELETING THEN
    		UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
    		WHERE deptno = :OLD.deptno;
    	WHEN UPDATING THEN
    		UPDATE 	dept SET NbMetierDep = Departement(:NEW.deptno)
    		WHERE deptno = :NEW.deptno;
    		UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
    		WHERE deptno = :OLD.deptno;
       END CASE;
    END;
    /
    Et la 2 eme version qui ne marche pas plus...

    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
     
    CREATE OR REPLACE TRIGGER majNbMetierDept
    BEFORE INSERT OR DELETE OR UPDATE OF JOB ON Emp
    	FOR EACH ROW
    DECLARE
     
    CURSOR c1 IS SELECT * from dept;
    	C1_enr NUMBER;
    BEGIN
    C1_enr := 0;
        CASE
    	WHEN INSERTING THEN
    		FOR c1_enr IN C1 LOOP
    			UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
    			WHERE deptno = :NEW.deptno;
    		END LOOP;
    	WHEN DELETING THEN
    		FOR c1_enr IN C1 LOOP
    			UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
    			WHERE deptno = :OLD.deptno;
    		END LOOP;
    	WHEN UPDATING THEN
    		FOR c1_enr IN C1 LOOP
    			UPDATE 	dept SET NbMetierDep = Departement(:NEW.deptno)
    			WHERE deptno = :NEW.deptno;
    			UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
    			WHERE deptno = :OLD.deptno;
    		END LOOP;
       END CASE;
    END;
    /
    En fait quand j'ajoute une ligne à Emp cela modifie bien mon nombre de metiers dans Dept mais quand je veux supprimer ou mettre à jour, il me dit que mon trigger ne vas pas voir le changement.

    Si quelqu'un a la patience de s'y pencher, merci d'avance !

    [/quote]

  2. #2
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Si vous nous expliquiez plutôt et en français ce que vous souhaitez faire ? ;-) (le code, on s'en moque un peu, ce qui est important, c'est vos besoins !)

    Après, si vous rencontrez des erreurs, le mieux est de nous donner le code et le libellé exact de l'erreur !

  3. #3
    Membre éclairé Avatar de Cereal123
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2004
    Messages : 414
    Par défaut
    Bonjour,

    Votre trigger est déclaré "BEFORE", ce qui veut dire effectivement que le calcul va être effectué avant que la ligne ne soit ajoutée/modifiée/supprimée. Il vaudrait mieux le déclarer "AFTER"...
    C.

  4. #4
    CD
    CD est déconnecté
    Membre éprouvé
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Par défaut
    Le problème vient en effet de l'utilisation de l'ancienne valeur dans le delete, ou de la nouvelle valeur sur l'update.

    Dans ce cas, il possède 2 versions de la table, une avant le déclenchement du trigger, et une pendant le déclenchement du trigger lorsque l'on fait la mise à jour (update, delete ou insert).

    Pour pallier cela, le plus simple serait d'utiliser un trigger AFTER comme indiqué précédemment. Il aura par contre l'inconvénient de faire parcourir toute la table Emp à chaque mise à jour pour mettre à jour dept :

    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
      1  create or replace trigger majdelete
      2  after delete or insert or update of job on emp
      3  begin
      4  update dept set NbMetierDep = Departement(deptno);
      5* end;
    SQL> /
     
    DÚclencheur crÚÚ.
     
    SQL> insert into emp values(0203, 'Toto', 'Forumiste', 7782, sysdate, 100, null,
     10);
     
    1 ligne crÚÚe.
     
    SQL> select * from dept;
     
        DEPTNO DNAME          LOC           NBMETIERDEP
    ---------- -------------- ------------- -----------
            10 ACCOUNTING     NEW YORK                4
            20 RESEARCH       DALLAS                  3
            30 SALES          CHICAGO                 3
            40 OPERATIONS     BOSTON                  0
     
    SQL> delete from emp where empno=0203;
     
    1 ligne supprimÚe.
     
    SQL> select * from dept;
     
        DEPTNO DNAME          LOC           NBMETIERDEP
    ---------- -------------- ------------- -----------
            10 ACCOUNTING     NEW YORK                3
            20 RESEARCH       DALLAS                  3
            30 SALES          CHICAGO                 3
            40 OPERATIONS     BOSTON                  0
     
    SQL> insert into emp values(0203, 'Toto', 'Forumiste', 7782, sysdate, 100, null,
     10);
     
    1 ligne crÚÚe.
     
    SQL> update emp set (job, deptno)=(select 'Forumeux', 20 from dual) where empno=
    0203;
     
    1 ligne mise Ó jour.
     
    SQL> select * from dept;
     
        DEPTNO DNAME          LOC           NBMETIERDEP
    ---------- -------------- ------------- -----------
            10 ACCOUNTING     NEW YORK                3
            20 RESEARCH       DALLAS                  4
            30 SALES          CHICAGO                 3
            40 OPERATIONS     BOSTON                  0

  5. #5
    Membre éclairé Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Par défaut
    je n'ai pas acces à Oracle actuellement pour tester meme si ça me semble bien marcher là

    C'est beaucoup plus simple que je ne le pensais...
    En tout cas merci beaucoup pour votre aide !


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

Discussions similaires

  1. [SQL] problème sur le delete
    Par luimême dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/06/2007, 11h23
  2. [SQL] problème sur un group by
    Par d_token dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/09/2006, 10h38
  3. Réponses: 6
    Dernier message: 31/03/2006, 17h05
  4. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55
  5. [PL/SQL] problème de trigger
    Par Chuck67 dans le forum Oracle
    Réponses: 14
    Dernier message: 09/12/2004, 23h17

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