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

[SOLUCIONADO] Fallo al crear procedimiento

Estas en el tema de Fallo al crear procedimiento en el foro de Bases de Datos General en Foros del Web. Hola buenas, estoy realizando una tarea en la que me piden crear una rutina que sume todos los tantos marcados por los jugadores de cada ...
  #1 (permalink)  
Antiguo 12/02/2015, 17:15
 
Fecha de Ingreso: marzo-2012
Ubicación: Menorca
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Fallo al crear procedimiento

Hola buenas, estoy realizando una tarea en la que me piden crear una rutina que sume todos los tantos marcados por los jugadores de cada clase, muestre el resultado con la suma y el nombre del grupo ordenado de mayor a menor y luego tengo que sumar 2 puntos al primer grupo y 1 punto al segundo. El código aun no esta terminado por lo que aún faltan (o sobran) cosas, pero los selects los he probado individualmente y funcionan correctamente. El problema que tengo es al crear el procedimiento, si lo dejo tal y como esta en el código me dice que falta un END en el primer select, y si lo comento, en el END final me dice que falta una sentencia IF. Alguien sabe porque pasa esto? Y ya que aún no lo he podido probar, pensáis que el cursor y el IF están bien?

Código SQL:
Ver original
  1. DELIMITER $
  2.  
  3. CREATE PROCEDURE ejercicio1 ()
  4. BEGIN
  5.  
  6.     DECLARE SUM INT;
  7.     DECLARE cla CHAR;
  8.     DECLARE punt INT;
  9.     DECLARE var1 INT DEFAULT 2;
  10.    
  11.     SELECT SUM(tantos_marcados) AS tantos, clase
  12.     FROM jugadores
  13.     GROUP BY clase
  14.     ORDER BY tantos DESC;
  15.    
  16.     DECLARE cursor1 CURSOR FOR
  17.     SELECT SUM(tantos_marcados) AS tantos, j.clase, c.puntuacion
  18.     FROM jugadores AS j INNER JOIN clases AS c ON j.clase = c.codigo
  19.     GROUP BY j.clase
  20.     ORDER BY tantos DESC
  21.     LIMIT 2;
  22.    
  23.    /* DECLARE CONTINUE HANDLER FOR NOT FOUND SET @var1 = 0; */
  24.    
  25.     OPEN cursor1;
  26.    
  27.     IF var1 = 2 THEN
  28.     SET var1 = 1;
  29.     FETCH cursor1 INTO SUM, cla, punt;
  30.     SET punt = punt + 2;
  31.     UPDATE clases SET puntuacion = punt WHERE codigo = cla;
  32.     ELSE IF var1 = 1 THEN
  33.     SET var1 = 0;
  34.     FETCH cursor1 INTO SUM, cla, punt;
  35.     SET punt = punt + 1;
  36.     UPDATE clases SET puntuacion = punt WHERE codigo = cla;
  37.     END IF;
  38.    
  39.     CLOSE cursor1;
  40.    
  41. END$
  42.  
  43. DELIMITER ;
  #2 (permalink)  
Antiguo 12/02/2015, 17:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Fallo al crear procedimiento

Hay cuestiones de orden, por ejemplo, los cursores van despues de los DECLARE de las variables y antes del HANDLER.
El HANDLER siempre va después de los cursores, y no se declara ninguna variable despues de él.
El END, tenía un error. No es lo mismo poner ELSE IF, que ELSEIF
El primero determina un IF anidado, el otro es un ELSE condicional. No es lo mismo.
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE ejercicio1 ()
  4.  
  5.     DECLARE SUM INT;
  6.     DECLARE cla CHAR;
  7.     DECLARE punt INT;
  8.     DECLARE var1 INT DEFAULT 2;
  9.    
  10.     DECLARE cursor1 CURSOR FOR
  11.     SELECT SUM(tantos_marcados) AS tantos, j.clase, c.puntuacion
  12.     FROM jugadores AS j INNER JOIN clases AS c ON j.clase = c.codigo
  13.     GROUP BY j.clase
  14.     ORDER BY tantos DESC
  15.     LIMIT 2;
  16.     /*  Un HANDLER solo tiene sentido si vas a hacer una iteración, de lo
  17.          contrario la condición no tiene uso.
  18.  
  19.          Ademas, "var" y "@var" no son la misma variable...
  20.    */    
  21.    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @var1 = 0;
  22.  
  23.     /* Esto esta de mas, porque no puede haber un SELECT sin INTO
  24.        antes de un grupo de sentencias con condicionales de flujo.
  25.  
  26.     SELECT SUM(tantos_marcados) AS tantos, clase
  27.     FROM jugadores
  28.     GROUP BY clase
  29.     ORDER BY tantos DESC;
  30.  
  31.     */
  32.     OPEN cursor1;
  33.    
  34.     IF var1 = 2 THEN
  35.         SET var1 = 1;
  36.         FETCH cursor1 INTO SUM, cla, punt;
  37.         SET punt = punt + 2;
  38.         UPDATE clases SET puntuacion = punt WHERE codigo = cla;
  39.     ELSEIF var1 = 1 THEN
  40.         SET var1 = 0;
  41.         FETCH cursor1 INTO SUM, cla, punt;
  42.         SET punt = punt + 1;
  43.         UPDATE clases SET puntuacion = punt WHERE codigo = cla;
  44.     END IF;
  45.    
  46.     CLOSE cursor1;
  47.    
  48. END$$
  49.  
  50. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/02/2015, 17:38
 
Fecha de Ingreso: marzo-2012
Ubicación: Menorca
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Fallo al crear procedimiento

Muchísimas gracias por tu respuesta tan rápida gnzsoloyo, me has aclarado bastantes dudas, pero si dices que el primer select sobra, como debería hacerlo para que se muestre su resultado?
  #4 (permalink)  
Antiguo 12/02/2015, 19:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Fallo al crear procedimiento

El SELECT debe ser la última sentencia de un SP, si quieres obtener ese resultado desde la aplicación.
En el interior generan errores de salida, y en ciertos lenguajes de programación no dan buenos resultados, ya que las queries no se espera que devuelvan N tablas resultado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/02/2015, 13:48
 
Fecha de Ingreso: marzo-2012
Ubicación: Menorca
Mensajes: 13
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Fallo al crear procedimiento

Gracias por las respuestas, ya he logrado solucionarlo.

Etiquetas: fallo, procedimiento
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 23:33.