Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/02/2015, 17:24
Avatar de gnzsoloyo
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, 2 meses
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)