Vous êtes sur la page 1sur 18

www.ofppt-ma.forummaroc.

net
Transact SQL
Transact SQL, est une extension du dialecte SQL de SQL Server et constitue un langage procdural pour coder les procdures stockes et les triggers (dclencheurs) du SGBDR de Microsoft. Transact SQL est un langage procdural (par opposition SQL qui est un langage dclaratif) qui permet de programmer des algorithmes de traitement des donnes au sein des SGBDR
D'autres SGBDR utilisent d'autres langages procduraux pour l'implmentation de procdures stockes et de triggers. C'est le cas par exemple du PL/SQL (Programming Langage) d'Oracle.

Identifiant
Le symbole ddoubl @@ commence le nom des variables globales du SGBDR.

Variables Le symbole @ commence le nom de toute variable.


Les types disponibles sont ceux de SQL : bit, int, smallint, tinyint, decimal, numeric, money, smallmoney, float, real, datetime, smalldatetime, timestamp, uniqueidentifier, char, varchar, text, nchar, nvarchar, ntext, binary, varbinary, image. Une variable est dclare tout endroit du code par l'instruction DECLARE : Exemple : DECLARE @maChaine char(32) Une variable est assigne par l'instruction SET : SET @maChaine = 'NTIC' Avant toute assignation, une variable dclare est marque NULL. Remarques :

l'ordre SQL SELECT peut aussi servir assigner une ou plusieurs variable, mais dans ce dernier cas il faut veiller ce que la rponse la requte ne produise qu'une seule ligne

Exemple : SELECT @x = count(*) from table

SGBD II

2012-2013

Page 1

www.ofppt-ma.forummaroc.net
2.Structures basiques
La structure : BEGIN ... END permet de dfinir des blocs d'instructions. Remarques :

il n'y a pas de THEN dans le IF du Transact SQL, ni de DO dans le WHILE une seule instruction est permise pour les structure IF et WHILE, sauf mettre en place un bloc d'instructions l'aide d'une structure BEGIN / END

PRINT est une instruction permettant de gnrer une ligne en sortie de procdure. Elle doit tre rserve plus la mise au point des procdures stockes que pour une utilisation en exploitation. EXEC est une instruction permettant de lancer une requte ou une procdure stocke au sein d'une procdure ou un trigger. La plupart du temps il n'est pas ncessaire d'utilise l'instruction EXEC, si l'intgralit de la commande SQL ou de la procdure lancer est connu. Mais lorsqu'il s'agit par exemple d'un ordre SQL contenant de nombreux paramtres, alors il est ncessaire de le dfinir dynamiquement.

3. Procdures stockes
Le but d'une procdure stocke est triple :

tendre les possibilits des requtes, faciliter la gestion de transactions permettre une excution plus rapide et plus optimise de calculs complexes ne portant que sur des donnes de la base

Dans ce dernier cas la mthode traditionnelle ncessitait de nombreux aller et retour entre le client et le serveur et congestionnait le rseau. Une procdure stocke est accessible par l'interface SQL Server Management Studio. Elle peut aussi tre cre par l'analyseur de requte.

Entte de procdure

SGBD II

2012-2013

Page 2

www.ofppt-ma.forummaroc.net
Elle commence toujours par les mots clef CREATE PROCEDURE suivi du nom que l'on veut donner la procdure stocke. Les paramtres et leur type, s'il y en a suivent le nom. L'entte se termine par le mot clef AS. Exemple CREATE PROCEDURE ex1 @fil int AS begin declare @x int select @x = count(*) from stagiaire where n_fil=@fil print 'le nombre de stagaires pour la filire +convert(varchar(3),@fil) est '+convert(varchar(3),@x) end GO @fil reprsente une variable dclare comme paramtre dentre @x est une variable locale dclare grce au mot cl DECLARE

Paramtres, variables de retour et ensemble de donnes


Pour dclarer les paramtres il faut les lister avec un nom de variable et un type. Par dfaut les paramtres sont des paramtres d'entre. Comme pour toutes les listes le sparateur est la virgule. On peut dclarer des valeurs par dfaut et spcifier si le paramtre est en sortie avec le mot clef OUTPUT. Exemple : CREATE PROCEDURE essai2 @NUM INTEGER, @OK = 0 OUTPUT -- retour 0 OK, 1 problme AS ... Pour rcuprer la valeur d'un paramtre OUTPUT, il faut prciser une variable de rcupration de nature OUTPUT dans le lancement de l'excution. Exemple : CREATE PROCEDURE ex1 @fil int , @x int output AS begin select @x = count(*) from stagiaire where n_fil=@fil end

SGBD II

2012-2013

Page 3

www.ofppt-ma.forummaroc.net
Cette procdure retourne dans la variable @x le nombre de stagiaires de la filire @fil declare @nb int exec ex1 @fil , @nb output update filiere set capacite=@nb where n_fil=@fil

Procdures stockes prdfinies


SQL Server possde des procdures stockes pr tablies, un peu la manire d'une bibliothque d'utilisation. Elles se situent toutes dans la base "master". Ainsi, la procdure stocke "sp_help" fournit une description de n'importe quel objet de la base. EXERCICES La liste des stagiaires dont le nom commence par une lettre spcifie par lutilisateur alter proc ex1 @l varchar(10) As Begin Select * from stagiaire Where nom like @l+'%' End La liste des commandes effectues entre deux dates passes en paramtres. En plus si le nombre de commandes est suprieur 100, afficher 'Priode rouge'. Si le nombre de commande est entre 50 et 100 afficher 'Priode jaune' sinon afficher 'Priode blanche'
ALTER PROC PS2 @DAT1 DATE @DAT2 DATE AS BEGIN DECLARE @NB INT SET @NB = select count(NumCMD) from COMMANDE where DATECMD BETWEEN (@DAT1 AND @DAT2) DECLARE @MESSAGE VARCHAR(10) SET @MESSAGE =CASE WHEN @NB > 100 THEN 'Priode rouge' WHEN @NB > 50 AND @N < 100 THEN 'Priode jaune' ELSE 'Priode blanche' END PRINT 'LE NOMBRE DE COMMANDES EST :' CONVERT(VARCHAR(3),@NB) + @MESSAGE END

Afficher pour un stagiaire : le nom, le prnom et la filire sous la forme : Nom : ....Prnom :.....Filire : .......

SGBD II

2012-2013

Page 4

www.ofppt-ma.forummaroc.net
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
ALTER proc SP3 @NumSta nchar(10) as begin print 'nom' select 'nom : ' + nom + 'prenom : '+prenom from stagiaire where numstg = @NumSta if exists (select NumModule from module where NumModule not in (select NumModule from notation where NumStg=@NumSta)) Begin select 'En cours de traitement '+ module.NumModule,nommodule from module where NumModule not in (select NumModule from notation where NumStg=@NumSta) end else begin Select n.nummodule, NomModule, Note from Module M, Notation N where M.NumModule=N.NumModule and N.NumStg=@NumSta Select AVG( Note) as 'moyenne gnrale' from Notation where NumStg=@NumSta end if (select count(NumModule) from notation where NumStg = @NumSta and note<3) >=2 Begin Select 'Notes Eliminatoires ' + NomModule, note from Module M, Notation N where M.NumModule=N.NumModule and numStg=@NumSta and note <3 end end

SP

qui stocke dans une nouvelle table temporaire les 5 meilleures

commandes
IF OBJECT_ID('temporaire') IS NOT NULL insert into temporaire SELECT top 5 from detail group by numcom order by sum(pu*qte) desc FROM module ELSE SELECT top 5 from detail group by numcom order by sum(pu*qte) desc INTO temporaire FROM module

SGBD II

2012-2013

Page 5

www.ofppt-ma.forummaroc.net
Supprimer les stagiaires inscrits lanne dernire et stocker les dans la table archive

if exists (select * from stagiaire where datediff(year,dateinscrip ,getdate())=1) begin select * into archive from stagiaire where datediff(year,dateinscrip ,getdate())=1 delete from stagiaire where datediff(year,dateinscrip ,getdate())=1 end else print aucun stagiaire

Supprimer les 3 premiers stagiaires

DELETE from stagiaire Where n_stagiaire in (SELECT TOP 10 n_stagiaire FROM notation Group by n_stagiaire Order by avg(note) desc) Afficher dans une colonne nomme observation la valeur Echec ou rachet ou admis en fonction de la moyenne obtenue par le stagiaire

create proc observation as begin SELECT 'Observation' = CASE WHEN avg(note) < 9 THEN 'Echec' WHEN avg(note)>= 9 and avg(note)< 10 THEN 'Rachet' WHEN avg(note) >= 10 THEN 'Admis' ELSE 'Erreur de formule!' END, avg(note) AS 'moyenne', n_stagiaire as 'numro stagiaire' FROM notation ORDER BY avg(note) desc end

4.UDF : fonction utilisateur


Une UDF, autrement dit User Define Function ou Function Dfinie par l'Utilisateur est une fonction que le concepteur de la base crit pour des besoins de traitement au sein des requtes et du code des procdures stockes ou des triggers. Elle fait donc partie
Page 6

SGBD II

2012-2013

www.ofppt-ma.forummaroc.net
intgrante de la base ou elle est considre comme un objet de la base au mme titre qu'une table, une vue, un utilisateur ou une procdure stocke. Il existe deux grands types de fonctions : celles renvoyant une valeur et celles renvoyant un jeu de donnes (table). Exemple 1 : fonction renvoyant une valeur CREATE FUNCTION f1 (@f int) RETURNS int AS BEGIN return (select count(*) from stagiaire where n_fil=@f) END Appel de la fonction partir dune requte ou une procdure stocke CREATE PROCEDURE appelfonction AS declare @x int begin set @x=dbo.f1(1) print @x end

Le dbo est un utilisateur qui a les autorisations pour exercer toutes les activits dans la base de donnes. Tout objet cr par un membre du rle serveur fixe sysadmin appartient dbo automatiquement. Exemple2 : fonction renvoyant une table CREATE FUNCTION f2 (@fil int) RETURNS TABLE AS RETURN (SELECT n_stagiaire ,nom FROM stagiaire WHERE n_fil=@fil) Appel de la function de type table select * from dbo.f2(1)

SGBD II

2012-2013

Page 7

www.ofppt-ma.forummaroc.net
5.Les dclencheurs : Triggers
Microsoft SQL Server offre deux mcanismes principaux pour assurer l'application des rgles mtier et maintenir l'intgrit des donnes : les contraintes et les dclencheurs (triggers). Un dclencheur est un type spcial de procdure stocke qui est automatiquement invoqu (dclench) lorsqu'un vnement s'excute. Les dclencheurs DML s'excutent lorsqu'un utilisateur essaie de modifier des donnes via un vnement DML (Data Manipulation Language). Les dclencheurs DDL s'excutent en rponse diffrents vnements DDL (Data Definition Language).

I. Objectifs

Peuvent empcher les oprations INSERT, UPDATE et DELETE incorrectes Permettent de contrler que les donnes manipules vrifient lintgrit rfrentielle (un nouveau stagiaire doit tre affect une filire qui existe). Ce traitement peut tre effectu par la contrainte FOREIGN KEY. Permettent de Contrler des traitements correspondant une rgle de gestion de lentreprise. Capter le message systme et dafficher un message d'erreur dfini par l'utilisateur.

II. Mise en place d'un trigger


On peut dfinir un trigger par l'interface SQL Server Management Studio ou encore partir de l'analyseur de requte.

Syntaxe d'un trigger MS SQL Server


CREATE TRIGGER <nom_trigger> ON <table_ou_vue> FOR | AFTER | INSTEAD OF [ INSERT ] [ , ] [ UPDATE ] [ , ] [DELETE] AS begin <code>
end

III. Les vnements des dclencheurs

Vous avez le choix entre deux options pour dfinir le moment auquel un dclencheur est activ : Les dclencheurs AFTER ou For sont activs aprs l'action de dclenchement (INSERT, UPDATE ou DELETE), et aprs le traitement des ventuelles contraintes.

SGBD II

2012-2013

Page 8

www.ofppt-ma.forummaroc.net
Les dclencheurs INSTEAD OF sont activs la place de l'action de dclenchement et avant le traitement des contraintes. A. Les dclencheurs AFTER Les dclencheurs AFTER sont excuts aprs l'action associe une instruction INSERT, UPDATE ou DELETE. Ils ne sont jamais excuts en cas de violation de contrainte. Une table peut dtenir plusieurs dclencheurs AFTER par action de dclenchement. B. Les dclencheurs INSTEAD OF Les dclencheurs INSTEAD OF sont excuts la place de l'action de dclenchement (UPDATE, DELETE et INSERT). Ils sont excuts avant toute contrainte, ce qui leur permet d'effectuer un prtraitement qui complte les actions des contraintes. Chaque table ou vue peut disposer d'un seul dclencheur INSTEAD OF par action de dclenchement. Dclencheur AFTER
Tables

Fonction
Applicabilit Quantit par table ou vue

Dclencheur INSTEAD OF
Tables et vues

Plusieurs par action de Un par action de dclenchement dclenchement (UPDATE, DELETE et (UPDATE, DELETE et INSERT) INSERT) Non autoris sur des tables cible de contraintes d'intgrit rfrentielle en cascade

Rfrences en cascade

Aucune restriction

Aprs :
Traitement des contraintes Excution Cration de tables inserted et deleted

Avant : Aprs :
Traitement des contraintes cration de tables inserted et deleted

IV. Pseudo tables INSERTED et DELETED


Les pseudo tables INSERTED et DELETED contiennent les donnes respectives de l'insertion ou la mise jour (INSERTED) ou bien de la suppression (DELETED). La structure de ces tables est calque sur la structure de la table sur laquelle repose le trigger.

SGBD II

2012-2013

Page 9

www.ofppt-ma.forummaroc.net
Deux tables virtuelles sont cres au moment du dclenchement dun trigger : inserted et deleted ; elles sont destines contenir les lignes de la table sur lesquelles ont t effectues des oprations. La table inserted stocke des copies des lignes affectes par les instructions INSERT et UPDATE. Durant une transaction INSERT ou UPDATE, de nouvelles lignes sont ajoutes simultanment dans la table inserted et dans la table du dclencheur. Les lignes de la table inserted sont des copies des lignes cres dans la table du dclencheur. La table deleted stocke des copies des lignes affectes par les instructions DELETE . Pendant l'excution d'une instruction DELETE certaines lignes sont supprimes de la table du dclencheur et dplaces vers la table deleted.

Exemple 1 : Au moment de la suppression denregistrements de la table employs, enregistrer ces enregistrements dans la table archive.
ALTER TRIGGER [dbo].[TRIGGER1] ON [dbo].[PERSONNE] after DELETE AS BEGIN INSERT into aRCHIVE SELECT * from DELETED END

Annulation des effets d'un trigger Pour empcher un trigger de produire son effet on peut utiliser le ROLLBACK qui dans ce cas peut porter sur la transaction (ROLLBACK TRANSACTION celle qui a dclenche le trigger par exemple) ou uniquement le trigger (ROLLBACK TRIGGER) c'est dire sur les seuls effets de ce dernier. Exemple: Au moment de la saisie des dtails de la vente, le trigger vrifie que la quantit vendue du produit est suffisante c'est--dire infrieure ou gale la quantit stocke.
ALTER TRIGGER [dbo].[Trigger4] ON [dbo].[dtails] after INSERT AS BEGIN Declare @qv as int Declare @na as varchar(10) Set @qv= (select [quantit commande] from inserted ) Set @na = (select [num produit] from inserted ) If exists(select [num produit]from PRODUIT where [num produit] = @na and @qv >[qt stocke]) Begin print 'Quantit non disponible en stock' Rollback

SGBD II

2012-2013

Page 10

www.ofppt-ma.forummaroc.net
End Else Update PRODUIT set [qt stocke]= [qt stocke] - @qv where @na=[num produit] end

SGBD II

2012-2013

Page 11

www.ofppt-ma.forummaroc.net
Ecrire un trigger qui empche quon supprime plus de 10 n-uplets la fois dans la table EMPLOYE. Create TRIGGER [dbo].[ex1] ON [dbo].[archive] AFTER deLETE AS BEGIN if (select count(*) from deleted )>10 begin rollback print 'ne pas supprimer plus de 50 enreg' end END 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(tel) 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 A l'ajout de programmes, cherche si les filires saisies existent dans la table filire si ce n'est pas le cas il les rajoutes ALTER TRIGGER [dbo].[trig10] ON [dbo].[programme] instead of INSERT AS BEGIN insert into filire (codefil) select codefil from inserted where codefil not in (select codefil from filire) Insert into programme select * from inserted END 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)

SGBD II

2012-2013

Page 12

www.ofppt-ma.forummaroc.net
insert into archive1(NPERSONNE,nom,prenom) values(@n1+1,(select nom from inserted),(select prenom from inserted)) END 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) Print Ce stagiaire possde des notes Else delete from stagiaire where numstg in select numstg from deleted End 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 o A l'enregistrement d'un module dans le programme d'une filire cre un enregistrement dans la table notation pour chaque stagiaire de cette filire avec une note 0 Create trigger tr_i_prog On Programme for insert as Begin insert into notation select inserted.nummod.stagiaire.numstag,0 from insereted,stagiaire where inserted.numfil=stagiaire.numfil end

SGBD II

2012-2013

Page 13

www.ofppt-ma.forummaroc.net
6.Les Curseurs
Chaque instruction SQL excute par le serveur a son propre curseur qui lui est associ : Curseurs implicites : dclars pour toutes les instructions LMD et SELECT Curseurs explicites : dclars et nomms par le programmeur I. Les curseurs explicites On Utilise les curseurs explicites pour traiter individuellement chaque ligne retourne par une instruction SELECT. Il pointe sur la ligne courante dans un ensemble de lignes retournes par la requte SELECT ; Ceci permet au programme de traiter les enregistrements de la requte ligne ligne. Les curseurs permettent de raliser des traitements itratifs sur des jeux de rsultats. Pour autant Ils sont gourmands en ressources. II. Utilisation des curseurs 1. Dclarer le curseur en le nommant et en dfinissant la requte excuter (DECLARE CURSOR ). 2. Ouvrir le curseur. Linstruction OPEN excute la requte 3. Ramener les donnes du curseur. Linstruction FETCH charge une ligne du curseur dans des variables. 4. Fermer le curseur. Linstruction CLOSE libre lEnsemble Actif de lignes 5. Librer les ressources lies au curseur : Deallocate

Lordre Fetch

Fetch First : rcupre la 1re ligne du curseur Fetch Next : rcupre la ligne suivante de la position courante Fetch Prior : rcupre la ligne prcdente de ligne en cours Fetch last : rcupre la dernire ligne du curseur Fetch absolute n : rcupre la n me ligne du curseur

@@FETCH_STATUS : Renvoie l'tat de la dernire instruction FETCH effectue sur un curseur. Elle renvoie 0 si tout s'est bien pass, -1 s'il n'y a plus de lignes et -2 si la ligne est manquante. @@CURSOR_ROWS : Renvoie le nombre de lignes se trouvant actuellement dans le dernier curseur ouvert.

SGBD II

2012-2013

Page 14

www.ofppt-ma.forummaroc.net
Exemple : afficher les informations des vendeurs, pour chaque vendeur lister la liste des produits vendus ainsi que la quantit totale des ventes. DECLARE curs1 CURSOR FOR SELECT num, nom FROM vendeur WHERE ville = rabat ORDER BY nom OPEN curs1 FETCH NEXT FROM curs1 INTO @ num, @nom WHILE @@FETCH_STATUS = 0 BEGIN PRINT le numro : +@ num + le nom : + @nom DECLARE curs2 CURSOR FOR SELECT v.numproduit , v.qtvendue, p.intitul FROM vente v produit p WHERE p. numproduit = v. numproduit AND v.numvendeur = @num -- on charge dans le curseur que les -- produits vendus par le vendeur charg dans curs1 OPEN curs2 FETCH NEXT FROM curs2 INTO @prodnum,@qt,@intitul IF @@FETCH_STATUS <> 0 PRINT ' Les produits vendus par le vendeur '+ @num ' : ' Declare nb int Set nb = 0 WHILE @@FETCH_STATUS = 0 BEGIN PRINT @prodnum,@qt,@intitul FETCH NEXT FROM curs2 INTO @prodnum,@qt,@intitul Set @nb =@nb + @qt END CLOSE curs2 DEALLOCATE curs2 -- pointer sur le vendeur suivant de curs1 FETCH NEXT FROM curs1 INTO @num, @nom END CLOSE curs1 DEALLOCATE curs1

Il est possible de classifier un curseur en fonction des options d'extraction qu'il prend en charge :

Avant uniquement Les lignes doivent tre extraites en squence, de la premire la dernire. FETCH NEXT est la seule opration d'extraction autorise. Dfilement Les lignes peuvent tre extraites de manire alatoire partir d'un emplacement 2012-2013
Page 15

SGBD II

www.ofppt-ma.forummaroc.net
quelconque du curseur. les curseurs dynamiques ne prennent pas en charge l'option FETCH ABSOLUTE). Ces curseurs permettant le dfilement (SCROLLABLE)

Si l'option SCROLL n'est pas prcise dans une instruction DECLARE CURSOR , NEXT est la seule option FETCH prise en charge. Si SCROLL est prcise dans une instruction DECLARE CURSOR, toutes les options FETCH sont prises en charge.
Copier le contenu dune table A vers une autre table B. L'insert ne doit se faire que sur les nouveaux enregistrements. -- Dclaration des variables rcuprant les donnes insrer dans la table B. DECLARE @NUM varchar(17), @INTITULE varchar(35), @CLASSEMENT varchar(17) -- Dclaration du curseur DECLARE curseur CURSOR FOR SELECT NUM, INTITULE, CLASSEMENT FROM dbo.tableA OPEN curseur FETCH NEXT FROM curseur INTO @NUM, @INTITULE, @CLASSEMENT WHILE @@FETCH_STATUS = 0 BEGIN -- On teste si le champ n'est pas connu dans la table IF NOT EXISTS (SELECT * FROM dbo.tableB WHERE NUM = @NUM) BEGIN -- Si il est inconnu de la table, on insert les donnes. INSERT INTO dbo.tableA (NUM, INTITULE, CLASSEMENT) VALUES(@NUM, @INTITULE, @CLASSEMENT) -- On passe l'enregistrement suivant FETCH NEXT FROM curseur @NUM, @INTITULE, @CLASSEMENT END END -- Fermeture du curseur CLOSE curseur -- Libration de la mmoire du curseur cr. DEALLOCATE curseur

SGBD II

2012-2013

Page 16

www.ofppt-ma.forummaroc.net
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 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

SGBD II

2012-2013

Page 17

www.ofppt-ma.forummaroc.net

SGBD II

2012-2013

Page 18