2009-06-11 5 views
2

Des idées? J'ai posé la question "Is it possible to have a default parameter for a mysql stored procedure?" aujourd'hui et la réponse était très forte "non ce n'est pas possible."Comment gérez-vous le fait que les paramètres par défaut ne sont pas possibles pour les Mysql SP?

Alors ma prochaine question est de savoir comment vous, en tant que développeur php/mysql, gérez ce problème? Est-ce que vous passez null et dans le SP ont un bloc IF qui définit la variable si elle est nulle? Transmettez-vous une valeur par défaut en PHP?

Merci.

Répondre

4

Voici une solution, en utilisant COALESCE() pour définir la valeur d'une variable locale dans la procédure stockée:

DELIMITER !! 

CREATE PROCEDURE dflt (IN param1 INT) 
BEGIN 
DECLARE param1_dflt INT DEFAULT 456 
SET param1_dflt = COALESCE(param1, param1_dflt); 

SELECT param1_dflt; 
END!! 

DELIMITER ; 

CALL dflt(123); 
+-------------+ 
| param1_dflt | 
+-------------+ 
|   123 | 
+-------------+ 


CALL dflt(NULL); 
+-------------+ 
| param1_dflt | 
+-------------+ 
|   456 | 
+-------------+ 
+0

Wow! Bon appel!: D – Matt

+0

+ 1 place sur Bill, c'est de ça que je parlais – ninesided

+0

Bill, c'est un bel exemple, merci beaucoup! – DJTripleThreat

0

Cela devrait être géré par la base de données, pas par le script appelant. Si vous ne pouvez pas définir les paramètres par défaut, passez les valeurs NULL et laissez la procédure stockée effectuer les valeurs par défaut.

+0

Cest vrai que des inserts – Matt

+0

ce qui est seulement vrai des inserts? Je n'exprimais pas mon opinion ... – ninesided

1

Les paramètres facultatifs sont prévus pour MySQL 6.

Votre option la plus facile est soit d'écrire un wrapper qui ajoute les valeurs par défaut, ou créer des procédures pour chaque cas.

Je considérerais votre raisonnement pour l'utilisation des procédures stockées. Dans la grande majorité des cas, ils présentent peu d'avantages, car l'abstraction peut être effectuée dans la couche de l'application et la réduction du trafic réseau est généralement la moindre des préoccupations. Bien sûr, cela dépend de votre application.

+0

MySQL 6 ne signifie pas la même chose que par le passé; ils ont changé tous leurs futurs numéros de version. Pouvez-vous éditer votre réponse et inclure un lien pour citer où MySQL a publié un plan pour soutenir cette fonctionnalité? Je n'ai rien trouvé de similaire dans bugs.mysql.com. –

+0

Oh - c'était un vieux bug si je me souviens qui a été mis en pipeline dans une requête en vedette pour ce qui était la version 6. Je sais qu'ils travaillent encore sur les procédures stockées dans la version 6, donc ça peut sortir dans une version mineure. – Matt

+3

http://bugs.mysql.com/bug.php?id=15975 – Matt

Questions connexes