Académique Documents
Professionnel Documents
Culture Documents
Mme Andaloussi
2ème année DSI
Transact SQL
Année Universitaire:
2020-2021
Introduction
• SQL est un langage non procédural
• Les traitements complexes sont parfois difficiles à écrire si on ne peut utiliser des
variables et les structures de programmation comme les boucles et les alternatives
• On ressent vite le besoin d’un langage procédural pour lier plusieurs requêtes SQL
avec des variables et dans les structures de programmation habituelles
Mme Andaloussi/DSI2 2
Les variables
Déclarer des variables:
Declare @Nom_Variable Type_Donnée
Mme Andaloussi/DSI2 3
Affichage de variable et message
Print message
Print @nom_variable
Exemples:
Mme Andaloussi/DSI2 4
Les structures de contrôles
1. La structure IF
IF condition
Syntaxe: begin
instructions
end
[ELSE
begin
instructions
End]
Mme Andaloussi/DSI2 6
2. La structure case
Syntaxe: Case
When Condition1 Then Résultat 1
When Condition2 Then Résultat 2
...
Else Résultat N
Exemple: End
Mme Andaloussi/DSI2 7
3. La boucle while
Syntaxe: Remarques:
While Condition • Le mot clé Break est utilisé dans une boucle While pour
instructions • Le mot clé Continue est utilisé dans une boucle While pour
Begin
Exemple:
Update article Set puart=puart+puart*0.1
End
Mme Andaloussi/DSI2 8
4. Branchement inconditionnel
Syntaxe:
GOTO label
Mme Andaloussi/DSI2 9
Les Transactions
Une transaction est un ensemble d’instructions de manipulations de données s’exécutant
dans une même unité de travail. La validation d’une transaction(commit) assure que
toutes les instructions en faisant partie se sont correctement terminées. L’annulation de la
transaction(rollback) assurera l’annulation de l’ensemble de ses instructions.
Une transaction est caractérisée par le mot l’acronyme ACID (Atomic Consistency Isolation
Durability) :
• Atomique: Les commandes SQL faisant partie de la transaction sont exécutées
complètement ou pas du tout
• Consistance : à la fin d’une transaction, les données montrées sont soit celles d’avant
la transaction (dans le cas d’une annulation de la transaction) soit celles d’après la
transaction (dans le cas d’une validation).
• Isolation : il est possible de verrouiller (isoler) les données pendant l’exécution de la
transaction (verrouillage en lecture, en écriture, …).
Mme Andaloussi/DSI2 10
Les Transactions
Exemple:
Syntaxe:
Mme Andaloussi/DSI2 11
Les curseurs
• En programmation SQL, lorsqu’une requête retourne plusieurs lignes, il est possible de
traiter chaque ligne au moyen d’un curseur.
• Un curseur est une variable dynamique qui prend pour valeur le résultat d’une requête.
Mme Andaloussi/DSI2 12
Types des curseurs
• Curseurs à défilement en avant (Forward Only) : Ce type de curseur ne met, à la
disposition de l'utilisateur, qu'une seule ligne à la fois. Cette ligne peut être lue et mise à
jour. L'utilisateur ne peut se déplacer que vers la ligne suivante (accès séquentiel)
• Curseurs statiques (Static) : L'avantage de ce type de curseur par rapport au précédent est
que l'accès peut se faire à partir d'une ligne dans différents sens (MoveFirst, MoveNext,
MovePrior, MoveLast)
• Curseurs d'ensemble de valeurs clés (Keyset) :Une clé (un signet) faisant référence à la
ligne d'origine de la base de données source est créée et enregistrée pour chaque ligne du
curseur cela permet d'accéder aux données en temps réel à la lecture ou à la manipulation
d'une ligne du curseur. Le déplacement entre les lignes est sans restriction (MoveFirst,
MoveNext, MovePrior, MoveLast) et la mise à jour des données est possible
Mme Andaloussi/DSI2 14
Les curseurs
Fermer un curseur: close nom_curseur
Deallocate Nom_Curseur
Libérer les ressources allouées:
2. Le curseur de nom empCur est chargé dans cet exemple de récupérer le résultat de la
requête qui suit. Il peut alors être ouvert lorsqu’on souhaite l’utiliser : OPEN empCur
4. La première fois, c’est le premier tuple du résultat de la requête qui est affecté comme
valeur à la variable @employeVar (qui devra être déclarée de façon adéquate).
Mme Andaloussi/DSI2 17
Exemples:
• L’exemple suivant sélectionne l’ensemble des employés dont le salaire ne dépasse
pas 6000.00 et les augmente de 500.00
DECLARE SalCur CURSOR for
SELECT empno FROM EMP WHERE SAL<6000.00
DECLARE @id int
OPEN SalCur
FETCH from SalCur INTO @id
While @@fetch_status=0
begin
UPDATE EMP
SET SAL=SAL+500.00 WHERE EMPNO=@id
FETCH from SalCur INTO @id
end
Close SalCur
Deallocate SalCur
Mme Andaloussi/DSI2 18
Un lot d’instructions
Mme Andaloussi/DSI2 19
Procédures et Fonctions
• Dans TransactSQL, on peut exécuter directement un lot en tapant sa définition
• Le plus souvent, on crée plutôt une procédure ou une fonction nommée pour
réutiliser le code.
• Syntaxe :
Mme Andaloussi/DSI2 20
Procédures et Fonctions
• Syntaxe des Paramètres:
Mme Andaloussi/DSI2 21
Exemples:
Create Procedure SP_Articles Create Procedure SP_ListeArticles @NumCom int as
as Select A.NumArt, NomArt, PUArt, QteCommandee
Select NumArt, DesArt From Article A, LigneCommande LC
from Article Where LC.NumArt=A.NumArt and LC.NumCom=@NumCom
Mme Andaloussi/DSI2 23
Fonctions Scalaire
Mme Andaloussi/DSI2 24
Exemples:
create function euro_to_fr(@somme real)
RETURNS real AS Définition de
begin la fonction
Utilisation de la euro_to_fr
Declare @taux real = 6.55957;
fonction
return @somme * @taux;
euro_to_fr
end;
AS
return requête_de_sélection
Mme Andaloussi/DSI2 26
Exemples
Create Function F_ListeArticles (@NumCom int )
Returns Table
as
Select A.NumArt, DesArt From Article A, LigneCommande LC
Where LC.NumArt=A.NumArt and LC.NumCom=@NumCom
par un client
2. Définir une fonction table inline qui permet l’affichage des articles
Mme Andaloussi/DSI2 28
L’option with schemabinding
Exemple :
Mme Andaloussi/DSI2 29
Mme Andaloussi/DSI2 30
Mme Andaloussi/DSI2 31
Mme Andaloussi/DSI2 32
L’affichage des messages d’erreur
Il est parfois intéressant de signaler une erreur. En effet, en levant une erreur, on
peut mentionner, par un message, le type de l’erreur rencontré. Pour ce faire, il faut
utiliser l’instruction Transact-SQL RAISERROR dont le format est le suivant :
• Le message est une chaîne de caractères libre mentionnant le type de l’erreur qui
est survenu.
Mme Andaloussi/DSI2 33
L’affichage des messages d’erreur
• La gravité(ou sévérité) est un entier compris entre 0 et 18 qui représente la gravité
de l’erreur. Seul l'administrateur système peut ajouter des messages avec un niveau
de gravité compris entre 19 et 25
• L’état est un entier, compris entre 1 et 127, qui peut être utilisé pour repérer l’endroit
où l’erreur s’est produite. Par exemple, si la même erreur peut survenir à plusieurs
endroits du déclencheur, l’état permettra de désigner l’instruction RAISERROR qui a
été exécutée.
• Argument : Dans le cas où le message d’erreur prédéfini ou non possède des
paramètres, il faut les valoriser à partir de constantes ou bien de variables(voir
deuxième exemple de la diapositive qui suit).
Mme Andaloussi/DSI2 34
Exemples
If (@s<0)
RAISERROR (‘!!Le stock est négatif !!', 12, 1)
Lorsqu’on veut lever une erreur, on peut soit donner l’identifiant de l’erreur en question, soit
lui donner un message particulier. Si on lui donne un message particulier comme nous l’avons
fait dans l’exemple ci-dessus, il faut automatiquement lui préciser une gravité et un état.
Declare @n int =1
Raiserror(‘erreur sur le client : %d ’, 18,1,@n)
Mme Andaloussi/DSI2 35
Les messages d’erreur
On peut aussi ajouter un nouveau message d’erreur en faisant appel à la
procédure stockée sp_addmessage et le supprimer par la procédure stockée
sp_dropmessage.
Mme Andaloussi/DSI2 36
Les messages d’erreur
Mme Andaloussi/DSI2 37
Gestion des erreurs dans le code
Il existe deux manières de gérer les erreur : La première consiste à tester la valeur de la variable
système @@ERROR, la seconde consiste à positionner dans un gestionnaire d’exception TRY le
bloc d’instructions à tester, et dans le CATCH, l’erreur à lever. Voyons la syntaxe :
BEGIN TRY
-- ...
END TRY
BEGIN CATCH
-- ...
END CATCH
Le bloc CATCH suit toujours le bloc TRY. Celui-ci est exécuté si et seulement si,
l’exécution d’une instruction du bloc TRY lève une erreur. Dans le bloc CATCH, le code
permet de gérer l’erreur levée. Pour obtenir des informations sur cette dernière, il est
Mme Andaloussi/DSI2 38
Gestion des erreurs dans le code
possible d’utiliser les fonctions SQL suivantes :
- ERROR_MESSAGE() : Retourne le texte du message à communiquer à l’application. Ce
texte comprend tous les paramètres mis en argument à l’erreur en question.
- ERROR_NUMBER() : Retourne le numéro de l’erreur.
- ERROR_SEVERITY() : Retourne le niveau de gravité.
- ERROR_STATE() : Retourne l’état.
Exemple :
begin try
insert into commande values(1,’10/10/2018’)
insert into commande values (1,getDate())
end try
begin catch
print ‘erreur lors de l’insertion dans la table Commande’ + ERROR_MESSAGE()
end catch
Mme Andaloussi/DSI2 39
Gestion des erreurs dans le code
Mme Andaloussi/DSI2 40
Exemple :
Mme Andaloussi/DSI2 41
Les déclencheurs(Triggers)
• Les déclencheurs ou ”triggers” sont des séquences d’actions définis par le programmeur
qui se déclenchent, non pas suite à un appel, mais directement quand un événement
particulier (spécifié lors de la définition du trigger) sur une ou plusieurs tables se produit.
• Les triggers complètent les contraintes d’intégrité en permettant des contrôles et des
traitements plus complexes.
• Un trigger est un objet stocké (comme une table, une vue, un index, une séquence ou
une procédure)
• Syntaxe :
Mme Andaloussi/DSI2 42
Les déclencheurs(Triggers)
• Un trigger se déclenche après (FOR|AFTER) une insertion, destruction ou mise à
jour (INSERT|DELETE|UPDATE ) sur une table (à noter que l’on peut exprimer des
conditions plus complexes avec la virgule: INSERT , DELETE, ...).
• FOR ou AFTER : Ces déclencheurs s’exécutent après que l’instruction SQL ait été
complètement exécutée. Le déclencheur ne sera exécuté que si l’instruction SQL
s’est passée correctement. En particulier, si toutes les contraintes programmées
(contraintes d’intégrité, contrainte référentielle, clause CHECK) ont été vérifiées.
FOR et AFTER sont des synonymes.
• INSTEAD OF: Il s’agit d’un type particulier de déclencheur. Ainsi au lieu d’exécuter
la requête SQL qui a déclenché le trigger, seul le code du trigger est exécuté.
• WITH ENCRYPTION: La définition du déclencheur est enregistrée de façon cryptée.
Mme Andaloussi/DSI2 43
Les anciennes et les nouvelles valeurs
• Un déclencheur n’est exécuté qu’une seule fois même si la requête SQL
qui a provoqué son exécution porte sur plusieurs lignes.
• Pour travailler sur chaque ligne pointée par la requête SQL, il est
nécessaire de définir un curseur sur les pseudo-tables inserted ou deleted.
Mme Andaloussi/DSI2 44
Exemples:
Create Trigger Empêcher_Modif
Create Trigger Tr_Empêcher_Modif
On Commande
On Commande
For Update As
For Update
if update(NumCom)
As
Begin
rollback
Raiserror('le numéro de commande ne peut
être modifié',15,120)
Rollback
CREATE TABLE T1 (num1 int, num2 int);
CREATE TABLE T2 (num3 int, num4 int); End
CREATE TRIGGER inverse if update(DatCom)
AFTER INSERT ON T1
Declare @n1,@n2 int
Begin
Select @n1= num1,@n2=num2 from inserted if ((select count (DatCom) from inserted
INSERT INTO T2 VALUES(@n2, @n1) Where datediff(day,datcom,getdate() )>0)<> 0)
Begin
Raiserror('La date de commande ne peut pas
être inférieure à la date en cours',15,120)
Rollback
End End
Mme Andaloussi/DSI2 45
Gestion des Triggers
• Suppression d’un trigger:
Mme Andaloussi/DSI2 46