Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/12/2007, 16h54   #1
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
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.
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 02h33   #2
Rédacteur
 
Avatar de Bruno2r
 
Bruno ROMAN-RUIZ
Inscription : décembre 2006
Messages : 2 181
Détails du profil
Informations personnelles :
Nom : Bruno ROMAN-RUIZ
Âge : 57

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : décembre 2006
Messages : 2 181
Points : 2 717
Points : 2 717
Bonsoir,
Tu veux quoi au juste compter ou numéroter ?
__________________
Précisez la VERSION ! Règles du forum Business Objects et FAQ BO
"A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"
Bruno2r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 14h24   #3
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
Code :
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 ?
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 14h28   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
pourquoi pas simplement :

Code :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 16h58   #5
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
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?
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 17h02   #6
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
Code :
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 ??
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 18h19   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 18h44   #8
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

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

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
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 :
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 !!!!
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 18h49   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
dans ce cas autant simplifier :

Code :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 21h35   #10
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
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?
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 22h17   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
mais le trigger se déclenche quand ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 23h01   #12
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
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.
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 08h57   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 10h12   #14
Invité de passage
 
Inscription : décembre 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 8
Points : 4
Points : 4
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 :
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 :
                UPDATE Service SET NbEmploye = NbEmploye + 1 WHERE SerNo = :NEW.Serno
Dans le cas d'un Delete
Code :
                 UPDATE Service SET NbEmploye = NbEmploye - 1 WHERE SerNo = :OLD.Serno

Maintenant il faut initialiser cette colonne NbEmploye
Code :
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 :
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
HLM59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 14h30   #15
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
Merci
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2007, 02h16   #16
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
Code :
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 :
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 :
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 :
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
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2007, 09h19   #17
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et pourquoi tu recrées une discussion ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2007, 09h21   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2007, 16h24   #19
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
Oui,je fais une vue pour mise à jour la colone nbemploye et ensuite faire un trigger qui va insert la nouvelle donnée.

Merci
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2007, 16h51   #20
Membre à l'essai
 
Inscription : octobre 2006
Messages : 115
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 115
Points : 21
Points : 21
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
Type de fichier : jpg 1.JPG (101,2 Ko, 4 affichages)
wang_xue est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h25.


 
 
 
 
Partenaires

Hébergement Web