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

J’ai googlé ceci et continue à venir avec “Non ce n’est pas possible” mais ces messages étaient datés 2005-2007 donc je me demande si cela a été changé. 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 consistait à transmettre la valeur null, puis à vérifier la valeur null et à définir la variable. Je ne veux pas faire ça et je ne devrais pas le faire. Si cela est vrai, les développeurs MySQL doivent se réveiller car il y a tellement de choses que je pourrais faire avec MSSQL.

Ce n’est toujours pas possible.

Nous avons contourné cette limitation en ajoutant une instruction IF simple 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 firebase database.

 CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40)) BEGIN IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF; ...your code here... END 
 SET myParam = IFNULL(myParam, 0); 

Explication: IFNULL(expression_1, expression_2)

La fonction IFNULL renvoie expression_1 si expression_1 n’est pas NULL ; sinon, il retourne expression_2 . La fonction IFNULL renvoie une chaîne ou une valeur numérique en fonction du contexte dans lequel elle est utilisée.

Si vous regardez la syntaxe CREATE PROCEDURE pour la dernière version de MySQL, vous verrez que ce 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.

Malheureusement, MySQL ne supporte pas les valeurs de parameters DEFAULT , 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, créez simplement des procédures supplémentaires qui affectent 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 les blah2() , blah1() et blah0() , votre code n’aura pas besoin d’être immédiatement mis à jour lorsque vous ajoutez un troisième paramètre à la procédure blah() .

Non, ceci n’est pas pris en charge dans la syntaxe de la routine MySQL stockée.

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