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 ou procedure pour compter le nombre et calculer la note


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut PL/SQL faire un petit trigger
    bonjour je veux faire un trigger qui va compter le nombre de employe a l'aide SerNo(service numero)
    J'ai deux table suivant:
    Employe(EmpNo,nom,prenom, chef, salaire, commission,SerNo)
    Service(SerNo,Nom,Lieu)

    Je rajoute un colone dans Service qui s'appelle NbEmploye
    Comment je peut faire un trigger qui va compter le nombre employe et affecter la valeur dans la colone NbEmploye.

  2. #2
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Par défaut
    Bonsoir,
    Tu veux quoi au juste compter ou numéroter ?
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    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
    ---je cree une vue pour visualiser update
    CREATE OR REPLACE VIEW VW_Service AS
    Select SerNo,NomS,Lieu,NbEmploye
    From   SERVICE;
    
    ---je cree un trigger pour compter nombre de employe à l'aide SerNo dans la table employe.
    
    CREATE OR REPLACE TRIGGER VW_Service
     INSTEAD OF UPDATE     -- à la place de l'insertion
     ON VW_Service         -- sur la vue VW_Service
     FOR EACH ROW          -- pour chaque ligne
     DECLARE
     NB_Employe INTEGER;
     BEGIN
     SELECT COUNT(*) INTO NB_Employe
     FROM Employe e
     WHERE e.SerNo=:NEW.SerNo; 
     UPDATE SERVICE 
     set NbEmployes=NB_Employe;
     End ;
     /
    je ne sais pas comment je peux tester ?

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi pas simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     UPDATE SERVICE 
     set NbEmployes=(SELECT COUNT(*) INTO NB_Employe
     FROM Employe e
     WHERE e.SerNo=:NEW.SerNo);
    pour tester bah tu essayes de faire un update sur la vue... mais j'ai rien compris au besoin

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    Je veux faire un trigger pour disposer de l'information NbEmploye dans la table SERVICE, Pour cela ,j'ai ajouter une colone NbEmploye avec pour valeur par défaut 0,ensuite ,je veux calculer le nombre de NbEmloye.

    Donc je fais une vue et dans cette je fais un trigger.

    les deux tables sont suivant

    Employe(EmpNo,Nom,Prenom, Fonction,Chef,DateEmbauche,Salaire,Commission,SerNo)

    Service(SerNo,Nom,Lieu)

    normalement je peux calculer le nombre de employe à l'aide de SerNo?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    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
     
    CREATE OR REPLACE TRIGGER VW_Service
     INSTEAD OF UPDATE     -- à la place de l'insertion
     ON VW_Service         -- sur la vue VW_Service
     FOR EACH ROW          -- pour chaque ligne
     DECLARE
     NB_Employe INTEGER;
     BEGIN
     SELECT COUNT(*) INTO NB_Employe
     FROM Employe e
     WHERE e.SerNo=:NEW.SerNo; 
     UPDATE SERVICE 
     SET NbEmployes=(SELECT COUNT(*) INTO NB_Employe
     FROM Employe e
     WHERE e.SerNo=:NEW.SerNo);
     End ;
     / 
     
    Avertissement : Déclencheur créé avec erreurs de compilation.
    Comment faire ??

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par wang_xue Voir le message
    Donc je fais une vue et dans cette je fais un trigger.
    Mais quel est le role de la vue ? Pourquoi ne pas faire un UPDATE tout simplement ?

  8. #8
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Mais quel est le role de la vue ? Pourquoi ne pas faire un UPDATE tout simplement ?
    Ou faire un select dans la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE VIEW VW_Service AS
    Select SerNo,NomS,Lieu,(SELECT COUNT(*)  FROM Employe e
     WHERE e.SerNo=service.SerNo) NbEmploye
    From   SERVICE;
    Oulala, je sens que je vais m'en prendre plein.... la vue !!!!

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    dans ce cas autant simplifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE VIEW VW_Service AS
    Select SerNo,NomS,Lieu,COUNT(*) NbEmploye
    From   SERVICE s,Employe e
     WHERE e.SerNo=s.SerNo
    GROUP BY SerNo,NomS,Lieu

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    Mais je dois réaliser avec trigger pas faire une vue,c'est pour ça,je ne sais pas comment faire?

    Mon but est un trigger qui va réaliser calculer le nombre de employer dans la vue et après quand je fais select * from service,je peux voir la colone NbEmploye va changer de 0 à 2 par exemple,par défaut ,la colone NbEmploye est 0,je trouve sur le tutoriel sql,il a dit qu'il faut faire une vue avec un trigger,je le fais presque pareil,mais il marche pas?

  11. #11
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    mais le trigger se déclenche quand ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    j'ai déjà les données dans la table employe avec les service numéros,je veux savoir combien de employe pour un meme service par exemple,

    le serno est 20 dans la table employe,il y 2 serno 20,je calcule 2 service numero est 20 et je veux affecter à la colone nbemploye est 2.

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    J'ai bien compris mais quand veux tu que le trigger se déclenche ? Quand tu ajoutes un employé ou quand tu ajoutes un service ? et la colonne Nbemploye doit être dans une vue ou dans la table service ?

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    Tu as deux tables

    Employe(EmpNo,nom,prenom, chef, salaire, commission,SerNo)
    Service(SerNo,Nom,Lieu,NbEmploye)

    Tu souhaites renseigner le champ NbEmploye de Service avec le nombre d'employé avec le même SerNo

    Le trigger doit se déclencher sur les modifications de la table Employe

    Dans le cas d'un Update : il faut gérer le cas d'un changement de SerNo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                if :NEW.SerNo <> :OLD.SerNo then              
                     UPDATE Service set NbEmploye = NbEmploye + 1 where SerNo = :NEW.Serno
                     UPDATE Service set NbEmploye = NbEmploye - 1 where SerNo = :OLD.Serno
                end if;
    Dans le cas d'un Insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    UPDATE Service set NbEmploye = NbEmploye + 1 where SerNo = :NEW.Serno
    Dans le cas d'un Delete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                     UPDATE Service set NbEmploye = NbEmploye - 1 where SerNo = :OLD.Serno

    Maintenant il faut initialiser cette colonne NbEmploye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Service set NbEmploye = (select count(1) from Employe where Employe.SerNo = Service.SerNo)


    Ce qui manque...peut être car je ne connaît pas les fonctionnalités de ton application.
    Ne pas oublier le cas d'insertion d'un employe avec un SerNo inexistant

    Dans le trigger , il faut tester si SQL%rowcount > 0 alors l'update a fonctionné sinon créer la ligne

    Pour l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Service(SerNo,NbEmploye) 
    select SerNo , count(1) 
    from Employe E
    where not exists ( select 1 from service s where s.SerNo=E.SerNo)
    group by SerNo

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    Merci

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    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
     
     
    EMPNO  NOM   PRENOM FONCTION CHEF DATEEMBA SALAIRE  COMMISSION SERNO
    ---------- ---------- ----------
    7369 Dupont Jean     Secretaire 7902 17/12/80    800                         20
     
    7499 Martin  Adam    Vendeur    7698 20/02/81    1600      300            30
     
    7521 Dupuy  Maurice  Vendeur   7839 22/09/80  7000        500            30
     
    7566DeschampsJean   Gerant     7839 02/04/81  2975                        20
     
    7654 Martin   Bernard Vendeur    7698 28/09/81 1250       1400           30
     
    7698 Bourgeois Joël    Gerant      7839 01/05/81 2850                       30
     
    7782 Lapotre   Albert  Gerant      7839 09/06/81 2450                       10
     
    7788 Remond  Pierre   Secretaire  7566 09/11/81 3000                       20
     
    7839 Ramirez  Jules    President            17/11/81 5000                     20
     
    7844 Turpin     Claire   Vendeur     7698 08/09/81 1500          0           30
     
    7876 Jaillot      Elodie  Secretaire   7788 23/09/81 1100                    20
     
    7900 Sibille      Lionel   Vendeur     7698 03/12/81 950                      30
     
     
    7902 Jamme    Michelle  Gerant     7566 03/12/81 3000                    20
     
    7934 Chauvet Sylvie   Secretaire  7782 23/01/82 1300                    10
     
     
    14 ligne(s) sélectionnée(s).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
      SERNO NOMS                           LIEU        NBEMPLOYE
    ---------- ------------------------------ ---------- ----------
            10 Comptabilite                   Paris                    0
            20 AffairesGénérales              Dijon                  0
            30 Ventes                         Besançon               0
            40 RessourcesHumaines             Lyon               0
    Je veux creer un trigger renseigner le champ NbEmploye de Service avec le nombre d'employé avec le même SerNo.

    Selon les proposition:
    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
     
    CREATE OR REPLACE TRIGGER tri
     BEFORE UPDATE ON EMPLOYE     
     FOR EACH ROW                 
     BEGIN
        UPDATE Service 
        SET NbEmploye = NbEmploye + 1 
        WHERE SerNo = :NEW.Serno;
     End ;
     /
    UPDATE SERVICE
        SET NbEmploye = NbEmploye + 1
        WHERE SerNo = 10;
    1 ligne mise à jour.
      SERNO NOMS                           LIEU        NBEMPLOYE
    ---------- ------------------------------ ---------- ----------
            10 Comptabilite                   Paris               1
            20 AffairesGénérales              Dijon               0
            30 Ventes                         Besançon            0
            40 RessourcesHumaines             Lyon                0
    il change un par un.Je veut pas faire comme ça,comment les deux tables employe et service.Je vais faire une vue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE VIEW VW_Service AS
    Select SerNo,NomS,Lieu,(SELECT COUNT(*)  FROM Employe e
     WHERE e.SerNo=service.SerNo) NbEmploye
    From   SERVICE;
     
    select * from VW_Service;
    Si je cree une vue,elle peut faire compter le nombre employe.Mais mon but est cree un trigger,je ne sais pas comment faire et aussi comment tester

  17. #17
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et pourquoi tu recrées une discussion ?

  18. #18
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    visiblement, tu n'as pas compris le role du trigger. Un trigger se déclenche à chaque ligne comme tu l'as vu. Donc tu dois d'abord faire un update de ta colonne pour remettre à jour le nombre d'employé sur toute la table et ensuite, créée ton trigger qui se chargement de maintenir la colonne à jour.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut
    Oui,je fais une vue pour mise à jour la colone nbemploye et ensuite faire un trigger qui va insert la nouvelle donnée.

    Merci

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 115
    Par défaut trigger ou procedure pour compter le nombre et calculer la note
    Je veux faire un trigger ou procedure pour compter le nombre de transaction,mais je trouve mon schema y des problemes,je ne sais pas comment corriger?S'il est correct,je peux faire un trigger pour compter le nombre de transaction,comme chaque fois une insertion des données,il va incrementer dans l'attribut NombreTransaction.
    Le même souci pour noteevaluation,je veux faire un PL/SQL pour calculer le note de evaluation pour la parite de acheteur et vendeur,et ensuite je vais mettre à jour sur evaluationutilisateur dans la table gestiondesutilisateur,est-ce que je dois faire deux attriuts dans la table gestiondesutilisateur et renommer comme evaluation acheteur et evaluation vendeur ou je laisse evaluationutilisateur comme ça?
    Images attachées Images attachées  

Discussions similaires

  1. Shell script pour compter le nombre de fichiers par extension
    Par andress33 dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 30/03/2015, 01h26
  2. Réponses: 7
    Dernier message: 10/10/2007, 19h23
  3. Requête pour compter le nombre de fils de chaque parent
    Par santana2006 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/08/2006, 16h08
  4. Requete pour compter le nombre de champs
    Par kichemans dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/04/2006, 14h12
  5. fonction pour compter le nombre de checkbox coché ?
    Par Death83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/09/2005, 11h28

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