J'ai une procédure stockée dans laquelle j'essaie de boucler un certain nombre d'ID dans une table et les insérer dans une autre table ... problème est l'ID s'avère comme NULL dans la boucle. Pour la mise au point j'ai créé une table appelée test
, elle a deux colonnes nommées var_name
et value
. J'ai aussi fait une procédure stockée comme ceci:MySQL SELECT renvoie NULL pour la colonne NOT NULL dans la procédure stockée
CREATE DEFINER=`root`@`localhost` PROCEDURE `myProcedure`(@parent INT(11))
BEGIN
INSERT INTO `test`
(`var_name`, `value`)
VALUES
('parent', @parent);
INSERT INTO test (`var_name`, `value`)
SELECT 'id', `id`
FROM `mytable`
WHERE `parent` = @parent;
END
Le tableau mytable
a beaucoup de colonnes, mais id
est la clé primaire et évidemment NOT NULL, NULL permet parent
. Les colonnes id
, parent
et value
sont toutes INT (11).
La déclaration suivante:
CALL myProcedure(1);
le résultat suivant dans test
:
+----------+-------+
| var_name | value |
+----------+-------+
| 'parent' | 1 |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
| 'id' | NULL |
+----------+-------+
Le nombre de lignes 'id' correspondent au nombre de lignes en mytable
avec parent
= 1, mais value
est toujours NULL. L'exécution de la requête suivante:
SELECT `id` FROM `mytable` WHERE `parent` = 1;
produit le résultat attendu:
+----+
| id |
+----+
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+----+
Qu'est-ce qui se passe ici?
Merci ... En fait, je menti quand j'ai dit que ma procédure ressemblait à ça. En réalité, j'avais inséré cette partie dans ma procédure en boucle qui déclarait certaines variables en haut ... incluant: DECLARE id INT ... Je ne me suis pas rendu compte qu'une variable pouvait éventuellement remplacer une valeur de colonne si la colonne était référencée avec des retours . Votre réponse m'a fait essayer de faire la procédure exactement comme je l'ai déclaré dans la question. Bien sûr, je savais que la réponse serait quelque chose de stupide comme ceci:/ – moggizx
Dans ce cas, je ne vois pas la nécessité d'utiliser [9.4 Variables définies par l'utilisateur] (http://dev.mysql.com/doc/refman/5.6/en /user-variables.html) ('@ parent_id'), peut être utilisé directement:' DECLARE parent_id INT DEFAULT parent; ' – wchiquito
Oui par défaut peut être utilisé comme mentionné par @wchiquito –