Getsuyodev, Programming is mainly used when constructing an application. Programming requires knowledge of application domains, algorithms, and programming language expertise. Programming can be developed in different logic based on developer knowledge.

SGBD – Elements de programmation

Système de gestion de base de données



Introduction:

Ce support a pour but de vous initier à la programmation des serveurs de bases de données relationnelles. Le système cible retenu est SQL Server et le langage de programmation Transact-SQL.

Dans un premier temps, nous allons observer les principes de la programmation procédurale sous SQL Server et nous initier à la création de scripts avec le langage procédural T-SQL.

La programmation des transactions au sein de programmes compilés et stockés sur le serveur SGBDR apporte de la rigueur à vos développements et facilite la maintenance à venir de vos applicatifs.

Les programmes qui manipulent les données du SGBD ne doivent pas faire appel directement à des transactions mais utiliser des procédures auxquelles seront passés des arguments en paramètre.

La programmation des transactions au sein de programmes compilés et stockés sur le serveur SGBDR apporte de la rigueur à vos développements et facilite la maintenance à venir de vos applicatifs.

Il faudra donc à tout prix éviter de coder « en dur » au sein des programmes utilisateur les instructions relatives à la manipulation des données. Cette contrainte illustre l’approche de la programmation par couche qui permet de structurer son code en fonction de la nature des opérations (Affichage, Accès données, Maintenance Données, …)

Le recours à la programmation de ces transactions dans des procédures stockées permet :

  • D’assurer une répartition correcte des traitements côté client et serveur
  • De centraliser le code relatif à la manipulation des données et donc de rendre plus aisée la maintenance
  • De faciliter la réutilisation de code

Eléments de programmation

Les commentaires :

Il est possible d’insérer dans son code des commentaires :

Pour commenter une ligne, il suffira de faire précéder le commentaire de deux tirets –
Pour commenter un bloc, de le délimiter par /* et */

Règles de dénomination des objets:

Tous les noms d’objets (table, colonne, variable, etc.) doivent respecter les règles suivantes :

  • Le nombre de caractères maximum est de 128.
  • Les caractères qui composent le nom seront de préférence non accentués.
  • Il sera aussi préférable d’éviter les caractères spéciaux qui peuvent par ailleurs avoir une utilisation réservée par le langage.
  • Les noms doivent commencer par une lettre et ne doivent pas comporter d’espace. Si le nom ne respecte pas ces 2 dernières règles, vous devrez alors le délimiter par des crochets [].

Il n’est pas nécessaire de respecter la casse des caractères mais par convention seuls les mots clefs du langage seront en majuscules.

Les variables : Types numériques

INT entier (et ses dérivés SMALLINT, TINYINT, BIGINT)

DECIMAL(11,2) montant à 11 chiffres (décimaux) dont 2 après la virgule.

Il convient de définir la précision (nombre maximal de chiffres) et l’échelle (nombre de chiffres à droite de la virgule). La taille occupée en mémoire dépendra de l’échelle.

REAL réel flottant codé sur 4 octets  et FLOAT (double précision) sur 8 octets.

Les variables : Types caractères

CHAR(50) : chaîne de caractères de longueur fixe quelle que soit la valeur

VARCHAR(25) : chaîne de caractères de longueur variable ne pouvant contenir plus de 25 caractères.

NCHAR et NVARCHAR sont de même nature que les précédents mais la définition du caractère est en Unicode et stockée sur 2 octets. Ce type est particulièrement intéressant si vous devez stocker des valeurs de données exprimées en plusieurs langues, comme c’est souvent le cas dans les applications multilingues.

La longueur d’une chaîne, exprimée selon ces types, ne peut excéder 8000 caractères. Pour des valeurs excédant cette taille, il vous faut utiliser les types prévus pour stocker des BLOBs (Binary Large OBject).

Ces types sont définis comme :

TEXT ou NTEXT : Permet de stocker une chaîne au format ASCII ou Unicode.

IMAGE : Permet de stocker un flux d’octets.

Cette approche permet de stocker des valeurs qui excédent 2 milliards d’octets. En fait, la valeur réelle stockée au niveau de la table est un pointeur de référence de l’objet stocké sur disque.

Les variables : Types divers

MONEY : décimal avec symbole monétaire. Il est préférable de ne pas avoir recours à ce type et stocker la valeur de la devise dans une colonne spécifique.

BIT : Booléen.

DATETIME, SMALLDATETIME : date et heure.

  • DATETIME s’emploie pour les données comprises entre le 1er janvier 1753 et le 31 décembre 9999 (chaque valeur est stockée dans 8 octets).
  • L’autre type, SMALLDATETIME, s’applique aux dates comprises entre le 1er janvier 1900 et le 6 juin 2079 (chaque valeur est stockée dans 4 octets). Des fonctions spécifiques permettent de manipuler ces types.

TIMESTAMP : Ce type de données présente des nombres binaires automatiquement générés, et dont l’unicité est garantie dans une base de données. TIMESTAMP  est généralement utilisé en tant que mécanisme d’affectation d’un numéro de version aux lignes des tables. La taille de stockage est de 8 octets. La valeur d’une colonne de ce type varie à chaque opération de modification de la ligne. Une seule colonne par table peut être définie de ce type. Nous verrons par la suite comment utiliser ce type de données.

XML : depuis SQL Server 2005, il est possible de stocker des fragments XML dans un type spécifique. Le type de données XML est un type de données intégré de SQL Server, quelque peu similaire aux autres types intégrés, tels que INT et VARCHAR.

À l’image des autres types intégrés, vous pouvez utiliser le type de données XML comme type de colonne lorsque vous créez une table en tant que type de variable, de paramètre, de retour de fonction ou dans CAST et CONVERT.

Les variables : Types dérivés

Il est possible de dériver des types SQL Server afin de créer ses propres types, désignés sous le vocable de Types de données utilisateur.

Cette approche permet de rendre plus explicite les définitions des données et de leur associer des règles qui devront être vérifiées systématiquement lors d’une demande de stockage d’une valeur dans la colonne.

Pour créer un type dérivé, il faut recourir à l’exécution de la procédure stockée sp_addtype.

Déclaration et affectation d’une variable :

Une variable se déclare à l’aide du mot clé DECLARE.

Par convention, le nom de la variable locale à la procédure ou au script est préfixé par un @.

Il existe aussi des variables dites globales qui représente des valeurs du système. Elles sont alors préfixées de @@.

L’opérateur SET permet d’affecter une valeur à une variable.

On peut aussi affecter une valeur à une variable par le biais de l’exécution d’une requête de sélection. Il convient de s’assurer que la requête ne renvoie alors qu’une seule ligne afin d’obtenir une valeur scalaire.

L’opérateur PRINT permet d’imprimer le contenu d’une variable. A utiliser lors des phases de tests…

L’exemple présenté page suivante montre les principes d’affectation selon les deux procédés et met en œuvre des opérations de conversion de type:

Structures conditionnelles et itératives:

Vous retrouvez dans le langage Transact-SQL les structures les plus usuelles d’un langage de programmation qui vous permettront de programmer l’exécution conditionnelle d’instructions ou la répétition de l’exécution de blocs d’instructions.

Expression de blocs conditionnels:
 
 IF expression conditionnelle
   Instruction ou Bloc d’instructions
 ELSE  facultatif
   Instruction ou Bloc d’instructions 

L’exemple ci-dessous met en œuvre des instructions conditionnées dans le cadre d’une procédure stockée dont le rôle est de supprimer un client référencé dans la base de données:

Il est possible d’avoir recours à la structure CASE qui permet l’évaluation successive de différentes conditions au sein d’un même groupe.

La fonction CASE peut être mise en œuvre de deux manières : La fonction CASE détermine le résultat en comparant une expression à un jeu d’expressions simples ; ü La fonction CASE détermine le résultat en évaluant un jeu d’expressions booléennes.

Les deux formes prennent en charge un argument ELSE facultatif.

A noter :

lorsque vous recourez à cette structure pour réaliser des mises à jour conditionnelles, il faut prendre garde le fait que la colonne devant être modifiée vaudra Null si vous ne lui affectez aucune valeur et ne conservera donc pas sa valeur initiale. D’où la programmation de l’instruction ELSE qui sera exécutée dans le cas où aucune condition n’a été vérifiée dans l’expression des différents cas.

Expression de blocs itératifs conditionnels:
 
 Il n’existe qu’une seule structure qui permette de spécifier des boucles d’instructions, la structure WHILE. 

 
 WHILE expression de la condition
 Instruction ou bloc d’instructions 

L’exemple suivant illustre la mise en place d’une itération similaire à une boucle FOR: Vous pouvez éventuellement conditionner l’arrêt ou la poursuite d’un traitement en fonction d’une condition incluse dans la boucle.

IF Expression de la condition
   BREAK
 ELSE
   CONTINUE
 END 

Rappels sur les fonctions intégrées:

Fonctions de conversion:

Certaines conversions ne peuvent être automatiquement réalisées par le système. Nous devons alors réaliser ces conversions de manière explicite au moyen des fonctions de conversion CAST et CONVERT.

Attention aux types d’origine et résultant de la conversion : toutes les combinaisons ne sont pas admises.

CONVERT permet de définir un style pour la donnée convertie alors que CAST ne le permet pas.

Je souhaite que le CA net soit converti et présenté dans un décimal de 10 de long avec 3 chiffres derrière la virgule.

Fonctions de traitement des chaines:

Fonctions de manipulation des dates:

Rappels sur les opérateurs:

Un opérateur est un symbole spécifiant une action exécutée sur une ou plusieurs expressions. Nous trouvons en SQL, différentes catégories d’opérateurs.

  • Opérateurs arithmétiques
  • Opérateurs de comparaison
  • Opérateurs logiques
  • Opérateur de traitement de chaînes

Les opérateurs arithmétiques:

Remarques : Attention à la priorité des opérateurs : le plus simple pour éviter les problèmes de mise au point est de réaliser les opérations entre parenthèses : les opérations internes (à l’intérieur des parenthèses) sont évaluées en premier.

Les opérateurs de comparaison:

Les opérateurs de comparaison testent si deux expressions sont identiques.

Ils peuvent s’utiliser sur toutes les expressions composées de données structurées, donc à l’exception des expressions de type de données text, ntext ou image.

Nous reviendrons sur ces types particuliers ultérieurement.

Les opérateurs logiques:

Les opérateurs logiques testent la valeur logique d’une condition.

Les opérateurs logiques, comme les opérateurs de comparaison, retournent un type de données booléen de valeur TRUE ou FALSE.

A quoi sert le N devant une chaîne de caractère :

Pourquoi Management Studio s’obstine à mettre un N devant les chaînes de caractère quand on lui demande de générer un script?

Pour le comprendre, essayez le script suivant :

 CREATE TABLE Test_Collate
 (
     Id INT,
     ch1 VARCHAR) COLLATE Latin1_General_CI_AS,
     ch2 VARCHAR(50) COLLATE Greek_CI_AS,
     ch3 VARCHAR(50) COLLATE Cyrillic_General_CI_AS
 )
 GO 
-- Sans le N
 INSERT INTO Test_Collate
 VALUES(1, 'Français', 'ΔΖΗΘΛπςσφ', 'ЪЫЬЮЯав')
 GO
 
 -- Avec le N
 INSERT INTO Test_Collate
 VALUES(2, N'Français', N'ΔΖΗΘΛπςσφ', N'ЪЫЬЮЯав')
 GO 
 
 
 SELECT * FROM Test_Collate
 GO
 
 Le résultat du dernier SELECT est ici :
 
 1      Français        ???T?p?sf            ???????
 2      Français        ΔΖΗΘΛπςσφ       ЪЫЬЮЯав 

Que faut-il en conclure ?

Et bien que le moteur de base de données traite la chaîne comme étant non Unicode sans le N, et comme étant Unicode avec le N.

A quoi sert le GO :

GO n’est pas une commande SQL. C’est une commande de l’interpréteur qu’est SSMS ou SQLcmd.

Cette commande permet de forcer l’envoi du lot de commande SQL et d’attendre le retour du serveur avant de poursuivre.

Elle est indispensable dans certains cas de figure, car le serveur ne peut pas toujours comprendre ce que l’on veut faire d’un point de vue analyse syntaxique ou objet.

Car le création de la vue se fait sur un objet qui n’existe pas à l’interprétation.

Avec GO tout va bien :

Notez que GO doit toujours être sur une ligne séparée car c’est ligne à ligne qu’agit l’interpréteur de commande.


Comments are closed, but trackbacks and pingbacks are open.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More