Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Procedimiento Almacenado no retorna lo que debería

Estas en el tema de Procedimiento Almacenado no retorna lo que debería en el foro de Mysql en Foros del Web. Hola a todos, Tengo un problema con un procedimiento almacenado y juro que no puedo dar con la solución a pesar de que para mí ...
  #1 (permalink)  
Antiguo 29/09/2014, 09:13
 
Fecha de Ingreso: abril-2009
Mensajes: 196
Antigüedad: 15 años, 6 meses
Puntos: 0
Pregunta Procedimiento Almacenado no retorna lo que debería

Hola a todos,

Tengo un problema con un procedimiento almacenado y juro que no puedo dar con la solución a pesar de que para mí está bien el programa...
El SP busca en una tabla de categorías, los padres de una categoría específica... por lo tanto debe iterar buscando el padre y el padre de ese padre hasta que el padre de el nodo raíz sea 0. Yo voy concatenando los códigos de los padres y finalmente lanzo la consulta SELECT filtrando por los códigos concatenados... el resultado es una sola fila cuando deberían ser 2. Si lanzo la consulta de solo el string concatenado tiene los valores correctos, pero la consulta final no me devuelve lo que es... y si la lanzo aparte (el SELECT con los valores concatenados), el resultado es como lo esperaría.

Este es el SP:

Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS getCategoryParents;
  2. DELIMITER $$
  3.  
  4. CREATE PROCEDURE `getCategoryParents`(CodigoIn INT)
  5.         DECLARE entrar Bool;
  6.         DECLARE padreTmp int;
  7.         DECLARE codigos Varchar(100);
  8.         DECLARE primera Bool;
  9.         SET primera = true;
  10.         SET entrar = true;
  11.         SET codigos ='';
  12.         WHILE entrar DO
  13.             IF ((SELECT padre FROM categoria WHERE codigo = CodigoIn) = 0) THEN                
  14.                 SET entrar = false;  
  15.                
  16.                 SET codigos = CONCAT(codigos, ' , ' ,  CodigoIn);
  17.                
  18.                 SELECT * FROM Categoria WHERE Codigo IN (codigos);
  19.             else
  20.                 IF primera THEN                    
  21.                    
  22.                     SET primera = false;
  23.                 else  
  24.                     IF codigos = '' THEN
  25.                          SET codigos = CodigoIn;
  26.                          else
  27.                             SET codigos = CONCAT(codigos, ' , ' ,  CodigoIn);                    
  28.                         end IF;
  29.                 end IF;
  30.                 SET CodigoIn = (SELECT padre FROM categoria WHERE codigo = CodigoIn);                
  31.             end IF;
  32.         end WHILE;
  33.     end


Estas son las categorías para que se hagan una idea:

1 Mercado 0
9 Aseo 1
10 Aseo Personal 9

Llamando al procedimiento así: CALL getCategoryParents(10)

Me devuelve: 9 Aseo 1

Solo una fila! debería devolverme el código 9 y el 1.

Si imprimo lo que contiene 'Codigos' antes del select final, me da: 9 , 1

Y si lanzo la consulta aparte... así: SELECT * FROM Categoria WHERE Codigo IN ( 9 , 1 );

me devuelve:
1 Mercado 0
9 Aseo 1

Que es lo que SI esperaría ....

Alguien tiene idea del porque?
Gracias!

Última edición por gnzsoloyo; 29/09/2014 a las 09:23

Etiquetas: almacenado, procedimiento, retorna, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:25.