PDA

Ver la Versión Completa : Cursor no recorre toda la tabla, se queda a medias


arrakshe
12-07-2012, 01:09:30
Hola amigos foreros, mi problema es el siguiente, resulta que hice un cursor para recorrer una tabla e ir procesando cada registro individualmente, el problema es que de 540 registros que debería procesar solo procesa 52, ya probé la lógica que estoy utilizando y esta bien(lo probé muchas veces con los pocos registros que procesa y 'funciona'), ahora lo que no entiendo es porque el cursor no recorre la tabla en su totalidad, para hacer una prueba mas le quite el "CONTINUE HANDLER FOR NOT FOUND" que en teoría es lo que le dice que ya no hay mas registros por procesar y resulta que si lo ejecuto sin el HANDLER hace 539 registros bien y se cae cuando ya no tiene mas registros que procesar(algo normal, se cae cuando llega al final y ya no hay nada mas). Como les dije el código casi funciona solo es el detalle de que no recorre todo, por eso no pongo una descripción mas detallada de las bases y lo que debe hacer el procedimiento y el cursor, repito el hace todo si le quito el HANDLER), no se si alguien me pueda dar una idea de lo que podría estar causando que el cursor no recorra toda la tabla cuando tiene el HANDLER habilitado, agradezco de antemano cualquier ayuda que me puedan brindar.

Por aquello de las dudas
1. Ya revise la consulta que llena el cursor y si devuelve los 540 registros
2. La lógica del procedimiento no es de importancia para este caso debido a que el problema radica en que no se recorre todo el cursor

Les dejo el código para ver si me esta haciendo falta algo.


-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `salvadita`()
BEGIN

DECLARE no_more_rows BOOLEAN DEFAULT false;



DECLARE C_idEmpleado, C_idRubroBase, C_idRubroOrdinario, C_IDUnico INT;

declare tasaTempOrdinario,tasaTempBase double;

DECLARE cursorSalvadita CURSOR FOR
SELECT distinct re.idempleado
FROM plmrubrosempleados re, plmrubros r
WHERE re.idrubro = r.id AND
(r.descripcion = 'Salario Base' or
r.descripcion = 'Salario Ordinario');

-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows := true;

OPEN cursorSalvadita;
LOOP1: LOOP
FETCH cursorSalvadita INTO C_idEmpleado;
IF no_more_rows THEN
CLOSE cursorSalvadita;
LEAVE LOOP1;
END IF;
-- innicio de nuestro codigo
begin
set tasaTempBase = 0;
set C_idRubroBase = 0;
set tasaTempOrdinario = 0;
set C_idRubroOrdinario = 0;

SELECT plmrubrosempleados.tasa, plmrubrosempleados.idrubro into tasaTempBase, C_idRubroBase
FROM plmrubrosempleados, plmrubros
WHERE plmrubrosempleados.idempleado = C_idEmpleado and
plmrubrosempleados.idrubro = plmrubros.id AND
plmrubros.descripcion = 'Salario Base' limit 1;


SELECT plmrubrosempleados.tasa, plmrubrosempleados.idrubro into tasaTempOrdinario, C_idRubroOrdinario
FROM plmrubrosempleados, plmrubros
WHERE plmrubrosempleados.idempleado = C_idEmpleado and
plmrubrosempleados.idrubro = plmrubros.id AND
plmrubros.descripcion = 'Salario Ordinario' limit 1;

if C_idRubroBase <> 0 and C_idRubroOrdinario <> 0 then

UPDATE plmrubrosempleados SET tasa = tasaTempOrdinario
WHERE idempleado = C_idEmpleado AND idrubro = C_idRubroBase;

UPDATE plmrubrosempleados SET tasa = (tasaTempBase / 8)
WHERE idempleado = C_idEmpleado AND idrubro = C_idRubroOrdinario;

INSERT INTO `planilla`.`tempo_montos`
(`Cod_Empleado`,
`Cod_RubroBase`,
`Cod_RubroOrdinario`,
`Monto`,
tasaBaseInsertada,
tasaOrdinariaInsertada)
VALUES
(
C_idEmpleado,
C_idRubroBase,
C_idRubroOrdinario,
'Funka',tasaTempOrdinario,(tasaTempBase / 8));


end if;
end;
-- fin de nuestro codigo
END LOOP LOOP1;

END

Casimiro Notevi
12-07-2012, 09:12:54
¿Y de qué base de datos estamos hablando?

arrakshe
12-07-2012, 16:07:13
Pequeño gran detalle, estoy trabajando con MySQL 5.1.43 jeje