Vous êtes sur la page 1sur 10

NTIC DEV WWW.NTICRIAD.

NET

Exercices Procdures stockes


1 . Ecrire un programme qui calcule le montant dune commande

et affiche un message 'Commande Normale' ou 'Commande Spciale' selon que le montant est infrieur ou suprieur 100000 DH Declare @Montant decimal Set @Montant=(Select Commande C, Article C.NumCom=LC.NumCom C.NumCom=10) If @Montant is null Begin Print 'Cette Commande d''ingrdients' Return End if @Montant <=10000 Print 'Commande Normale' Else Print 'Commande Spciale' Sum(PUArt*QteCommandee) from A, LigneCommande LC where and LC.NumArt=A.NumArt and

n''existe

pas

ou

elle

n''a

pas

2 . Ecrire un programme qui supprime l'article numro 8 de la commande numro 5 et met jour le stock. Si aprs la suppression de cet article, la commande numro 5 n'a plus d'articles associs, la supprimer. Declare @Qte decimal Set @Qte=(select QteCommandee from LigneCommande where NumCom=5 and NumArt=8) Delete from LigneCommande where NumCom=5 and NumArt=8 Update article set QteEnStock=QteEnStock+@Qte where NumArt=8 if not exists (select numcom from LigneCommande where NumCom=5) Delete from commande where NumCom=5 3 . Ecrire un programme qui affiche la liste des commandes et indique pour chaque commande dans une colonne Type s'il s'agit d'une commande normale (montant <=100000 DH) ou d'une commande spciale (montant >= 100000 DH) Select C.NumCom, DatCom, Sum(PUArt*QteCommandee), 'Type'= Case

NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

When Sum(PUArt*QteCommandee) <=10000 then 'Commande Normale' Else 'Commande Spciale' End From Commande C, Article A, LigneCommande LC Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt Group by C.NumCom, DatCom

4 . A supposer que toutes les commandes ont des montants diffrents, crire un programme qui stocke dans une nouvelle table temporaire les 5 meilleures commandes (ayant le montant le plus lev) classes par montant dcroissant (la table crer aura la structure suivante : NumCom, DatCom, MontantCom) Create Table T1 (NumCom int, DatCom DateTime, MontantCom decimal) Insert into T1 Select Top 5 C.NumCom, DatCom, Sum(PUArt*QteCommandee) as Mt From Commande C, Article A, LigneCommande LC Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt Group by C.NumCom, DatCom Order by Mt Desc 5 . Ecrire un programme qui : Recherche le numro de commande le plus lev dans la table commande et l'incrmente de 1 Enregistre une commande avec ce numro Pour chaque article dont la quantit en stock est infrieure ou gale au seuil minimum enregistre une ligne de commande avec le numro calcul et une quantit commande gale au triple du seuil minimum if exists(select NumArt from article where QteEnStock<=SeuilMinimum) Begin Declare @a int set @a=(select max(NumCom) from commande) + 1 insert into commande values(@a, getdate()) insert into lignecommande Select @a, NumArt, SeuilMinimum * 3 From article Where QteEnStock <=SeuilMinimum
NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

End

Exercices Curseur
1. Ecrire un programme qui pour chaque commande : Affiche le numro et la date de commande sous la forme : Commande N : Effectue le : . La liste des articles associs Le montant de cette commande

NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

Declare @a int, @b DateTime, @c decimal Declare C1 Cursor for Select C.NumCom,DatCom, Sum(PUArt*QteCommandee) From Commande C, Article A, LigneCommande LC Where C.NumCom=LC.NumCom and LC.NumArt=A.NumArt group by C.NumCom,DatCom Open C1 Fetch Next from C1 into @a,@b,@c While @@fetch_status =0 Begin Print 'Commande N : ' + convert(varchar,@a) + ' effectue le : ' + convert(varchar,@b) Select Numart from LigneCommande where numcom=@a Print 'Son montant est : ' + convert(varchar,@c) Fetch Next from C1 into @a,@b,@c End Close C1 Deallocate C1

2. Ecrire un programme qui pour chaque commande vrifie si cette commande a au moins un article. Si c'est le cas affiche son numro et la liste de ses articles sinon affiche un message d'erreur 'Aucun article pour la commande . Elle sera supprime et supprime cette commande Declare @a int Declare Cur_Com Cursor for select NumCom from Commande open Cur_Com Fetch Next from Cur_Com into @a While @@fetch_status =0 Begin if not exists (Select NumArt from LigneCommande where NumCom=@a) Begin Print 'Aucun article pour la commande N : ' + convert(varchar, @a) + '. Elle sera supprime' Delete From Commande Where NumCom=@a End Else Begin Print 'Commande n : ' + convert(varchar, @a) Select A.NumArt, DesArt, PUArt, QteCommandee
NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

From Article A, Lignecommande LC Where A.NumArt=LC.NumArt and NumCom=@a End Fetch Next from Cur_Com into @a End Close Cur_Com Deallocate Cur_Com

Exercices trigger
1. Ecrire un trigger qui empche quon supprime plus de 50 n-uplets la fois dans la table EMPLOYE. Create TRIGGER [dbo].[ex1] ON [dbo].[archive] AFTER deLETE AS BEGIN if (select count(*) from deleted )>50 begin rollback print 'ne pas supprimer plus de 50 enreg' end END 2. Ecrire un trigger qui affiche l'ancien n de tl ainsi que le nouveau lorsqu'un update de la colonne <tel> est effectu sur un tuple(enreg) de Employ. Create TRIGGER ex2 ON archive1 AFTER UPDATE AS BEGIN declare @n1 varchar(20) set @n1=(select tel from deleted) declare @n2 varchar(20) set @n2=(select tel from inserted) if update(nom) begin -- soit vous utilisez print pour afficher le message ou bien raiserror print 'l''ancienne valeur du tel est : ' + @n1+ ' la nouvelle valeur aprs modification est : '+@n2 -- RAISERROR ('l''ancienne valeur du tel est %s et la nouvelle valeur est %s',16,1,@n1,@n2) end END 3. Ecrire un trigger for ou after update sur la table Vente qui utilise la fonction update() et affiche l'utilisateur le message suivant : "Attention : vous venez de modifier une valeur de cl trangre pour la commande n XXX" NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET Create TRIGGER ex3 ON archive1 AFTER update AS BEGIN declare @n1 varchar(20) set @n1=(select Ncommande from deleted) IF (UPDATE(nclient)) BEGIN print 'Attention : vous venez de modifier le nclient de la commande N '+ @n1 end END 4. crire un trigger qui (quelle que soit la valeur donne comme identifiant de lemploy) insrera le n immdiatement suprieur au plus grand n prsent dans la table. Create TRIGGER ex4 ON archive1 Instead of insert AS BEGIN declare @n1 varchar(20) set @n1=(select max(NPERSONNE) from archive1) insert into archive1(NPERSONNE,nom,prenom) values(@n1+1,(select nom from inserted), (select prenom from inserted)) END 5. Crer un trigger for insert, update qui fait le contrle de validit lorsque le niveau d'emploi (posEmploi) d'un employ est modifi ou insr. S'il n'est pas compris entre les valeurs limites pour la catgorie, la transaction devra tre annule (rollback tran). Create TRIGGER ex5 ON employe After insert,update AS BEGIN declare @n1 int set @n1=(select valmin from categorie where codecat in (select codecat from inserted)) declare @n2 int set @n2=(select valmax from categorie where codecat in (select codecat from inserted)) If exists(select * from employe where posemploi not between (@n1 and @n2)) Begin Print la valeur posemploi doit tre comprise entre + @n1 + et + @n2 Rollback end END 6. trigger qui la suppression d'un stagiaire vrifie s'il a t valu et si des notes lui ont t attribues. Si c'est le cas empcher la suppression Create trigger ex6 on stagiaire Instead of Delete As Begin If exists(select * from deleted , notation where inserted.numstg = notation.numstg) Begin Print Ce stagiaire possde des notes Else NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET delete from stagiaire where numstg in select numstg from deleted 7. Supposons quon ait ajout la table vente une nouvelle colonne totalvente. Le totalvente doit tre gal au total des montants de chacune des lignes de la vente; Concevez un TRIGGER qui modifie directement le totalvente des ventes suite la linsertion ou la modification de la qt vendue dune ligne vente. Create Trigger ex7 on detailvente After Insert , update As Begin Update vente set totalvente= totalvente+(select sum (qtvendue * pu ) from produit, dtailvente where numvente = (select numvente from inserted Group by numvente)

8. La dateLivraison ne peut prcder la dateCommande. Create Trigger ex8 on livraison After Insert ,update As Begin If exists(select * from inserted I,commande C where I.Numcmd =C. Numcmd and C.Datecommande > I.datelivraison ) Begin Print la date commande doit tre infrieure la date de livraison Rollback End End 9. Une livraison peut regrouper plusieurs commandes, Une livraison ne touche toujours qu'un seul Client, c'est--dire ne peut tre lie des Commandes de plusieurs Clients . Create TRIGGER ex9 ON [ventelivraison] AFTER INSERT,UPDATE AS declare @cli varchar(10) declare @liv int set @cli=(select personne from vente where codevente in (select codevente from inserted)) set @liv=(select numlivraison from inserted) if @cli = all (select personne from vente where codevente in(select codevente from livraison l, ventelivraison vl where vl.numlivraison=l.numlivraison and l.numlivraison=@liv)) raiserror('mme client pour la mme livraison',16,1) else begin raiserror('clients diffrents pour la mme livraison',16,1) rollback end

NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

Exercices Gestion Stagiaire


Soit la base de donnes suivante :

Crer les procdures stockes suivantes : P S 1 .Qui affiche les numros et les noms des stagiaires pour . lesquels on a pas encore saisi de note CREATE PROCEDURE SP1 AS Select NumStagiaire, NomStagiaire From Stagiaire NumStagiaire not in (Select NumStagiaire from Notation, ) where

P S 2 .Qui affiche les filires ayant plus de 10 modules au . programme CREATE PROCEDURE SP2 AS Select Filiere.NumFiliere, NomFiliere from filiere, programme Where Filiere.numFiliere=Programme.Numfiliere Group by Filiere.NumFiliere, NomFiliere Having Count(NumModule)>=10 P S 3 .qui affiche les noms des modules qui sont tudis dans . toutes les filires d'un secteur donn en paramtre CREATE PROCEDURE SP3 @CodSecteur varchar(10) AS Select NomModule from Module M,Programme P, Filiere F Where M.Nummodule=P.numModule and P.NumFiliere=F.NumFiliere and codSecteur=@CodSecteur group by NomModule Having count(F.numfiliere)=(select Count(numfiliere) from filiere where CodSecteur=@CodSecteur)

NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

P S 4 .Qui affiche pour un stagiaire donn en paramtre, la liste . des notes (numro module, nom du module, note et coefficient) CREATE PROCEDURE SP4 @NumStagiaire int AS Select Module.NumModule, NomModule, Note,Coefficient Module, Notation, programme Where Notation.NumModule=Module.NumModule Module.Nummodule=programme.Nummodule numStagiaire=@NumStagiaire from and and

P S 5 .Qui affiche pour chaque stagiaire : . Le nom, le prnom et la filire sous la forme : Nom et Prnom :.....Filire : ....... S'il existe des modules o le stagiaire n'a pas de notes attribue afficher le message 'En cours de traitement' ainsi que la liste des modules o il n'a pas encore de notes' S'il existe plus de deux modules o le stagiaire a obtenu une note <3 afficher 'Notes Eliminatoires' et afficher les modules concerns Sinon afficher la liste des modules (Module + Coefficients+note) ainsi que la moyenne du stagiaire CREATE PROCEDURE SP5 AS Declare @NumSta int, @NomPreSta varchar(50), @NomFil varchar(50) Declare C1 Cursor for Select NumStagiaire, NomStagiaire + ' ' + PrenomStagiaire, NomFiliere from Stagiaire S, Filiere F where S.NumFiliere=F.NumFiliere Open C1 Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil while @@fetch_status=0 Begin Print 'Nom et Prnom : ' + @NomPreSta + ' Filire : ' + @NomFil if exists (select NumModule from Programme P, Stagiaire S where P.NumFiliere=S.NumFiliere and NumStagiaire=@NumSta and NumModule not in (select NumModule from notation where NumStagiaire=@NumSta)) Begin Print 'En cours de traitement' select NumModule from Programme P, Stagiaire S where P.NumFiliere=S.NumFiliere and NumStagiaire=@NumSta and NumModule not in (select NumModule from notation where NumStagiaire=@NumSta)
NTIC DEV WWW.NTICRIAD.NET

NTIC DEV WWW.NTICRIAD.NET

return end if (select count(NumModule) from notation where NumStagiaire = @NumSta and note<3) >2 Begin Print 'Notes Eliminatoires' Select NomModule from Module M, Notation N where M.NumModule=N.NumModule and numStagiaire=@NumSta and note <3 Return End Select NomModule, Coefficient, Note from Module M, Programme P, Notation N, Stagiaire S where M.NumModule=P.NumModule and P.numFiliere=S.NumFiliere and M.NumModule=N.NumModule and N.NumStagiaire=S.NumStagiaire and S.numStagiaire=@NumSta Select Sum(Note*coefficient) / Sum(coefficient) from Module M, Programme P, Notation N, Stagiaire S where M.NumModule=P.NumModule and P.numFiliere=S.NumFiliere and M.NumModule=N.NumModule and N.NumStagiaire=S.NumStagiaire and S.numStagiaire=@NumSta Fetch Next from C1 into @NumSta, @NomPreSta, @NomFil End Close C1 Deallocate C1

NTIC DEV WWW.NTICRIAD.NET