2014-09-16 2 views
0

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?

Répondre

0

J'ai menti un peu dans la question. Ma vraie procédure stockée contenait la partie I posté au début, mais après quelques DECLARE, dont:

DECLARE id INT; 

qui a remplacé la valeur de id dans mytable ...

1

Je ne sais pas exactement quel est le problème avec la procédure donnée, mais j'ai essayé de créer un semblable à la vôtre et cela a plutôt bien fonctionné. Voici ce que je faisais

mysql> create table test (var_name varchar(100),value int); 
Query OK, 0 rows affected (0.10 sec) 

mysql> create table mytable (id int, parent int); 
Query OK, 0 rows affected (0.07 sec) 

mysql> insert into mytable values (2,1),(3,1),(4,1),(5,1),(6,1),(7,1); 
Query OK, 6 rows affected (0.02 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

ensuite ajouté la procédure suivante

delimiter // 
CREATE PROCEDURE myProcedure(parent INT(11)) 
BEGIN 
declare parent_id int ; 
set @parent_id := parent ; 

    INSERT INTO `test` 
     (`var_name`, `value`) 
    VALUES 
     ('parent', @parent_id); 

    INSERT INTO test (`var_name`, `value`) 
     SELECT 'id', `id` 
     FROM `mytable` 
     WHERE `parent` = @parent_id; 
END; // 

mysql> CALL myProcedure(1); 
Query OK, 6 rows affected (0.05 sec) 

mysql> select * from test ; 
+----------+-------+ 
| var_name | value | 
+----------+-------+ 
| parent |  1 | 
| id  |  2 | 
| id  |  3 | 
| id  |  4 | 
| id  |  5 | 
| id  |  6 | 
| id  |  7 | 
+----------+-------+ 
7 rows in set (0.00 sec) 

La seule chose que j'ai changé est utilisé dans la procédure une variable pour maintenir la valeur et de l'utiliser param dans la requête.

+0

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

+1

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

+0

Oui par défaut peut être utilisé comme mentionné par @wchiquito –

Questions connexes