Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/05/2009, 11:11
pendejo1983
 
Fecha de Ingreso: noviembre-2007
Mensajes: 163
Antigüedad: 16 años, 5 meses
Puntos: 0
Procedimiento con cursores dinámicos?

Hola, estoy tratando de hacer un procedimiento con cursores cuya clausula where varía, el código lo pego al final. Como veis, hace una consulta y a partir de esa primera consulta tengo que ir haciendo mas con datos de la 1ª, para ello he tratado de construir "cursores dinámicos" pero no me funciona y no sé que hago mal.

Cualquier ayuda sería bienvenida


DELIMITER $$

DROP PROCEDURE IF EXISTS `pcligamercado`.`HAZ_CLASIFICACION` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pcligamercado`.`HAZ_CLASIFICACION` ()
BEGIN
-- variables
DECLARE done INT DEFAULT 0;
DECLARE puntos INT DEFAULT 0;
declare nmbEquipo varchar(40);
DECLARE goleslocal INT DEFAULT 0;
DECLARE golesvisitante INT DEFAULT 0;
DECLARE iddivision INT DEFAULT 0;
DECLARE division INT DEFAULT 0;
declare pais varchar(40);

-- variables cursores
declare cur1 cursor for select distinct equipolocal from resultado;
declare cur2 cursor for select goleslocal, golesvisitante from resultado where equipolocal = nmbEquipo;
declare cur3 cursor for select goleslocal, golesvisitante from resultado where equipovisitante = nmbEquipo;
declare cur4 cursor for select iddivision from equipo where nombre = nmbEquipo;
declare cur5 cursor for select pais, division from pais_division where iddivision = iddivision;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

-- vacio clasificacion antes de hacer nada
DELETE FROM clasificacion;
commit;

-- de resultados coge los distintos nombres de equipos que hay
open cur1;

REPEAT
set @puntos := 0;
select concat('Debug : ','Paramater puntos = ',puntos);
FETCH cur1 INTO nmbEquipo;
select concat('Debug : ','Paramater nmbEquipo = ',nmbEquipo);
-- Con cada nombre de equipo coge de resultados los partidos de ese
-- equipo como local y en funcion del resultado guarda los puntos en variable tmpral
select concat('Debug : ','Obtengo los resultados como local');

open cur2;
repeat
FETCH cur2 INTO goleslocal,golesvisitante;
select concat('Debug : ','Paramater goleslocal = ',goleslocal);
select concat('Debug : ','Paramater golesvisitante = ',golesvisitante);
if goleslocal > golesvisitante then
set @puntos := @puntos + 3;
else
if goleslocal = golesvisitante then
set @puntos := @puntos + 1;
end if;
end if;
UNTIL done END REPEAT;

CLOSE cur2;
-- Con cada nombre de equipo coge de resultados los partidos de ese
-- equipo como visitante y en funcion del resultado guarda los puntos en variable tmpral
select concat('Debug : ','Obtengo los resultados como visitante');

open cur3;
repeat
FETCH cur3 INTO goleslocal,golesvisitante;
if golesvisitante > goleslocal then
set @puntos := @puntos + 3;
else
if golesvisitante = goleslocal then
set @puntos := @puntos + 1;
end if;
end if;
UNTIL done END REPEAT;

CLOSE cur3;
-- Con el nombre del equipo se va a la tabla equipo y se coge el iddivision
select concat('Debug : ','Obtengo el iddivision');

open cur4;
repeat
FETCH cur4 INTO iddivision;

UNTIL done END REPEAT;

CLOSE cur4;
-- Con el iddivision se obtiene de pais_division el pais y la division
select concat('Debug : ','Obtengo el pais y division');
open cur5;
repeat
FETCH cur5 INTO pais, division;

UNTIL done END REPEAT;

CLOSE cur5;
-- Con todos los datos anteriores se inserta en clasificacion
select concat('Debug : ','inserto en clasificacion');
INSERT INTO clasificacion (pais, division, equipo, puntos) VALUES (pais, division, nmbEquipo, puntos);

UNTIL done END REPEAT;

CLOSE cur1;

commit;

END $$

DELIMITER ;