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 sql "complexe"


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut Trigger sql "complexe"
    Bonjour à tous,

    Voila plusieurs jours que je travaille sur une question de Travaux pratiques de SQL sans trouver la réponse à ma question et ce malgré de très très nombreux tests. Je deviens totalement fou, je suis persuadé de passer non loin de la solution mais je rencontre toujours la même erreur.

    Voila rapidement la chose :
    J'ai ces trois tables-là

    Employee(EmpNo, Name, Job, Mgr, Hiredate, Sal , Comm, DeptNo);
    SalaryGrade(Grade, LoSal, HiSal);
    Department(DeptNo, DName, Loc, NBEmployé, NBMétier);

    La question est la suivante : Créer un déclencheur qui, pour chaque mise à jour (insertion ou suppression ou modification) de l’affectation d’un employé, incrémente ou décrémente le nombre d’employés par département.

    J'utilise SQL Developer de Oracle

    Je n'ai volontairement pas précisé la structure de création de mes tables car je pense pas que le problème vienne de la et surtout cela va surcharger mon message et démotiver les éventuelles réponses .

    Pour ce faire, voila la solution que j'ai apportée :

    1er ) je crée une fonction qui prend en paramètre DeptNo et qui me retourne le nombre d'employés pour ce dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE FUNCTION fonction4 (NoDépt IN Employee.DeptNo%TYPE) RETURN NUMBER IS
    CURSOR C1 IS SELECT *
    FROM Employee ;
    Nb NUMBER(3):=0;
    BEGIN
       FOR C1_enr IN C1 LOOP
           IF C1_enr.DeptNo = NoDépt THEN
              Nb := Nb + 1 ;
           END IF;
       END LOOP ;
    RETURN Nb;
    END fonction4 ;
    2) ensuite je crée une procédure faisant appel à la fonction ci-dessus, procédure qui me sera utile dans le trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE PROCEDURE NBEmploye AS
    CURSOR c IS  
    SELECT * 
    FROM Department;
    Nb NUMBER;
    BEGIN
        FOR Cur IN c LOOP 
            Nb := fonction4(Cur.DeptNo);
            UPDATE Department
            SET NBEmployé = Nb  
            WHERE DeptNo = Cur.DeptNo;
        END LOOP;
    END;
    Puis je crée le trigger se déclenchant lors d'une mise à jour sur la table employé, ce qui va lancer la procédure qui elle-même appelle la fonction qui va s'occuper de mettre à jour le champ NBEmployé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER Incremente
    AFTER INSERT OR DELETE OR UPDATE OF EmpNo ON Employee
    FOR EACH ROW
    BEGIN
        NBEmploye() ;
    END ;
    Tout se passe bien mais quand je fais un test du style
    DELETE FROM Employee WHERE EmpNo = 'un numéro d'employé de ma base', eh bien en sortie j'ai une jolie erreur me disant "La table EMPLOYEE est en mutation ; le déclencheur ou la fonction ne peut la voir"

    Je comprends cette erreur mais je n'ai pas réussi à la contourner. A savoir que j'ai cherché pleiiiiins de méthodes, et que je vous donne celle qui me semble être la plus propre et surtout la plus juste. Celle que je rendrais si je ne trouve pas de solution à mon problème.

    Avez-vous des suggestions ? Je suis preneur, merci d'avance !
    Bonne journée.

    Edit : En espérant que cette reformulation sera bonne, je vous souhaite une bonne journée.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Commencez par respecter la charte de postage. Impossible de vous aider sans cela !

    A lire : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Ok, modifications effectuées, il me semble remplir plus ou moins les 7 critères demandés.

    En espérant que vous m'aiderez à trouver, je vous souhaite à toutes et à tous une excellente journée.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Ne pas faire de curseur, inutile et cause de la table en mutation, directement gérer le +1 -1 dans l'update.
    Regarde Vérifier le nombre de places disponibles avant insertion

    Mais dans un contexte hors scolaire la réponse serait : ne pas faire de trigger mais juste une requête, et si besoin créer une vue...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Par défaut
    Bonjour et merci de ta réponse,
    si je saisi bien tu me parles du curseur de la procédure que je dois enlever, c'est bien ça ? Le curseur de la fonction "fonction4" je le laisse ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Non aucun curseur, d'une manière plus générale pas de requête sur la table employee faisant l'objet du trigger
    Regarde également les explications sur le tuto Table en mutation

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

Discussions similaires

  1. [SQL] Problème de quotes
    Par FredLam dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/05/2007, 12h30
  2. [Requête/SQL]Pb de "quote" avec un type memo
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/04/2007, 15h47

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