problème TRIGGER - SQL/NoSQL - Programmation
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
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;
/