Tout comme les procédures et fonctions des langages de programmation comme C#, PHP, Java, etc., les procédures et fonctions stockées MySQL peuvent recevoir des paramètres afin de transférer des valeurs entre le programme appelant et la procédure ou fonction.
Les paramètres des procédures stockées peuvent avoir différents rôles précisés par les mots-clés suivants :
Ex : La procédure copie_table recevra le nom de la table à copier.
CREATE PROCEDURE copie_table(IN table VARCHAR(25))
BEGIN
-- (entête standard)
...
END!!
Ex : La procédure nombre_rendezvous initialisera le nombre de rendez-vous.
CREATE PROCEDURE nombre_rendezvous (OUT nombre INTEGER)
BEGIN
-- (entête standard)
...
END!!
Ex : La procédure indicatif_regional recevra un numéro de téléphone en paramètre et changera sa valeur
en lui ajoutant l'indicatif régional.
CREATE PROCEDURE indicatif_regional (INOUT tel VARCHAR(10))
BEGIN
-- (entête standard)
...
END!!
Pour les fonctions, il ne faut pas mettre les mots-clés IN, OUT ni INOUT. Les paramètres des fonctions stockées sont toujours considérés comme IN.
Ex :
CREATE FUNCTION total_dernier_rendezvous(mecanicien_id INT) RETURNS DOUBLE
READS SQL DATA
BEGIN
-- (entête standard)
...
RETURN total;
END!!
Lorsqu'on a besoin de plus d'un paramètre, il faut prendre le soin de répéter le type pour chacun des paramètres, que les types soient identiques ou non. Dans le cas d'une procédure stockée, il faut également répéter le mot-clé IN, OUT ou INOUT.
Ex :
CREATE PROCEDURE test(IN valeur1 INT, IN valeur2 INT)
BEGIN
-- (entête standard)
...
END!!
CREATE FUNCTION autre_test(valeur1 INT, valeur2 INT) RETURNS INT
READS SQL DATA
BEGIN
-- (entête standard)
...
RETURN ...;
END!!
Lorsqu'un paramètre réfère à un champ, vous risquez de rencontrer un conflit de nom. Par exemple, si on reçoit en paramètre le code d'un usager (code), la requête qui doit retrouver ce code devra utiliser le nom de champ code. Et si la procédure reçoit une date en paramètre, il y aura fort à parier qu'elle aura à travailler avec le champ date.
Comment alors différencier le paramètre du champ ?
Dès qu'il y a possibilité de conflit de nom, on fera précéder le nom du paramètre par p_.
Ex :
CREATE PROCEDURE nombre_rendezvous (IN p_date DATETIME, OUT nombre INT)
BEGIN
-- (entête standard)
...
SELECT COUNT(*) INTO nombre FROM rendezvous WHERE date=p_date;
...
END!!
Notez que dans d'autres langages procéduraux, comme par exemple en T-SQL (sous MS-SQL), les variables et les paramètres doivent être précédés d'un caractère spécial, soit le @. Pour ces langages, il n'y a donc jamais lieu de précéder le nom des paramètres par p_ pour les différencier des champs qui eux, ne sont pas précédés par ce caractère spécial.
▼Publicité