MySQL - Problema con CURSOR en MySQL

   
Vista:

Problema con CURSOR en MySQL

Publicado por Cesar Gutierrez cesarfgt@gmail.com (1 intervención) el 16/12/2011 20:13:05
Que error existe en este cursos que estoy relaizando para actualizar una tabla en base al resultado obtenido del cursos delcarado.

DECLARE xIDArticulo VARCHAR(20);
DECLARE xResultado INT;
DECLARE xCursor FOR SELECT IDArticulo,SUM(CANTIDAD) AS Resultado From detmov Where IDAlmacen=1 and status="N" group by idarticulo order by idarticulo;

SET xResultado=0;

OPEN xCursor;
WHILE NOT DONE DO
FETCH xCursor INTO xIDArticulo,xResultado;
IF xResultado>=0 THEN
Update existencias set ExiCierre=xResultado where idarticulo=xIDArticulo and IDAlmacen=1;
END IF;
END WHILE;
CLOSE xCursor;


Como podran darse cuenta lo quiero utilizar para actualizar la existencias de almacen cuando se ejecuta el cierre mensual, de tal forma que quien realize el trabajo sea el servidor y no se tenga que efetuar varias llamadas al servidor.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema con CURSOR en MySQL

Publicado por Xavico Bermeo xbermeo@gmail.com (1 intervención) el 03/07/2013 05:17:39
Saludos cesar yo tengo el mismo problea quisiera saber si lo pudiste resolver o cual es la razon de xq no actualiza.
te planteo mi problema tengo 1 tabla cabecera q contiene numero de factura y en otra llamada historial el numero de factura y la sucursal (son tablas diferentes ) en donde fue emitida, lo q necesito es pasar a la tabla cabecera la sucursal aki te dejo el cursor:

DELIMITER ;;
DROP PROCEDURE IF EXISTS `micursor`;;
CREATE PROCEDURE `micursor`()
BEGIN

DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE fact CHAR(16);
DECLARE sucursal CHAR(20);

DECLARE c1 CURSOR FOR SELECT num_fact FROM alum_historial WHERE sucursal=1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
set sucursal='centro';
OPEN c1;
c1_loop: LOOP
FETCH c1 INTO fact;

UPDATE fact_cab SET LOCAL = sucursal WHERE num_facu=fact;
END LOOP c1_loop;
CLOSE c1;
END ;;



me podrian ayudar a ver cual es la razon q no actualiza....
espero su respuesta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego

Problema con CURSOR en MySQL

Publicado por Diego (3 intervenciones) el 03/07/2013 07:42:58
Xavico,

no veo porque no funciona la clausula UPDATE, pero si veo que podes tener un problema con el LOOP que podría estar ejecutándose infinitamente ya que nunca evalúa si el CURSOR termino de recorrer el set de resultados.

Para comprobar si se ejecuta y no para nunca, podes imprimir e npantalla con un SELECT 'testing'; por ejemplo, dentro del LOOP y ejecutar por consola el STORE PROCEDURE a ver si la palabra "testing" aparece infinitamente

si sucede, para prevenir esto podes evaluar el HANDLER dentro del LOOP de esta forma

1
2
3
4
5
6
7
...
c1_loop: LOOP
        IF DONE THEN
            CLOSE c1;
            LEAVE c1_loop;
        END IF;
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego

Problema con CURSOR en MySQL

Publicado por Diego (3 intervenciones) el 03/07/2013 06:18:42
Lo primero que veo es que a la sentencia DECLARE xCursor FOR no le falta la declaración de CURSOR?

Debería ser así: DECLARE xCursor CURSOR FOR ....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego

Problema con CURSOR en MySQL

Publicado por Diego (3 intervenciones) el 03/07/2013 06:57:52
segundo incluiría la declaración del handler:

DECLARE DONE INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;

con esto el WHILE puede iterar sobre el cursor

con esto creo debería funcionar.

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar