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 :

Problème avec mon trigger


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    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 : 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 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;

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    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

  4. #4
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    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 : 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
    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.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    J'ai encor cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Il y avait un problème dans le 2e UPDATE :
    Code sql : 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
    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 ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    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 : 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
    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;

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    merci xdescamp!!!!!
    il reste la 2e question:
    est ce que ce trigger respecte les regles ci-dessus?

  10. #10
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec mon Premier trigger
    Par ed222 dans le forum Développement
    Réponses: 4
    Dernier message: 09/06/2010, 12h16
  2. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45
  3. Problème avec mon service mysql et PhpMyAdmin
    Par Fixazo dans le forum Outils
    Réponses: 1
    Dernier message: 28/08/2005, 18h02
  4. problème avec mon lecteur CD
    Par leo13 dans le forum Périphériques
    Réponses: 3
    Dernier message: 16/08/2005, 11h21
  5. Problème avec mon firewall ...
    Par Wis dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 06/04/2004, 08h46

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