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

[SOLUCIONADO] Bucle infinito

Estas en el tema de Bucle infinito en el foro de Mysql en Foros del Web. Hola estimados, desde hace unos días me encuentro con un problema en el trabajo, resulta que construí un procedimiento para realizar una consulta de resultados ...
  #1 (permalink)  
Antiguo 29/12/2014, 09:05
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Pregunta Bucle infinito

Hola estimados, desde hace unos días me encuentro con un problema en el trabajo, resulta que construí un procedimiento para realizar una consulta de resultados por meses, la cual he cambiado millones de veces para encontrar la solución, resulta que este SP realiza correctamente todo el proceso que conlleva, pero una vez llega al while queda iterando de manera infinita un UPDATE que le estoy pasando, dejo el código de ejemplo para que me puedan ayudar, se los agradecería mucho. Saludos.

Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS db_dtv.SALIDA_MES;
  2. CREATE PROCEDURE db_dtv.`SALIDA_MES`()
  3.  
  4. DECLARE valormax int;
  5. DECLARE valormin int;
  6. DECLARE cont int;
  7.  
  8.  
  9. DROP TABLE IF EXISTS estructura;
  10. CREATE TABLE estructura
  11. SELECT 'ID','MES','DIRECCION','AREA','RESPONSABLE','SUB_CATEGORIA','ENERO','FEBRERO','MARZO','ABRIL','MAYO','JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OCTUBRE',
  12. 'NOVIEMBRE','DICIEMBRE';
  13.  
  14. TRUNCATE estructura;
  15.  
  16. INSERT INTO estructura(MES,DIRECCION,AREA,RESPONSABLE,SUB_CATEGORIA)
  17. SELECT MONTH(a.fecha_real),b.Direccion,b.Area,b.responsable,a.SUBCATEGORIA_SECUNDARIA
  18. FROM almacen_contacto_paso a, tmp_contacto_resp b
  19. WHERE a.cod_subcategoria_secundaria= b.`Cod Contacto`
  20. AND a.cod_categoria=855
  21. GROUP BY a.SUBCATEGORIA_SECUNDARIA,MONTH(a.fecha_real),b.Responsable,b.Area
  22. ORDER BY b.area,a.subcategoria_secundaria,MONTH(a.fecha_real) asc;
  23.  
  24. SELECT 'id_num','MES';
  25.  
  26. SET valormax=12;
  27. SET c =1;
  28. SET valormin = 1;
  29.  
  30.  
  31.  WHILE valormin <= valormax DO
  32.  
  33.       TRUNCATE num;
  34.  
  35.       INSERT INTO num(MES)
  36.       SELECT COUNT(a.CONTACTO_IBS)
  37.       FROM almacen_contacto_paso a, tmp_contacto_resp b
  38.       WHERE a.cod_subcategoria_secundaria= b.`Cod Contacto`
  39.       AND a.cod_categoria=855
  40.       AND a.ID_IDENTIFICADOR = valormin
  41.       GROUP BY  a.SUBCATEGORIA_SECUNDARIA,MONTH(a.fecha_real),b.Responsable,b.Area
  42.       ORDER BY b.area,a.subcategoria_secundaria,MONTH(a.fecha_real) asc;
  43.  
  44.     IF(valormin = 1) THEN
  45.              
  46.       UPDATE estructura e, num n
  47.       SET e.ENERO = n.MES
  48.       WHERE e.ID = n.id_num;
  49.  
  50.      
  51.       ELSEIF(valormin = 2) THEN
  52.    
  53.      
  54.       ELSEIF(valormin = 3) THEN
  55.       UPDATE estructura e, num n
  56.       SET e.FEBRERO = n.MES
  57.       WHERE e.ID = n.id_num;
  58.      
  59.          
  60.      
  61.      ELSEIF(valormin = 4) THEN
  62.  
  63.       UPDATE estructura e, num n
  64.       SET e.MARZO = n.MES
  65.       WHERE e.ID = n.id_num;
  66.        
  67.      
  68.      ELSEIF(valormin = 5) THEN
  69.       UPDATE estructura e, num n
  70.       SET e.MAYO = n.MES
  71.       WHERE e.ID = n.id_num;
  72.        
  73.    
  74.      ELSEIF(valormin = 6) THEN
  75.  
  76.       UPDATE estructura e, num n
  77.       SET e.JUNIO = n.MES
  78.       WHERE e.ID = n.id_num;
  79.      
  80.      
  81.      ELSEIF (valormin = 7) THEN
  82.  
  83.       UPDATE estructura e, num n
  84.       SET e.JULIO = n.MES
  85.       WHERE e.ID = n.id_num;  
  86.        
  87.      
  88.      ELSEIF (valormin = 8) THEN        
  89.      
  90.       UPDATE estructura e, num n
  91.       SET e.AGOSTO = n.MES
  92.       WHERE e.ID = n.id_num;
  93.        
  94.      
  95.      ELSEIF(valormin = 9) THEN
  96.  
  97.       UPDATE estructura e, num n
  98.       SET e.SEPTIEMBRE = n.MES
  99.       WHERE e.ID = n.id_num;
  100.          
  101.      
  102.      ELSEIF(valormin = 10) THEN
  103.  
  104.       UPDATE estructura e, num n
  105.       SET e.OCTUBRE = n.MES
  106.       WHERE e.ID = n.id_num;
  107.          
  108.      
  109.      ELSEIF(valormin = 11) THEN
  110.       UPDATE estructura e, num n
  111.       SET e.NOVIEMBRE = n.MES
  112.       WHERE e.ID = n.id_num;
  113.        
  114.      
  115.      ELSEIF(valormin = 12) THEN
  116.  
  117.       UPDATE estructura e, num n
  118.       SET e.DICIEMBRE = n.MES
  119.       WHERE e.ID = n.id_num;  
  120.      
  121.      
  122.     END IF;
  123.    
  124.  
  125.  
  126. SET valorminimo = valorminimo +1;  
  127. END WHILE;    
  128.        
  129. select * from estructura;
  130. select * from num;
  131.  
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #2 (permalink)  
Antiguo 30/12/2014, 17:48
 
Fecha de Ingreso: junio-2013
Mensajes: 7
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Bucle infinito

Qué tal David:

Declaraste una variable con el nombre: valormin, sin embargo, al final de bucle, haces referencia a una variable de nombre: valorminimo.

Saludos.
  #3 (permalink)  
Antiguo 30/12/2014, 18:22
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Bucle infinito

Estimado, revise mi código y solo fue un error al traspasar, ahora el problema fue solucionado, no podría determinar la forma de la solución. Pero lo que si aun sucede es que es procedimiento se demora una enormidad para mostrar el resultado.
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #4 (permalink)  
Antiguo 30/12/2014, 18:23
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Bucle infinito

Cita:
Iniciado por Luis_CPP Ver Mensaje
Qué tal David:

Declaraste una variable con el nombre: valormin, sin embargo, al final de bucle, haces referencia a una variable de nombre: valorminimo.

Saludos.
Estimado, revise mi código y solo fue un error al traspasar, ahora el problema fue solucionado, no podría determinar la forma de la solución. Pero lo que si aun sucede es que el procedimiento se demora una enormidad para mostrar el resultado
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #5 (permalink)  
Antiguo 30/12/2014, 18:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle infinito

Yo probaría con otra forma...
Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS db_dtv.SALIDA_MES;
  2. delimiter $$
  3. CREATE PROCEDURE db_dtv.`SALIDA_MES`()
  4.  
  5. MES int unsigned ,DIRECCION VARCHAR(1000),
  6. `AREA` VARCHAR(1000),
  7. RESPONSABLE VARCHAR(1000),
  8. SUB_CATEGORIA INT UNSIGNED,
  9. ENERO INT UNSIGNED DEFAULT '0',
  10. FEBRERO INT UNSIGNED DEFAULT '0',
  11. MARZO INT UNSIGNED DEFAULT '0',
  12. ABRIL INT UNSIGNED DEFAULT '0',
  13. MAYO INT UNSIGNED DEFAULT '0',
  14. JUNIO INT UNSIGNED DEFAULT '0',
  15. JULIO INT UNSIGNED DEFAULT '0',
  16. AGOSTO INT UNSIGNED DEFAULT '0',
  17. SEPTIEMBRE INT UNSIGNED DEFAULT '0',
  18. OCTUBRE INT UNSIGNED DEFAULT '0',
  19. NOVIEMBRE INT UNSIGNED DEFAULT '0',
  20. DICIEMBRE INT UNSIGNED DEFAULT '0');
  21.  
  22. INSERT INTO estructura(
  23.     MES,
  24.     DIRECCION,
  25.     AREA,
  26.     RESPONSABLE,
  27.     SUB_CATEGORIA,
  28.     ENERO,
  29.     FEBRERO,
  30.     MARZO,
  31.     ABRIL,
  32.     MAYO,
  33.     JUNIO,
  34.     JULIO,
  35.     AGOSTO,
  36.     SEPTIEMBRE,
  37.     OCTUBRE,
  38.     NOVIEMBRE,
  39.     DICIEMBRE)
  40.     MONTH(a.fecha_real),
  41.     b.Direccion,
  42.     b.Area,
  43.     b.responsable,
  44.     a.SUBCATEGORIA_SECUNDARIA,
  45.     SUM(IF(MONTH(a.fecha_real) = 1, 1, 0)),
  46.     SUM(IF(MONTH(a.fecha_real) = 2, 1, 0)),
  47.     SUM(IF(MONTH(a.fecha_real) = 3, 1, 0)),
  48.     SUM(IF(MONTH(a.fecha_real) = 4, 1, 0)),
  49.     SUM(IF(MONTH(a.fecha_real) = 5, 1, 0)),
  50.     SUM(IF(MONTH(a.fecha_real) = 6, 1, 0)),
  51.     SUM(IF(MONTH(a.fecha_real) = 7, 1, 0)),
  52.     SUM(IF(MONTH(a.fecha_real) = 8, 1, 0)),
  53.     SUM(IF(MONTH(a.fecha_real) = 9, 1, 0)),
  54.     SUM(IF(MONTH(a.fecha_real) = 10, 1, 0)),
  55.     SUM(IF(MONTH(a.fecha_real) = 11, 1, 0)),
  56.     SUM(IF(MONTH(a.fecha_real) = 12, 1, 0))
  57.  
  58.     almacen_contacto_paso a INNER JOIN tmp_contacto_resp b ON  a.cod_subcategoria_secundaria= b.`Cod Contacto`
  59. WHERE a.cod_categoria=855
  60. GROUP BY a.SUBCATEGORIA_SECUNDARIA, b.Responsable, b.Area
  61. ORDER BY b.area, a.subcategoria_secundaria;
  62.  
  63. select * from estructura;
  64.  
  65. END $$
  66. delimiter ;

Lamentablemente no tengo tu tabla de datos como para hacer una prueba efectiva y eficiente...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 31/12/2014, 10:22
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Bucle infinito

Estimado, muchas gracias por su respuesta, el lunes probare como funciona de esta manera, mientras me podrías explicar los parámetros que le diste al select If. Muchas gracias.
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #7 (permalink)  
Antiguo 31/12/2014, 10:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle infinito

IF() es una función de MySQL...
Cuando hay dudas como esa, te recomiendo hacer lo mismo que hacemos los que nos dedicamos profesionalmente a las BBDD: Acudir al manual de referencia (nadie memoriza todo).

http://dev.mysql.com/doc/refman/5.7/en/functions.html
http://dev.mysql.com/doc/refman/5.7/...functions.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 31/12/2014, 12:43
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Bucle infinito

Jajajajaja, zorry por la pregunta ahora que reviso bien la query, los parámetros que vienen dentro del IF son solo los valores que devolverá en caso de valor positivo o valor negativo, vale por la ayuda gonza, ese manual lo tengo impreso y es mi biblia en el trabajo. Gracias.
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #9 (permalink)  
Antiguo 12/01/2015, 15:04
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Bucle infinito

Muchachos, zorry por la demora pero estaba metido en un mundo de cosas del trabajo, déjenme decirles que la nueva forma indicada por gnzsoloyo funciono de manera increíble, disminuyendo en 20 segundos la duración de la query, lo cual fue importantisimo, muchas gracias :D
__________________
David Carrera González
Santiago de Chile
Analista de base de datos

Etiquetas: bucle, infinito, procedimiento, sql
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 19:19.