77 votes

Est-il possible d'avoir un paramètre par défaut pour une procédure stockée mysql ?

J'ai cherché sur Google et j'obtiens toujours des réponses du type "Non, ce n'est pas possible", mais ces messages datent de 2005-2007 et je me demande si cela a été modifié. Un exemple de code :

CREATE PROCEDURE `blah`
(
  myDefaultParam int = 0 -- This breaks the code for some reason
)
BEGIN
  -- Do something here
END

L'une des solutions a été de passer null, puis de vérifier si null et de définir la variable. Je ne veux pas faire cela et je ne devrais pas avoir à le faire. Si c'est vrai, les développeurs de MySql doivent se réveiller car il y a tellement plus de choses que je pourrais faire avec MSSQL.

1 votes

0 votes

Est-ce que mariaDB a ce même problème ?

81voto

Paul Sonier Points 25528

Ce n'est toujours pas possible.

9 votes

Existe-t-il une solution de contournement ? Par exemple, vérifier si le paramètre est nul et lui donner une valeur par défaut ?

1 votes

@papaiatis Oui, vous pouvez simplement ajouter une instruction if, voir mon autre post ci-dessous.

3 votes

Je ne sais pas pourquoi c'est la réponse acceptée alors qu'en dessous @Dive50 a une solution de contournement utile, que je suis sur le point de mettre en œuvre car je suis confronté au même problème.

53voto

Dive50 Points 416

Nous avons contourné cette limitation en ajoutant une simple instruction IF dans la procédure stockée. En pratique, nous passons une chaîne vide chaque fois que nous voulons enregistrer la valeur par défaut dans la base de données.

CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
BEGIN
  IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;

  ...your code here...
END

11 votes

Pourquoi ne pas utiliser null à la place ?

2 votes

Cela montre tout l'amour que l'on peut donner à mysql, alors qu'en sql on peut simplement mettre " param_name int(11) = NULL" ... merci Oracle

12voto

Michael Points 387

Si vous regardez dans Syntaxe de CREATE PROCEDURE pour la dernière version de MySQL, vous verrez que le paramètre de procédure ne peut contenir que le spécificateur IN/OUT/INOUT, le nom et le type du paramètre.

Ainsi, les valeurs par défaut ne sont toujours pas disponibles dans la dernière version de MySQL.

5voto

Ross Smith II Points 4839

Malheureusement, MySQL ne supporte pas DEFAULT les valeurs des paramètres, donc :

CREATE PROCEDURE `blah`
(
  myDefaultParam int DEFAULT 0
)
BEGIN
  -- Do something here
END

renvoie l'erreur :

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use 
near 'DEFAULT 0) BEGIN END' at line 3

Pour contourner cette limitation, il suffit de créer des procédures supplémentaires qui attribuent des valeurs par défaut à la procédure d'origine :

DELIMITER //

DROP PROCEDURE IF EXISTS blah//
DROP PROCEDURE IF EXISTS blah2//
DROP PROCEDURE IF EXISTS blah1//
DROP PROCEDURE IF EXISTS blah0//

CREATE PROCEDURE blah(param1 INT UNSIGNED, param2 INT UNSIGNED)
BEGIN
    SELECT param1, param2;
END;
//

CREATE PROCEDURE blah2(param1 INT UNSIGNED, param2 INT UNSIGNED)
BEGIN
    CALL blah(param1, param2);
END;
//

CREATE PROCEDURE blah1(param1 INT UNSIGNED)
BEGIN
    CALL blah2(param1, 3);
END;
//

CREATE PROCEDURE blah0()
BEGIN
    CALL blah1(4);
END;
//

Ensuite, en exécutant ceci :

CALL blah(1, 1);
CALL blah2(2, 2);
CALL blah1(3);
CALL blah0();

reviendra :

+--------+--------+
| param1 | param2 |
+--------+--------+
|      1 |      1 |
+--------+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

+--------+--------+
| param1 | param2 |
+--------+--------+
|      2 |      2 |
+--------+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

+--------+--------+
| param1 | param2 |
+--------+--------+
|      3 |      3 |
+--------+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

+--------+--------+
| param1 | param2 |
+--------+--------+
|      4 |      3 |
+--------+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Ensuite, si vous vous assurez de n'utiliser que l'option blah2() , blah1() y blah0() votre code ne devra pas être immédiatement mis à jour, lorsque vous ajoutez un troisième paramètre à la procédure blah() procédure.

1voto

Bill Karwin Points 204877

Non, ceci n'est pas supporté dans la syntaxe des routines stockées de MySQL.

N'hésitez pas à soumettre une demande de fonctionnalité à bugs.mysql.com .

2 votes

Je poste ceci à partir de l'autre question que j'ai posée : bugs.mysql.com/bug.php?id=15975

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X