web-dev-qa-db-fra.com

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

J'ai fait une recherche sur Google et je continue de dire "Non, ce n'est pas possible", mais ces messages étaient datés de 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 a été de passer null, puis de vérifier null et de définir la variable. Je ne veux pas faire ça et je ne devrais pas avoir à le faire. Si cela est vrai, les développeurs MySql doivent se réveiller car il y a tellement plus que je pourrais faire avec MSSQL.

63
aarona

Ce n'est toujours pas possible.

65
Paul Sonier

Nous avons contourné cette limitation en ajoutant une simple instruction IF dans la procédure stockée. Pratiquement, 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
45
Dive50
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 renvoie expression_2. La fonction IFNULL renvoie une chaîne ou un numérique en fonction du contexte dans lequel elle est utilisée.

21
SKManX

Si vous regardez dans CREATE PROCEDURE Syntax 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.

11
Michael

Malheureusement, MySQL ne prend pas en charge les valeurs des paramètres 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, exécutez ceci:

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

retournera:

+--------+--------+
| 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 d'utiliser uniquement les procédures blah2(), blah1() et blah0(), votre code n'aura pas besoin d'être mis à jour immédiatement, lorsque vous en ajouterez une troisième à la procédure blah().

4
Ross Smith II

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

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

1
Bill Karwin