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

Procedimiento con cursores dinámicos?

Estas en el tema de Procedimiento con cursores dinámicos? en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/05/2009, 11:11
 
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 ;
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 00:37.