Partie II
Programmation procédurale
214
© Éditions Eyrolles
Comme la plupart des langages récents, les déclarations multiples sont permises. Celle qui suit
est juste :
DECLARE
INT;
Résolution de noms
Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (principalement INSERT, UPDATE, DELETE et SELECT), le nom de la variable est prioritairement
interprété au détriment de la colonne de la table (de même nom).
Dans l’exemple suivant, l’instruction DELETE supprime tous les pilotes de la table (et non pas
seulement le pilote de nom 'Placide Fresnais'), car MySQL considère les deux identificateurs
comme étant la même variable, et non pas comme colonne de la table et variable.
DECLARE nom VARCHAR(16) DEFAULT 'Placide Fresnais';
DELETE FROM Pilote WHERE
;
Pour se prémunir de tels effets de bord, une seule solution existe : elle consiste à nommer
toutes les variables différemment des colonnes (en utilisant un préfixe, par exemple). Une
autre solution serait d’utiliser une étiquette de bloc (block label) pour lever d’éventuelles
ambiguïtés. Bien qu’il soit possible d’employer des étiquettes de blocs (aussi disponibles pour
les structures de contrôle), on ne peut pas encore préfixer des variables pour en distinguer une
de même nom entre différents blocs.
Opérateurs
Les opérateurs SQL étudiés au chapitre 4 (logiques, arithmétiques, de concaténation…) sont
disponibles au sein d’un sous-programme. Les règles de priorité sont les mêmes que dans le
cas de SQL.
L’opérateur IS NULL permet de tester une formule avec la valeur NULL. Toute expression
arithmétique contenant une valeur nulle est évaluée à NULL.
Le tableau suivant illustre quelques utilisations possibles d’opérateurs logiques :
i, j, k
nom = nom
Tableau 6-5 Éviter les ambiguïtés
Préfixer les variables
Étiquette de bloc (préfixe pas opérationnel)
DECLARE v_nom VARCHAR(16)
DEFAULT 'Placide Fresnais';
…
DELETE FROM Pilote WHERE
;
--ou
DELETE FROM Pilote WHERE
;
DECLARE nom VARCHAR(16)
DEFAULT 'Placide Fresnais';
DELETE FROM Pilote
WHERE principal.nom = nom;
;
nom = v_nom
v_nom = nom
principal: BEGIN
END principal
Programmation procédurale
214
© Éditions Eyrolles
Comme la plupart des langages récents, les déclarations multiples sont permises. Celle qui suit
est juste :
DECLARE
INT;
Résolution de noms
Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (principalement INSERT, UPDATE, DELETE et SELECT), le nom de la variable est prioritairement
interprété au détriment de la colonne de la table (de même nom).
Dans l’exemple suivant, l’instruction DELETE supprime tous les pilotes de la table (et non pas
seulement le pilote de nom 'Placide Fresnais'), car MySQL considère les deux identificateurs
comme étant la même variable, et non pas comme colonne de la table et variable.
DECLARE nom VARCHAR(16) DEFAULT 'Placide Fresnais';
DELETE FROM Pilote WHERE
;
Pour se prémunir de tels effets de bord, une seule solution existe : elle consiste à nommer
toutes les variables différemment des colonnes (en utilisant un préfixe, par exemple). Une
autre solution serait d’utiliser une étiquette de bloc (block label) pour lever d’éventuelles
ambiguïtés. Bien qu’il soit possible d’employer des étiquettes de blocs (aussi disponibles pour
les structures de contrôle), on ne peut pas encore préfixer des variables pour en distinguer une
de même nom entre différents blocs.
Opérateurs
Les opérateurs SQL étudiés au chapitre 4 (logiques, arithmétiques, de concaténation…) sont
disponibles au sein d’un sous-programme. Les règles de priorité sont les mêmes que dans le
cas de SQL.
L’opérateur IS NULL permet de tester une formule avec la valeur NULL. Toute expression
arithmétique contenant une valeur nulle est évaluée à NULL.
Le tableau suivant illustre quelques utilisations possibles d’opérateurs logiques :
i, j, k
nom = nom
Tableau 6-5 Éviter les ambiguïtés
Préfixer les variables
Étiquette de bloc (préfixe pas opérationnel)
DECLARE v_nom VARCHAR(16)
DEFAULT 'Placide Fresnais';
…
DELETE FROM Pilote WHERE
;
--ou
DELETE FROM Pilote WHERE
;
DECLARE nom VARCHAR(16)
DEFAULT 'Placide Fresnais';
DELETE FROM Pilote
WHERE principal.nom = nom;
;
nom = v_nom
v_nom = nom
principal: BEGIN
END principal
