problème TRIGGER

problème TRIGGER - SQL/NoSQL - Programmation

Marsh Posté le 07-11-2015 à 18:17:27    

Bonsoir à vous,  
J'ai essayé de créer un trigger qui puisse à chaque insertion d'une ligne de commande mettre à jour automatiquement le montant
total de la commande correspondante ainsi que le stock du produit concerné par la ligne de commande.
Cette maj ne doit pas se faire si la quantité demandée dans la ligne de commande est strictement
supérieure à la quantité actuellement en stock. Dans ce cas, l'erreur doit être inscrite dans la table ligne_erreur...
 
Le problème c'est que mon trigger ne fonctionne pas et je ne comprends pas pourquoi :(
 
 
le code :
 
DROP TABLE produit cascade constraints;
DROP TABLE commande cascade constraints;
DROP TABLE ligne_commande cascade constraints;
DROP TABLE ligne_erreur cascade constraints;
 
 
-- on crée les tables
CREATE TABLE produit
-- Création de table
(idproduit varchar2(5),
desprod varchar(50),
prixprod number(8,2),
stockprod number(4),
constraint pk_produit primary key(idproduit)
);
 
CREATE TABLE commande
-- Création de table
(idcommande varchar2(5),
datecde date,
montanttotalcom number(10,2),
constraint pk_commande primary key(idcommande)
);
 
CREATE TABLE ligne_commande
-- Création de table
(idlig varchar2(5),
idcommande varchar2(5),
quantiteprod number(3),
idproduit varchar2(5) REFERENCES produit(idproduit),
constraint pk_ligne_commande primary key (idlig,idcommande)
);
 
CREATE TABLE ligne_erreur
-- Création de table
(
idcommande varchar2(5),
idlig varchar2(5),
idproduit varchar2(5),
quantiteprod number(3),
stockprod number(4)
);
 
 
ALTER TABLE ligne_commande add constraint fk_lig_com1 foreign key(idcommande)
REFERENCES commande(idcommande);
 
 
CREATE OR REPLACE TRIGGER before_update_commande
 BEFORE INSERT ON ligne_commande FOR EACH ROW
 DECLARE  
 
 PRAGMA AUTONOMOUS_TRANSACTION;
 prixprodcommande produit.prixprod%type;
 prixprodcommande := SELECT prixprod INTO produit WHERE idproduit = :NEW.idproduit;
 stockprodcommande produit.stockprod%type;
 stockprodcommande := SELECT stockprod INTO produit WHERE idproduit = :NEW.idproduit;
 
BEGIN
 
 IF ( stockprodcommande > :NEW.quantiteprod) THEN
  UPDATE produit SET stockprod = stockprod - :NEW.quantiteprod
  WHERE idproduit = :NEW.idproduit;
  UPDATE commande SET montanttotalcom = montanttotalcom + :NEW.quantiteprod * prixprodcommande
  WHERE idcommande = :NEW.idcommande;
 ELSE
  INSERT INTO ligne_erreur VALUES (:NEW.idcommande,:NEW.idlig,:NEW.idproduit,:NEW.quantiteprod,stockprodcommande);
  raise_application_error('-20001,La quantite demande est superieur au stock disponible');
 END IF
 
EXCEPTION
 
 
 
WHEN OTHERS THEN  
NULL;
END;
/

 

Reply

Marsh Posté le 07-11-2015 à 18:17:27   

Reply

Marsh Posté le 09-11-2015 à 14:42:07    

Pense à préciser le SGBDR. Même si ça sent le Oracle vu la syntaxe ça ne peut pas faire de mal.
Précise aussi la version.
Et clarifie "mon trigger ne fonctionne pas" au cas où la cause ne serait pas évidente pour celui qui lira ton code :sarcastic:


---------------
Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed