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/11/2011, 00h50   #1
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Par défaut Problème avec mon trigger

salut!
etant novice dans oracle, j'ai de problemes suivants:
voici mes tables:
Ligne_Coms (Num_Com ,Num_Pro ,Qte_Com );
Commandes (Num_Com ,Date_Com,Nbre_lc),Mtot_Com,Num_Cli)
voici mon trigger:
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
CREATE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
 
BEGIN
   IF (verifier_qtecom(Qte_Com,Num_Pro)) then
    BEGIN
		UPDATE Commandes 
			SET nbre_lc= nbre_lc+1 WHERE Ligne_Coms.Num_Com=Commandes.Num_Com ;
		UPDATE Commandes
			SET Mtot_Com = Mtot_Com + :new.Qte_Com * Prix_U WHERE Num_Com = :new.Num_Com;
 
		UPDATE Produits
			SET qtestock = qtestock - :new.Qte_Com  WHERE Num_Pro = :new.Num_Pro;
		COMMIT;
	END;
  ELSE 
   BEGIN
      DBMS_OUTPUT.PUT_LINE('Ajout annulé') ;
	  ROLLBACK; 
	END;
 end IF;
END;
le trigger doit incrementer nbre_lc,recalculer mtot_com et soustraire qtestock pour chaque ajout d'une nouvelle ligne si la fonction verifier_qtecom(Qte_Com,Num_Pro)==true sinon l'opération d'ajout est annulée.
Voici mes questions:
1) l'execution de ce trigger me donne l'erreur suivante:
Code :
1
2
2/4 	PL/SQL: Statement ignored
2/24 	PLS-00201: l'identificateur 'QTE_COM' doit être déclaré
. je n'arrive pas à le resoudre.
2) est ce que ce trigger respecte les regles ci-dessus?
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 09h42   #2
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
L'erreur de compilation vient de la ligne 7 où il manque un :NEW.

Ligne 12 : Prix_U est également inconnu car il ne s'agit pas d'une colonne d'aucune des 2 tables décrites.

Sinon, pourquoi faire 2 UPDATE sur la table COMMANDES au lieu de mettre à jour les 2 colonnes en une fois ?
Pour ne faire les mises à jour que si la fonction retourne TRUE, je n'aurais pas utilisé les COMMIT et ROLLBACK (je ne sais pas si cela fonctionne), mais j'aurais plutôt provoqué une erreur, ce qui donnerait (sans traiter le problème de Prix_U) quelque chose du style :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
 
BEGIN
   IF (verifier_qtecom(Qte_Com,Num_Pro)) then
	UPDATE Commandes 
		SET nbre_lc= nbre_lc+1,
		    Mtot_Com = Mtot_Com + :new.Qte_Com * Prix_U
		WHERE Ligne_Coms.Num_Com=Commandes.Num_Com ;
 
	UPDATE Produits
		SET qtestock = qtestock - :new.Qte_Com
		WHERE Num_Pro = :new.Num_Pro;
   ELSE 
	RAISE_APPLICATION_ERROR (-20001, 'Ajout annulé') ;
   END IF;
END;
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 16h31   #3
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Merci pour l'aide.
au fait j'ai encor une autre table:
Produits ( Num_Pro,Lib_Pro),Prix_U,Qtestock,Seuil_Reapro):
L'execution de ton code me donne ceci:
2/4 PL/SQL: Statement ignored
2/24 PLS-00201: l'identificateur 'QTE_COM' doit être déclaré
poutant qte_com existe. j ne comprend pas
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 19h32   #4
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
L'erreur de compilation vient du fait que j'ai oublié d'ajouter le :NEW. à la ligne 7.
Si le prix unitaire Prix_U vient de la table Produits et que celle-ci contient un et un seul enregistrement pour le Num_Pro, alors il faut le récupérer pour le stocker dans une variable locale. On peut profiter de l'UPDATE fait sur cette table pour faire d'une pierre 2 coups.
Le code serait le suivant :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
Vl_Prix_U  Produits.Prix_U%TYPE;
BEGIN
   IF (verifier_qtecom(:NEW.Qte_Com,:NEW.Num_Pro)) then
	UPDATE Produits
		SET qtestock = qtestock - :new.Qte_Com
		WHERE Num_Pro = :new.Num_Pro
		RETURNING Prix_U INTO Vl_Prix_U;
 
	UPDATE Commandes 
		SET nbre_lc= nbre_lc+1,
		    Mtot_Com = Mtot_Com + :new.Qte_Com * Vl_Prix_U
		WHERE Ligne_Coms.Num_Com=Commandes.Num_Com ;
 
   ELSE 
	RAISE_APPLICATION_ERROR (-20001, 'Ajout annulé') ;
   END IF;
END;
N'ayant pas de base sous la main, je n'ai pas testé, c'est possible qu'il reste quelques erreurs.
Il manque une gestion d'exception, mais ça devrait donner un bon point de départ.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 01h20   #5
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
J'ai encor cette erreur:
Code :
1
2
3
4
4/3 	PL/SQL: SQL Statement ignored
5/92 	PL/SQL: ORA-00904: "LIGNE_COMS"."NUM_COM" : identificateur non va lide
7/3 	PL/SQL: SQL Statement ignored
8/30 	PL/SQL: ORA-00904: "QTE_COM" : identificateur non valide
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 09h15   #6
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Il y avait un problème dans le 2e UPDATE :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
Vl_Prix_U  Produits.Prix_U%TYPE;
BEGIN
   IF (verifier_qtecom(:NEW.Qte_Com,:NEW.Num_Pro)) then
	UPDATE Produits
		SET qtestock = qtestock - :new.Qte_Com
		WHERE Num_Pro = :new.Num_Pro
		RETURNING Prix_U INTO Vl_Prix_U;
 
	UPDATE Commandes 
		SET nbre_lc= nbre_lc+1,
		    Mtot_Com = Mtot_Com + :new.Qte_Com * Vl_Prix_U
		WHERE Num_Com = :NEW.Num_Com ;
 
   ELSE 
	RAISE_APPLICATION_ERROR (-20001, 'Ajout annulé') ;
   END IF;
END;
Par contre, pour le message d'erreur sur QTE_COM, je ne vois pas d'où il peut venir. En plus, le n° de ligne indiqué est bien après celui concernant le problème d'e l'UPDATE, et il n'y a pas de référence à ce champ après l'UPDAT. D'ailleurs il n'y a quasiment pas de code.
C'est bien exactement ce code que tu compiles ? Et le message d'erreur que tu donnes proviens bien du SHOW ERROR ?
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 19h11   #7
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
Citation:
C'est bien exactement ce code que tu compiles ? Et le message d'erreur que tu donnes proviens bien du SHOW ERROR ?
OUI
j'ai ce nouveau code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
Vl_Prix_U  Produits.Prix_U%TYPE;
BEGIN
   IF (verifier_qtecom(:NEW.Qte_Com,:NEW.Num_Pro)) then
	UPDATE Produits
		SET qtestock = qtestock - :new.Qte_Com
		WHERE Num_Pro = :new.Num_Pro
		RETURNING Prix_U INTO Vl_Prix_U;
 
	UPDATE Commandes 
		SET nbre_lc= nbre_lc+1,
		    Mtot_Com = Mtot_Com + :new.Qte_Com * Vl_Prix_U
		WHERE Commandes.Num_Com = :new.Ligne_Coms.Num_Com ;
 
   ELSE 
	RAISE_APPLICATION_ERROR (-20001, 'Ajout annulé') ;
   END IF;
END;
mais l'eèxecution de ce code sous oracle me ressort ceci;
Code :
1
2
3
4
5
Vl_Prix_U  Produits.Prix_U%TYPE;
*
 
ERREUR à la ligne 5 :
ORA-04079: spécification de déclencheur erronée
Tandisque show err trigger ajoutcommande me dit qu'il n'ya pa d'erreurs.
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 10h16   #8
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
J'avais oublié le DECLARE à la ligne 5.
Par contr, tu n'as pas pris le 2e UPDATE corrigé.
J'ai testé le code suivant qui compile correctement :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE TRIGGER ajoutCommande
AFTER INSERT
ON Ligne_Coms
FOR EACH ROW
DECLARE
  Vl_Prix_U  Produits.Prix_U%TYPE;
BEGIN
   IF (verifier_qtecom(:NEW.Qte_Com,:NEW.Num_Pro)) then
	UPDATE Produits
		SET qtestock = qtestock - :new.Qte_Com
		WHERE Num_Pro = :new.Num_Pro
		RETURNING Prix_U INTO Vl_Prix_U;
 
	UPDATE Commandes 
		SET nbre_lc= nbre_lc+1,
		    Mtot_Com = Mtot_Com + :new.Qte_Com * Vl_Prix_U
		WHERE Num_Com = :NEW.Num_Com ;
 
   ELSE 
	RAISE_APPLICATION_ERROR (-20001, 'Ajout annulé') ;
   END IF;
END;
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 20h50   #9
Invité de passage
 
Inscription : août 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 22
Points : 3
Points : 3
merci xdescamp!!!!!
il reste la 2e question:
Citation:
est ce que ce trigger respecte les regles ci-dessus?
yabo84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 15h13   #10
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Ca a effectivement l'air de répondre aux règles. Par contre les règles ne sont peut-être pas complètes (je ne connais pas le contexte):
- si le prix unitaire est plus précis que le centime, il faut peut-être arrondir le prix de la commande ?
- est-ce qu'on ne risque pas de se retrouver avec des quantités en stock négatives ?
Bref des fonctionnements limites.
Mais dans les cas "normaux", ça devrait répondre au besoin.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h42.


 
 
 
 
Partenaires

Hébergement Web