Cours en Devlopement Informatique

  • SQL SEVER

Programmer des procédures stockées



I. Les différents types de procédures stockées

Il existe 3 types de procédures stockées :

  • Les procédures de type système qui résident dans la base de données Master et sont utilisées pour des tâches d’administration : préfixe SP_.
  • Les procédures de type système, mais étendues, qui résident dans la base de données Master et sont utilisées pour des tâches diverses mais hors services SQL. Elles sont implémentées comme des DLL. Leur nom est précédé d’un préfixe XP_. 
  • Les procédures stockées locales. Elles sont définies par l’utilisateur et sont stockées dans les bases de données utilisateur.

II. Codification des procédures stockées

La conception des procédures stockées doit obéir aux mêmes règles que celles relatives à la conception des fonctions et procédures définies dans d’autres langages : la procédure stockée doit effectuer une et une seule tâche. Ainsi, si nous devons programmer les opérations de maintenance des données de la table client, nous devrons coder 3 procédures relatives à l’ajout, la modification et la suppression d’un client.

 Création, modification et suppression d’une procédure stockée

Comme pour les autres objets SQL, nous associerons les mots clefs CREATE, ALTER ou DROP, au type de l’objet PROCEDURE et à son nom, afin de créer, modifier ou supprimer une procédure.

 

Opérations de création et maintenance des Procédures stockées

La procédure stockée PS_Client_Supprimer

III. Définition des paramètres

Les procédures stockées acceptent des paramètres dont il sera nécessaire de définir les caractéristiques :

  • Le nom du paramètre, préfixé d’un @ pour l’utiliser comme variable dans le programme.
  • Le type de données choisi parmi les types SQL ou les types définis par l’utilisateur
  • Une valeur par défaut optionnelle
  • La direction, par défaut en entrée. Pour définir un paramètre en sortie, il sera nécessaire de lui associer le mot clé OUTPUT

Par convention, lorsque le paramètre s’apparente à la valeur d’une colonne, il portera un nom identique à celle-ci. 

Dans l’exemple précédent, la procédure reçoit en entrée la valeur de l’identifiant de la table Customers (CustomerID). Le paramètre sera donc nommé @CustomerID.

Il existe un paramètre en sortie défini par défaut pour toute procédure stockée @RETURNVALUE qui reçoit la valeur de l’opération RETURN et la transmet au programme appelant.

Les paramètres doivent être définis en entête de la procédure avant la clause AS qui délimite le début du code implémenté dans la procédure.

Paramètres d'une procédure stockée

 

Vous noterez ici le caractère optionnel du paramètre @Descriptif qui, par défaut, prendra la valeur NULL. 

Le paramètre @IdCCP est défini en sortie car nous souhaitons récupérer dans ce dernier une valeur attribuée par le système à la colonne identifiant de la table CCP. La colonne a comme attribut la propriété IDENTITY (compteur).

 Exemples de procédures stockées

L’exemple suivant représente une opération d’insertion sur une table dont la valeur de la clé primaire est affectée par le système. 

Procédure d'insertion d'une ligne

Vous noterez ici le caractère optionnel du paramètre @Descriptif qui, par défaut, prendra la valeur NULL. 

Le paramètre @IdCCP est défini en sortie car nous souhaitons récupérer dans ce dernier une valeur attribuée par le système à la colonne identifiant de la table CCP. La colonne a comme attribut la propriété IDENTITY (compteur).

Exemples de procédures stockées

L’exemple suivant représente une opération d’insertion sur une table dont la valeur de la clé primaire est affectée par le système. 

Procédure d'insertion d'une ligne

A noter :

Utilisation de NOCOUNT

Empêche/oblige l'envoi au client de messages pour chaque instruction d'une procédure stockée affichant la ligne « nn rows affected » à la fin d'une instruction (SELECT, INSERT, UPDATE, DELETE).

Il est recommandé de désactiver le comptage dans les procédures stockées afin d'éviter l'envoi intempestif de lignes non lues qui génère du trafic réseau et rallonge les temps d'exécution.

Utilisation de la fonction SCOPE_IDENTITY() :

Cette fonction permet de récupérer la dernière valeur affectée à une colonne identité lors de la dernière instruction INSERT exécutée.

Par convention, lorsqu’une procédure s’exécute correctement, la valeur retournée est 0.

Le deuxième exemple est une procédure d’insertion dans une table dont les valeurs des clés primaires ne sont pas allouées par le système. On doit alors vérifier qu’il n’existe pas de ligne avec une valeur de clé identique à celle que l’on souhaite insérer.

Insertion d'une ligne avec contrôle valeur clé primaire

A noter :

Utilisation de l’instruction EXISTS :

Elle permet de s’assurer qu’aucune ligne ne figure dans la table avec une valeur de clé identique.

IV.  Appel des procédures stockées

Les procédures stockées sont exécutées à l’aide de l’instruction EXECUTE ou EXEC. Il est nécessaire de respecter quelques principes de base lors du passage ou la réception de valeurs en arguments de procédure.

Les paramètres peuvent être passés selon deux façons : 

  • Par position : ce procédé est conforme aux standards SQL.

Par référence nommée : ce procédé est réservé aux technologies Microsoft.

Passage des paramètres par position

Récupération de la valeur retournée par la procédure

La valeur de retour est récupérée dans une variable @RetValue qui doit être insérée entre l’instruction EXECUTE et le nom de la procédure stockée. Au sein de la procédure stockée, un message est imprimé si la demande de suppression concerne un client qui a passé des commandes.

Exemple avec des paramètres en sortie

Dans cet exemple, nous avons 4 paramètres : 2 en entrée, 2 en sortie dont celui correspondant à la valeur retournée.

Les différents paramètres doivent être séparés par des virgules et le mot clé OUTPUT associé à la variable qui recevra la valeur du paramètre en sortie.

tilisation de paramètres en sortie

Passage des paramètres par référence nommée

Cette approche, qui n’est pas conforme à la norme SQL mais présente dans l’ensemble de l’architecture des produits Microsoft, permet de ne pas se soucier de l’ordre de déclaration des paramètres.

Elle offre aussi l’avantage de ne pas avoir à se soucier des paramètres optionnels qui, sans valeur mentionnée, prendront la valeur par défaut définie dans la procédure.

Procédure avec de nombreux paramètres optionnels

Passage par référence nommée des paramètre

V. Atelier pratique

  1. Exécuter les exemples précédents
  2. Dans la base de données “Gestion des comptes bancaires:

Soit le schéma de la base de données qui décrit les mouvements des comptes de clients d'une banque :

Client (Num_client, Nom_client, Prenom_Client)

Compte (Num_Compte, Solde, #Num_Client,typeC)

Mouvement (Num_Mouvement, montant, TypeM, #Num_Compte, DateM)

La table Mouvement archive les mouvements effectués sur chaque compte on retiendra le montant et la date du mouvement, le type peut être un retrait signalisé par (R) ou un dépôt signalisé par (D).

  1. Ecrire la procédure stockée Retrait qui accepte en argument le numéro du compte, le montant à retirer puis ajoute la ligne correspondante dans la table mouvement. 

            La procédure doit effectuer le traitement suivant :

    • Le Numéro du Mouvement doit s'incrémenter automatiquement.

                            (Ne pas utiliser la propriété Identity).

    • Vérifier l'existence du compte et renvoyer le message d'erreur s'il n'existe pas.
    • La date du mouvement est égale à la date système.
    • Vérifier que l'argent est disponible sur le compte.
  1. Ecrire la procédure stockée Dépôt qui accepte en argument le numéro du compte, le montant à déposer puis ajoute la ligne correspondante dans la table mouvement. 

            La procédure doit effectuer le traitement suivant :

    • Le Numéro du Mouvement doit s'incrémenter automatiquement.                     (Ne pas utiliser la propriété Identity).
    • Vérifier l'existence du compte et renvoyer le message d'erreur s'il n'existe pas.
    • La date du mouvement est égale à la date système.
  1. Ecrire une procédure stockée qui renvoie en sortie le nombre de dépôts et de retraits par client dont le numéro de compte est transmis en argument.
  2. Ecrire une procédure stockée qui permet d'octroyer à tous les comptes de type (épargne) une augmentation du solde de 6%, à tous les comptes de type (âge d'or) une augmentation du solde de 7%, à tous les comptes de type (éducation) une augmentation du solde de 8%.
  3. Définir une procédure qui liste les mouvements effectués sur un compte entre deux dates.

Ajouter un commentaire

Veuillez vous connecter pour ajouter un commentaire.

Pas encore de commentaires.