Procedimientos almacenados

Hola como estas estoy haciendo una aplicación con visual baisc 6.0 y bdd mysql 5
Necesito sumar sus cantidades y hacer unos cálculos para visualizar lo que esta en piso o terminado, lo que esta por despachar, lo que esta en proceso el saldo el mínimo y el máximo del inventario general de unas referencias de productos.
Ya lo hice con un procedimiento almacenado y un cursor da los resultados que necesito pero el proceso es muy lento se demora más o menos 1 min en la consulta y mi maquina es buena,
quisieras que me sujiera alguna forma para optimizar este proceso.
Ahí le dejo el código para que lo analice
Gracias
DELIMITER $$
DROP PROCEDURE IF EXISTS `copia inventario_general` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `copia inventario_general`()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE ref varchar(30);
    DECLARE por_despachar,ga3,es02,terminadas,piso,despacho,proceso,saldo,mini,maxi INT;
    DECLARE cur1 CURSOR FOR SELECT referencia FROM ficha_tecnica;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    truncate table inventario_general;
    OPEN cur1;
      REPEAT
        FETCH cur1 INTO  ref;
          IF not done  THEN
                select ifnull(sum(cantidad),0) into por_despachar from hoja_ruta where referencia=ref;
                select ifnull(sum(unidades_terminadas),0) into terminadas from cierre_ordenes where referencia=ref;
                select ifnull(sum(cantidad),0)into despacho from despacho where referencia=ref;
                select ifnull(sum(unidades_faltantes),0) into proceso from cierre_ordenes where referencia=ref;
                select min    into mini from ficha_tecnica where referencia=ref;
                select max    into maxi from ficha_tecnica where referencia=ref;
                set piso=ifnull((terminadas-despacho),0);
                set  saldo=((proceso+piso)- por_despachar);
                insert into inventario_general values (ref,piso,proceso,por_despachar,saldo,mini,maxi);
          END IF;
        UNTIL done
      END REPEAT;
    CLOSE cur1;
  END $$
DELIMITER ;

1 respuesta

1
Respuesta de
Hola
No entiendo tu lógica, pero ya que tienes un cursor y lo recorres, no entiendo el porque los select, si uno hace un cursor es para recorrer esos datos no para hacer diversos select dentro de el.
Hay varios que usan la misma tabla, y la misma condición, coloca esos en 1 sola instrucción, no en varias como los tienes.
Saludos
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje