Académique Documents
Professionnel Documents
Culture Documents
420-2DB-HY
Notes de cours
La vue
Le langage SQL procédural
Les transactions
La procédure stockée
Enseignant
Giovana Velarde
Hiver 2023
CÉGEP DE SAINT-HYACINTHE
La vue
Une vue est une table virtuelle dont le contenu est défini par une requête. Les lignes et les
colonnes de données proviennent de tables référencées dans la requête qui définit la vue et
sont produites dynamiquement lorsque la vue est référencée1.
Une vue apparaît à l'utilisateur comme une table réelle, cependant les lignes d'une vue ne sont
pas stockées dans la BD2. Les tables référencées par une vue sont appelées « tables de
base », « tables sous-jacentes » ou « tables référencées ». La requête qui définit la vue peut
faire aussi référence à d'autres vues.
Paramètres :
nom_vue Nom de la vue.
nom_colonne Nom à utiliser pour une colonne dans une vue. (Facultatif)
instruction_select Instruction SELECT qui définit la vue. Elle peut utiliser plusieurs
tables et d'autres vues.
WITH CHECK OPTION Cette option permet d’implanter une contrainte d'intégrité lors des
mises à jour au travers de la vue. Oblige toutes les instructions de
modification de données exécutées sur la vue à respecter les
conditions exprimées dans instruction_select.
Notes :
• Les noms de colonnes doivent être uniques.
• Si vous ne spécifiez pas le paramètre nom_colonne, les colonnes de la vue prennent les
mêmes noms que les colonnes de l’instruction SELECT.
• Une colonne qui est dérivée d'une expression arithmétique, d'une fonction ou d'une
constante doit avoir soit un alias assigné dans la clause SELECT, soit un nom de colonne
dans la déclaration de la vue.
• L’instruction SELECT ne peut pas inclure les clauses suivantes :
o Une clause ORDER BY, sauf si une clause TOP figure également dans la liste de sélection
de l'instruction SELECT.
o Le mot clé INTO.
1
https://docs.microsoft.com/fr-fr/sql/relational-databases/views/views?view=sql-server-ver15
2
Sauf pour une vue indexée.
Exemple :
Exemple : la définition de la vue suivante inclut la fonction d’agrégation COUNT. Si vous utilisez
des fonctions, vous devez attribuer un nom à la colonne dérivée.
Syntaxe :
Exemple :
Syntaxe :
Exemple :
Exemple : Il est possible de consulter la vue Employe10 avec une instruction SELECT comme
s'il existait une table Employe10 des employés du département 10.
SELECT *
FROM vue_employés_département10
UPDATE vue_employés_département10
SET salaire = salaire * 1.1;
La modification suivante réussit car les colonnes qui sont modifiées proviennent uniquement
d'une des tables de base (produit)
UPDATE vue_catégories_produits
SET nom_produit = 'Chai'
WHERE no_produit = 1;
La modification suivante réussit aussi car les colonnes qui sont modifiées proviennent
uniquement d'une des tables de base (catégorie)
UPDATE vue_catégories_produits
SET nom_catégorie = 'Jus'
WHERE no_produit = 1;
Cependant, la modification suivante ne réussit pas car les colonnes qui sont modifiées
proviennent de deux tables de base (catégorie et produit)
UPDATE vue_catégories_produits
SET nom_produit = 'Chai', nom_catégorie = 'Jus'
WHERE no_produit = 1; -- erreur
Le code suivant remplace la valeur de la colonne téléphone dans la table employé d’une
employée spécifique (Marie Leblanc) par l'intermédiaire de la vue
vue_employé_département10.
UPDATE vue_employé_département10
SET téléphone = '4387752356'
WHERE nom_employé = 'Leblanc' AND prénom_employé = 'Marie';
Le code suivant donne erreur car la vue affiche seulement les employés du département 20.
UPDATE vue_employé_département10
SET no_département = 20
WHERE nom_employé = 'Leblanc' AND prénom_employé = 'Marie'; -- erreur
Les variables
Une variable est une zone mémoire caractérisée par un type et un nom, et permettant de
stocker une valeur respectant le type.
Syntaxe :
Paramètres :
nom_variable Nom de la variable.
Type donnée Valeur assignée à la variable.
valeur Instruction SELECT qui définit la vue. Elle peut utiliser plusieurs
tables et d'autres vues.
Notes :
• Le nom d’une variable locale est précédé du symbole @.
• Une variable utilisateur doit être obligatoirement déclarée avant d’être utilisée.
• Après la déclaration, toutes les variables sont initialisées avec la valeur nulle à moins qu'une
valeur ne soit fournie dans le cadre de la déclaration.
• La notion de constante n'existe pas dans Transact-SQL
Exemples :
Une variable peut être affectée avec une valeur au moment de sa déclaration ou en utilisant
l’instruction SET ou SELECT. Une sous-requête assignant une valeur à une variable locale ne
doit retourner qu'une seule valeur.
Exemples :
SET @Id = 0
L’instruction SELECT permet d’assigner une valeur à plusieurs variables séparées par comma.
L’instruction suivante permet de valoriser une variable via l’exécution d’une requête SELECT
scalaire. Si la requête ne renvoie aucune ligne, la valeur assignée à la variable est NULL
Exemples :
IF @@ERROR <> 0
PRINT 'Erreur';
IF @@ROWCOUNT = 0
PRINT 'Aucune ligne a été modifiée';
Les instructions
Le langage de contrôle de flux T-SQL utilise des instructions qui permettent de rendre les
données plus présentables ou de les manipuler avec plus de facilité. Par exemple, pour des
actions répétitives ou des actions nécessitant une condition.
USE
L’instruction USE permet de préciser le nom de la base de données cible.
Exemple :
USE AdventureWorks2017;
PRINT
L’instruction PRINT permet l’affichage des messages.
L’exemple suivant personnalise la sortie d’une requête.
3
https://www.codeproject.com/Articles/39131/Global-Variables-in-SQL-Server
Exemple :
BEGIN … END
Délimite une série ou bloc d’instructions pour permettre l'exécution groupée. Si plus d'une
instruction est nécessaire dans un bloc conditionnel, il faut utiliser BEGIN et END.
Exemple :
IF DATEPART(WEEKDAY,GETDATE()) = 6
OR DATEPART(WEEKDAY,GETDATE()) = 7
BEGIN
PRINT 'Nous sommes en week-end.'
PRINT 'Faites une pause !'
END
ELSE
BEGIN
PRINT 'Nous sommes en semaine.'
PRINT 'Vite, au boulot !'
END
La boucle WHILE
L’instruction WHILE permet d’exécuter un bloc d’instructions de manière répétitive, en fonction
d’une condition. Tant que la condition est vraie, ce bloc d’instructions sera exécuté.
À l’intérieur du bloc d’instructions d’une boucle WHILE il est possible d’utiliser l’instruction BREAK
qui permet de sortir de la boucle en interrompant son exécution, et l’instruction CONTINUE qui
permet de relancer immédiatement l’exécution du bloc d’instruction.
Dans l’exemple suivant la colonne ContactID est utilisée dans la boucle pour afficher la liste
de contacts enregistrés dans la table Fournisseurs.
SET @i = 1
EXECUTE ou EXEC
Cette instruction permet de lancer une requête, une procédure stockée ou un déclencheur.
L’exemple suivant lance l’exécution de la requête SELECT assemblée dans la variable @SQL.
EXEC (@SQL)
GO
Le mot clé GO permet de forcer l'exécution d’un ordre ou une suite d'ordres SQL ou T-SQL. Il
demande au serveur l'exécution immédiate de cet ordre ou de l'ensemble d'ordres.
Exemple :
USE MaBaseDeDonnees
GO
RETURN
Cette instruction vous permet de sortir d’un bloc d’instructions (transaction, procédure stockée,
déclencheur) en retournant une valeur.
L'exemple suivant renvoie la valeur 1 lorsqu'un ouvrage dispose d'un contrat correct et la valeur
2 dans tous les autres cas.
IF (SELECT COUNT(*)
FROM titre
WHERE no_titre = @titreId ) > 1
RETURN 1
ELSE
RETURN 2
Lot (batch)
Un lot est une suite d'ordres SQL ou T-SQL qui seront exécutées en un seul et unique bloc. Un
lot se termine par l’instruction GO4. Un lot est exécuté en tout ou rien. Ainsi, une simple erreur de
syntaxe, même sur le dernier ordre du lot, fera que tout le lot ne s’exécutera pas.
Script
Un script est un ensemble de lots, qui peut être enregistré dans un fichier dont l’extension est
« .sql ». Par exemple, un fichier « script.sql » qui contient la définition physique de la base de
données : des tables, certaines entrées de données et certains objets de la base tels que les
contraintes, les vues, les procédures stockées ou les déclencheurs.
Note : Certains ordres ne peuvent pas être passés simultanément dans le même lot. Par
exemple la suppression d'un objet (DROP) et sa recréation immédiatement après, (CREATE) est
source de conflits.
4
GO n’est pas une instruction T-SQL, mais une commande reconnue par les utilitaires sqlcmd et osql, ainsi que l’éditeur de code
SQL Server Management Studio. https://docs.microsoft.com/fr-fr/sql/t-sql/language-elements/sql-server-utilities-statements-
go?view=sql-server-ver15
Table temporaire
La table temporaire est une table ayant une durée de vie très limitée. Elle est destinée à fournir
un espace de travail pour les résultats intermédiaires lors du traitement de données. Cette table
est visible uniquement à la connexion courante de l'utilisateur et est supprimée dès que
l'utilisateur se déconnecte de l'instance de SQL Server. Pour créer, modifier et supprimer une
table temporaire, on utilise les mêmes commandes que pour les tables normales. Le premier
caractère du nom des tables temporaires locales est un signe dièse « # ».
Exemple :
Les transactions
Une transaction est une unité logique et atomique de traitement qui contienne un ensemble de
modifications de la base de données permettant de faire passer la BD d'un état cohérent à un
autre état cohérent. Cette unité est indivisible car elle est soit complètement exécutée, ou soit
complètement abandonnée. En effet, si une transaction ne va pas à son terme pour une raison
ou pour une autre, la base de données est restaurée dans l'état où elle se trouvait avant que la
transaction ne démarre.
Par exemple, une transaction peut transférer une somme d'argent entre deux comptes d'un
client d'une banque. Elle comporte deux ordres : d’abord un débit sur un compte et puis un
crédit sur un autre compte. Si un problème empêche le crédit, le débit doit être annulé. Le
pseudocode suivant process le transfert bancaire d’une somme d’argent S d’un compte C1 vers
un compte C2.
(1) début-transaction
(2) lire C1
(3) C1 := C1 - S
(4) écrire C1
(5) lire C2
(6) C2 := C2 + S
(7) écrire C2
(8) fin-transaction
Cette transaction est constituée d’un ensemble d’actions élémentaires, mais elle doit être traitée
comme une seule opération. Autrement dit, le gestionnaire des transactions doit assurer que
toutes les actions de la transaction sont exécutées, ou bien que aucune ne l’est.
Paramètres :
nom_transaction Nom de la variable.
Notes :
• Une transaction débute par les mots clés BEGIN TRANSACTION et termine par les mots clés
COMMIT TRANSACTION ou un ROLLBACK TRANSACTION.
• L’instruction COMMIT termine une transaction avec succès. Toutes les mises à jour de la
transaction sont validées et on dit que la transaction est validée. Tous ses effets sont alors
connus des autres transactions s'exécutant concurremment. En bref, l’opération COMMIT
détermine le point ou la base de données est de nouveau cohérente.
• L’instruction ROLLBACK termine une transaction avec échec. Toutes les opérations sont
annulées et la base de données retourne dans l’état où elle était au moment de l’appel à
l’instruction BEGIN TRAN. On dit que la transaction est annulée. Aucune des opérations
effectuées par cette transaction n'est connue des autres transactions.
Dans l’exemple suivant, le nom du client avec code ‘CL00013’ sera changé par ‘Michel‘ du fait
du COMMIT TRANSACTION qui valide la transaction.
UPDATE client
SET nom_client = 'Michel'
WHERE no_client = 'CL00013'
Dans l’exemple suivant, le nom du client avec code ‘CL00012’ ne sera pas changé par ‘André’
car la transaction se termine par un ROLLBACK TRANSACTION.
UPDATE client
SET nom_client = 'André'
WHERE no_client = 'CL00012'
UPDATE employé
SET no_département ='D005'
WHERE no_employé = 10;
UPDATE employé
SET salaire = 45000
WHERE no_employé = 10;
Dans l’exemple suivant, la transaction permet de réserver trois places dans le vol AF714 pour le
client C00123, s'il y a bien de la place pour ce vol.
BEGIN TRANSACTION
-- Validation de l'ensemble
COMMIT TRANSACTION
La procédure stockée
Une procédure stockée est un programme enregistré dans la base de données associant le
langage SQL (déclaratif) et langage de T-SQL (procédural).
Les procédures ressemblent à des constructions d'autres langages de programmation, car elles
peuvent :
• Accepter des paramètres d'entrée et retourner plusieurs valeurs sous la forme de
paramètres de sortie au programme appelant.
• Contenir des instructions de programmation qui effectuent des opérations dans la base de
données. Cela inclut l'appel d'autres procédures.
• Retourner une valeur d'état à un programme appelant pour indiquer une réussite ou un
échec.
Les procédures stockées offrent plusieurs avantages :
• Réduction du trafic sur le réseau : Les clients SQL ont seulement à envoyer l'identification de
la procédure et ses paramètres au serveur sur lequel elle est stockée.
• Optimisation de l’exécution : Les procédures sont précompilées une seule fois quand elles
sont enregistrées. Leurs exécutions ultérieures n'ont plus à passer par cette étape et sont
donc plus rapides.
• Fonctionnement en « boîte noire ». Les développeurs d’applications n'ont pas à connaître les
détails de l'exécution des procédures. L'écriture et l’entretien des applications sont donc
facilités.
• Réutilisation du code : la procédure stockée encapsule le code de toute opération répétitive.
Cela élimine les réécritures inutiles du même code et réduit les incohérences du code.
Syntaxe :
Paramètres :
Notes :
• Une procédure stockée peut retourner une valeur scalaire ou des lignes de table comme une
requête.
• Pour déclarer un paramètre, il faut précéder leur nom du symbole "@" et lui attribuer un type.
• L'instruction SET NOCOUNT ON placée comme première instruction dans le corps de la
procédure permet de désactiver les messages renvoyés par chaque instruction exécuté de
la procédure.
• Pour exécuter une procédure stockée utiliser l’instruction EXEC.
• Toute procédure stockée renvoie une variable de type entier pour signaler son état. Si cette
variable vaut zéro, la procédure s'est déroulée sans anomalie. Toute autre valeur indique un
problème. Les valeurs de 0 à -99 sont réservées et celles de 0 à -14 sont prédéfinies. Par
exemple la valeur -5 signifie « erreur de syntaxe ».
Exemples :
L'exemple suivant crée une procédure stockée qui retourne tous les employés (prénom et nom)
et leur nom du département à partir de la vue vue_employés.
L’exemple suivant cherche dans la table produit la qté des produits dont le nom contienne la
valeur du paramètre @mot.
Pour exécuter la procédure antérieure, le mot jouet et passé dans le paramètre @Mot et le
paramètre @qte est utilisé en sortie pour recevoir le résultat de la recherche.
L’exemple suivant modifie la procédure stockée et ajoute l’instruction SET NOCOUNT ON pour
enlever les messages d’exécution dans la sortie.
Si vous indiquez des paramètres sous la forme « @paramètre = valeur », vous pouvez les
placer dans n'importe quel ordre et vous devez présenter tous les autres paramètres sous la
même forme.
L'exemple suivant crée une procédure stockée qui retourne des informations pour un employé
spécifique en passant des valeurs pour le prénom et le nom de l'employé.
Pour exécuter la procédure. Notez que différentes méthodes de spécification des valeurs de
paramètre sont affichées :
Si l’appel à la procédure est la première dans un lot, il est possible de l’exécuter sans utiliser le
mot clé EXEC.
Dans l’exemple suivant, la valeur par défaut du paramètre Nom est NULL. Dans ce cas, si
l'utilisateur n'indique pas de valeur pour le paramètre @Code, SQL Server exécute la procédure
sans afficher de message d'erreur. La structure de control IF…ELSE vérifie la valeur du
paramètre @Code et déclenche une action en conséquence.
L'exemple ci-dessous utilise une instruction UPDATE dans une procédure stockée. La procédure
accepte le paramètre d'entrée @NouvellesHeures qui est utilisé dans l’instruction UPDATE
pour mettre à jour la colonne HeuresVacances de la table employé.
Dans l'exemple ci-dessous l'état d'exécution de la procédure est stocké dans la variable
@status. Cet exemple affiche simplement la valeur au moyen d’une instruction SELECT.
SELECT @status
Note : La suppression d'une procédure stockée peut entraîner l'échec des scripts et des objets
dépendants. Avant de supprimer une procédure stockée, vérifiez les objets dépendants et
modifiez-les en conséquence.
Exemple:
Vous pouvez créer vos propres valeurs de retour dans des procédures stockées en ajoutant un
paramètre à l'instruction RETURN.
L'exemple suivant renvoie la valeur 1 lorsqu'un ouvrage dispose d'un contrat correct et la valeur
2 dans tous les autres cas.
IF (@ValeurRetour = 1)
PRINT 'Le livre existe dans notre magasin';
ELSE
PRINT 'Le livre n''existe pas dans notre magasin';