Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 02/03/2008, 16h40   #1
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Par défaut problemes avec les triggers.

salut voila je viens de créer mes tables issues de mon mcd mais j'ai du mal avec les triggers,l'éxo et que je n'ai pas afficher dit:" quand un nouveau vol a eu lieu, non seulement le compteur de l'avion de l'avion est mis à jour mais aussi le compte d'un pilote doit être debité du cout du vol.

voici mes tables:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
CREATE TABLE PILOTE(
nom CHAR (30) ,
prenom    CHAR (30),
adresse   CHAR (30),
NbHVol    INT ,
Brevet    INT,
position  FLOAT,
Habil     CHAR (30),
CONSTRAINTS pk_Pilote  PRIMARY KEY (nom)) ;
 
 
CREATE TABLE AVION (
immat     INT  ,
TYPE    CHAR (30) ,
PRIX      FLOAT,
COMPTH  INT,
CARAC    CHAR (30),
CONSTRAINTS pk_Avion  PRIMARY KEY (immat));
 
 
 
 CREATE TABLE AEROCLUB (
 raison  char(30) ,
 divers  char(30),
CONSTRAINTS pk_AEROCLUB  PRIMARY KEY (raison));
 
 
CREATE TABLE MvtComptHvol(
nom     CHAR (30)
codmouv    CHAR(4),
codnat      CHAR(4),
datmouv         DATE,
Montant  Float,
CONSTRAINTS pk_MvtComptHvol PRIMARY KEY (nom));
 
 
 
CREATE TABLE VOL (
immat   INT,
nomVol CHAR (30),
nomFact CHAR (30),
datdeb   DATE,
datfin    DATE,
compthdep  INT,
compthfin   INT,
CONSTRAINTS pk_VOL PRIMARY KEY (immat));
 
 
 
 
 
CREATE TABLE  APPARTIENT_A (
raison   CHAR (30) ,
 immat   INT   ,
CONSTRAINT fk_APPARTIENT_A_immat_AVION FOREIGN KEY (immat)  REFERENCES  AVION (immat),
CONSTRAINT fk_APPARTIENT_A_raison_AERO FOREIGN KEY (raison)   REFERENCES  AEROCLUB(raison));
 
 
 
CREATE TABLE  Peut_Piloter (
nom   CHAR (30) ,
immat   INT   ,
CONSTRAINT fk_Peut_Piloter_immat_AVION FOREIGN KEY (immat)  REFERENCES  AVION (immat),
CONSTRAINT fk_Peut_Piloter_nom_Pilote FOREIGN KEY (nom)   REFERENCES  PILOTE (nom));
 
 
 
CREATE TABLE  Membre_De(
nom   CHAR (30) ,
raison   CHAR   ,
CONSTRAINT fk_Membre_De_raison_AERO  FOREIGN KEY (raison)  REFERENCES  AEROCLUB (raison),
CONSTRAINT fk_Membre_De_nom_Pilote FOREIGN KEY (nom)   REFERENCES  PILOTE (nom));


et voici mon trigger pour la mise à jour du compte du pilote qui s'effectue à chaque fois qu'il y a un vol.



Code :
1
2
3
4
5
6
CREATE TRIGGER MAJ_Compte  
AFTER INSERT   ON VOL 
FOR EACH  ROW
begin
UPDATE PILOTE SET Pilote.position := pilote.position -new.prix
end;
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 18h57   #2
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
qu 'en pensez vous?
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 19h14   #3
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
voici le message d'erreur.

ERREUR à la ligne 1 :
ORA-00942: Table ou vue inexistante/

Vraiment je ne comprend pas j'ai bien crée la table VOL
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h12   #4
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
C'est peut être pas ça mais ton new.prix n'est pas déclaré et n'est pas en rapport avec une table.
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h31   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
A priori, j'utiliserais plutôt = que :=
Code :
1
2
3
4
5
6
7
 
CREATE TRIGGER MAJ_Compte  
AFTER INSERT   ON VOL 
FOR EACH  ROW
begin
UPDATE PILOTE SET Pilote.position = pilote.position - new.prix
end;
Quel est le SGBD ?

Avec Oracle par exemple, ce serait :new.prix.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h44   #6
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Citation:
Envoyé par Antoun Voir le message
Code :
1
2
3
4
5
6
7
8
A priori, j'utiliserais plutôt = que := 
 
CREATE TRIGGER MAJ_Compte  
AFTER INSERT   ON VOL 
FOR EACH  ROW
begin
UPDATE PILOTE SET Pilote.position = pilote.position - new.prix
end;
Quel est le SGBD ?

Avec Oracle par exemple, ce serait :new.prix.
Oracle la version 10.Que penses tu de mon triggers pour une mise à jours, je me casse la tête mais je n'y arrive pa et je ne suis pas du genre à laisser tomber.Je veux variment comprendre.
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h51   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par bouba69 Voir le message
Oracle la version 10.Que penses tu de mon triggers pour une mise à jours
Je pense qu'avec Oracle il faut écrire :new et pas new.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h54   #8
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Citation:
Envoyé par Antoun Voir le message
Je pense qu'avec Oracle il faut écrire :new et pas new.
merci Antoun de me repondre car je ne savais pas qui m'adresser.Je n'ai pas compris pour new et que penses tu de mon trigger de mise à jour.Suis-je hors sujet,quelles sont mes erreurs.

svp repond moi .

merci d'avance
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h05   #9
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Citation:
Envoyé par Antoun Voir le message
Je pense qu'avec Oracle il faut écrire :new et pas new.
j'ai parcouru le forum et je me pose une question doit-on obligatoirement declarer des variables (apres DECLARE) dans une trigger?Si oui pourquoi?
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h15   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Voici le code pour l'update, mais il te manque la condition pour mettre à jour le bon pilote !
Code :
1
2
3
UPDATE PILOTE 
SET position = position - :new.prix
WHERE nom = ....
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h18   #11
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Citation:
Envoyé par McM Voir le message
Voici le code pour l'update, mais il te manque la condition pour mettre à jour le bon pilote !
Code :
1
2
3
UPDATE PILOTE 
SET position = position - :new.prix
WHERE nom = ....
le bon pilote?
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h46   #12
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Citation:
quand un nouveau vol a eu lieu, non seulement le compteur de l'avion de l'avion est mis à jour mais aussi le compte d'un pilote doit être debité du cout du vol.
Bon, je m'y connais un peu en aviation, mais il me semble qu'il y a plusieurs pilote dans la compagnie et que sur un vol, il n'y a qu'un pilote.
Si tu mets à jour toute la table PILOTE, c'est pas bon.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 17h57   #13
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
donc si j'insers trois ligne dans la table pilote cela voudra dire que:

Code :
WHERE nom= 'nom1,nom2,nom3'
sinon je ne comprend pas .
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h04   #14
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Réfléchis bien à ton exo : Si un vol est terminé, sur quel pilote dois-tu débiter le compte ?

Essaye d'oublier le trigger et de faire les update à la main.
Quand tu auras compris/vu/codé/testé ce que tu dois faire, tu pourras coder ton trigger.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h05   #15
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
ou une autre solution.

bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 18h06   #16
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
Citation:
Envoyé par McM Voir le message
Réfléchis bien à ton exo : Si un vol est terminé, sur quel pilote dois-tu débiter le compte ?
sur le nom du pilote aux commandes de l'avion.
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 10h47   #17
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par bouba69 Voir le message
sur le nom du pilote aux commandes de l'avion.
et comment on sait quel est le pilote aux commandes durant le vol ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 17h37   #18
Invité de passage
 
Inscription : mars 2007
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mars 2007
Messages : 61
Points : 3
Points : 3
j'ai modifié mon trigger par rapport à mes faibles connaissances et les conseils que tu m'as donné.Mais il y a toujours des erreurs.


voici le nouveau trigger que j'ai cree

Code :
1
2
3
4
5
6
7
CREATE TRIGGER MAJ_Compte  
AFTER INSERT   ON VOL 
FOR EACH  ROW
begin
UPDATE PILOTE SET Pilote.position = pilote.position - (SELECT prix FROM avion ,peut_piloter,pilote  WHERE avion.immat=peut_piloter.immat  AND peut_piloter.nom = pilote .nom )*(SELECT compthfin-compthdep FROM avion WHERE pilote.nom=vol.nom))
 
end;
donc , apres avoir inseré une ligne dans la table vol ,mettre à jour la table pilote et plus precisement le champ postion, en , prenant la postion initiale de compte du pilote pour en deduire le prix du vol qui s'obtient par le prix de l'avion miltiplié par la difference du compteur horaire de l'avion au depart du compteur horaire de l'avion à l'arrivée.Pour que ceci se fasse les conditions sont que le nom du pilote aux commande du vol figure dans la table Pilote que l'immatriculation de l'avion utilisé lors du vol figure dans la table avions.


Pourtant il y a des erreurs .Je sui perdu.Aidez moi SVP.

ORA-04098: Déclencheur MAJ_Compte non valide. Echec de la
revalidation

qu'en pensez-vous?
bouba69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 18h02   #19
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Qu'il faut que tu revoies les cours de SQL standard avant de te lancer dans des triggers.

T'as essayé ce code sous SQL ?
Code :
1
2
UPDATE PILOTE SET Pilote.position = pilote.position - (avion.prix*(avion.compthfin-compthdep))
WHERE pilote.nom=Vol.nomvol AND vol.immat=avion.immat
Comme je l'ai déjà dit : exécutes tes select/update les uns après les autres et quand ils fonctionnent tous, tu crées ton trigger.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 18h05   #20
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
  1. Il faut que tu utilises :new à la place de Vol
  2. Tu utilises la table Avion, il faut donc que tu la mettes dans ton UPDATE
  3. Les deux conditions que tu as mises (même pilote, même avion) ne sont pas suffisantes, puisqu'il peut y avoir plusieurs vol du même avion par le même pilote
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun 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 08h07.


 
 
 
 
Partenaires

Hébergement Web