Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2012
Avatar de arrakshe
arrakshe arrakshe is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 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
  #2  
Antiguo 12-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y de qué base de datos estamos hablando?
Responder Con Cita
  #3  
Antiguo 12-07-2012
Avatar de arrakshe
arrakshe arrakshe is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Poder: 0
arrakshe Va por buen camino
Pequeño gran detalle, estoy trabajando con MySQL 5.1.43 jeje
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda con recorre una tabla dariel88060708 Conexión con bases de datos 2 13-01-2010 18:50:00
refresh a toda la tabla jzginez Firebird e Interbase 3 12-09-2005 17:27:49
Sumar barriendo toda la tabla ramiretor SQL 0 10-02-2005 20:47:15
Buscar un valor en toda una tabla rjsitruiz Varios 1 31-05-2004 22:55:29
Como actualizar toda una tabla con bastantes registros? IcebergDelphi Firebird e Interbase 4 16-12-2003 14:08:00


La franja horaria es GMT +2. Ahora son las 12:55:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi