Ver Mensaje Individual
  #1  
Antiguo 12-07-2012
Avatar de arrakshe
arrakshe arrakshe is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Reputación: 0
arrakshe Va por buen camino
Cursor no recorre toda la tabla, se queda a medias

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.


Código SQL [-]
-- --------------------------------------------------------------------------------
-- 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
Responder Con Cita