ou dois-je metrtre les select.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UPDATE PILOTE SET Pilote.position = pilote.position - (avion.prix*(avion.compthfin-compthdep)) WHERE pilote.nom=:new.nomvol
ou dois-je metrtre les select.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UPDATE PILOTE SET Pilote.position = pilote.position - (avion.prix*(avion.compthfin-compthdep)) WHERE pilote.nom=:new.nomvol
comment faire.comme ça .
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE PILOTE AVION SET Pilote.position = pilote.position - (avion.prix*(avion.compthfin-compthdep))
encore un trigger j'ai encore modifier apres reflexion.
voici le nouveau trigger que j'ai cree
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 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;
y'a du mieux. Je te corrige trois coquilles :
Mais il reste la question de fond :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 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=:new.nom)) ; end;
Envoyé par Antoun
J'essaie de comprendre :
Donc, quand on ajoute un vol, la position du pilote est décrémentée du prix de l'avion multiplié par l'écart constaté au compteur... Y a pas besoin des détails sur le vol alors ?
Bon, ça doit être bon comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE 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=:new.nom)) ; end;
bah pour avoir le kilométrage du vol par exemple. Mais effectivement, si tu relèves le compteur sur l'avion, ça le fait aussi.
je viens de creer le trigger sur oracle.Mais il y des erreurs .
voici le raport:
Numéro de ligne = 2 Numéro de colonne = 1 Texte d'erreur = PL/SQL: SQL Statement ignored
Numéro de ligne = 5 Numéro de colonne = 61 Texte d'erreur = PLS-00049: variable de lien erronée 'NEW.NOM'
Numéro de ligne = 5 Numéro de colonne = 70 Texte d'erreur = PL/SQL: ORA-00933: La commande SQL ne se termine pas correctement
- la table vol n'a pas de colonne nom, mais nomvol
- compthfin et compthdep ne sont pas dans Avion mais dans Vol ; comme c'est la table sur laquelle tu crées le trigger, tu n'as pas besoin de sous-requête, :new.compthfin et :new.compthdep suffisent.
Tu sais que tu es censé connaître ton schéma mieux que nous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE or replace 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 ) * (:new.compthfin - :new.compthdep) WHERE pilote.nom = :new.nomvol ; end ;
merci ,merci 1000 fois il n'y pas plus d'erreur de compilation.Mais lorsque j'ai insere une ligne dans la table vol aucune mise à jour s'est effectué dans la table pilote.De même dois-je creer mes triggers avec sql.plus ou console manager ou sql.plus workseet .Avec console manager cela fonctionne mais avec sql.plus il n'y arien qui se passe et sql.plus workseet il me dit vue ou table inexistante.
ERREUR à la ligne 2 :
ORA-00942: Table ou vue inexistante
Avec n'importe quoi qui marche.
Est-ce que ta requête d'insertion fonctionne ou te fait une erreur. Est-ce que tu as un pilote dont le nom est le NomVol que tu insères ? Est-ce qu'il a une position non NULL ? Est-ce qu'il est renseigné dans peut_piloter ? Est-ce que l'immat correspondante dans peut_piloter existe dans avion ?
Les vérifs de routine, quoi...
Je sais pas mais mon insertion fonctionne mais le trigger ne joue pas son rôle il n'y a pas de mise à jour du champ position de la table pilote.Alors que j'ai suivi les conseils que tu m'as donné plus haut, a savoir renseigner la table "peut_piloter"....
voici la ligne que j'ai insere dans la table VOL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INSERT INTO VOL VALUES ( 101201,'dupont','dupont','12-02-08','12-02-08',10,14);
Au fait juste une petite question au passage.J'ai crée un MCD avec sybase qui à généré un script sql avec creation des tabes, des contraintes....est-il valabe et puis-je l'exporter sur oracle et m'en servir.
Merci d'avance
Si tu dis que ton insertion fonctionne, pourquoi y a-t-il un message d'erreur ? S'il y a erreur c'est que ça ne fonctionne pas, et si ça fonctionne il n'y a pas de message d'erreur
Quelle est cette contrainte qui est citée dans le message d'erreur ?
Enfin, pour ta question sur le MCD et sa traduction dans Oracle, je connais très peu les outils de modélisation, donc je t'invite à ouvrir une autre discussion dans le forum qui leur est consacré http://www.developpez.net/forums/forumdisplay.php?f=422.
peux-tu me donner les données que tu as dans pilote, peut_piloter et avion, pour que je reproduise le problème ?
Avion
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 INSERT INTO AVION VALUES ( 200100,'Sezna12',200,10,'Bi-moteur'); INSERT INTO AVION VALUES ( 001200,'Sezna134S',400,12,'tri-moteur'); INSERT INTO AVION VALUES ( 101201,'Bomba3',1000,9,'quadri-moteur'); INSERT INTO Pilote VALUES ( 'dupont','jean','3 rue St exupery ',600,3200,1200,'S178'); INSERT INTO Pilote VALUES ( 'dupont','jean','3 rue St exupery ',600,3200,1200,'S178'); INSERT INTO Pilote VALUES ( 'durand','louis','10 rue St exupery ',800,3200,2200,'T178'); INSERT INTO peut_piloter VALUES ('duchemin',001200); INSERT INTO peut_piloter VALUES 'durand',001200); INSERT INTO peut_piloter VALUES ( 'dupont',200100);
OK, je teste ça ce soir.
Donc, résultat de tes insertions :
J'ai ensuite tenté ton insertion. J'ai eu une erreur sur le format des dates, mais ça peut être propre à ma config. J'ai réécrit avec le format ISO des dates :1 0.42 INSERT INTO AVION VALUES ( 200100,'Sezna12',200,10,'Bi-moteu 1 row(s) inserted. 1
2 0.01 INSERT INTO AVION VALUES ( 001200,'Sezna134S',400,12,'tri-mo 1 row(s) inserted. 1
3 0.00 INSERT INTO AVION VALUES ( 101201,'Bomba3',1000,9,'quadri-mo 1 row(s) inserted. 1
4 0.01 INSERT INTO Pilote VALUES ( 'dupont','jean','3 rue St exuper 1 row(s) inserted. 1
5 0.05 INSERT INTO Pilote VALUES ( 'dupont','jean','3 rue St exuper ORA-00001: unique constraint (ANTOUN.PK_PILOTE) violated -
6 0.01 INSERT INTO Pilote VALUES ( 'durand','louis','10 rue St exup 1 row(s) inserted. 1
7 0.02 INSERT INTO peut_piloter VALUES ('duchemin',001200) ORA-02291: integrity constraint (ANTOUN.FK_PEUT_PILOTER_NOM_PILOTE) violated - parent key not found -
8 0.00 INSERT INTO peut_piloter VALUES 'durand',001200) ORA-00933: SQL command not properly ended -
9 0.01 INSERT INTO peut_piloter VALUES ( 'dupont',200100) 1 row(s) inserted. 1
La position de dupont passe alors de 1200 à 400, donc ça me semble OK ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 INSERT INTO VOL VALUES ( 101201,'dupont','dupont', date '2008-02-12', date '2008-02-12', 10, 14);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager