我在MySQL中有一个带有2个嵌套游标的存储过程。当我尝试调用它时,我收到错误Packects out of order - Expected 1 received 4
存储过程代码:
BEGIN
DECLARE num_clientes INT DEFAULT 0;
DECLARE nInicio DATE;
DECLARE nFin DATE;
DECLARE nIdCliente INT;
DECLARE clientCounter INT;
DECLARE auxDias INT;
DECLARE finClientes BOOLEAN;
DECLARE finContratos BOOLEAN;
DECLARE porcentaje DOUBLE;
DECLARE clientes_proyecto CURSOR FOR SELECT id FROM clientes WHERE id_proyecto = selProyecto;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finClientes = TRUE;
SET num_clientes = (SELECT COUNT(clientes.id) from clientes WHERE id_proyecto = selProyecto);
-- Declaración de un manejador de error tipo NOT FOUND
OPEN clientes_proyecto;
loop_clientesProyecto: LOOP
-- Recogemos la id del Cliente
FETCH clientes_proyecto INTO nIdCliente;
-- Reseteamos los días trabajados
SET auxDias = 0;
BLOCK2: BEGIN
DECLARE cliContratos CURSOR FOR SELECT fecha_inicio, fecha_fin FROM contratos_clientes WHERE id_cliente = nIdCliente;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finContratos = TRUE;
-- Abrimos un segundo cursor para iterar los contratos de ese cliente
OPEN cliContratos;
loop_contratos: LOOP
FETCH cliContratos INTO nInicio, nFin;
IF nFin < CURDATE() THEN
SET auxDias = auxDias + Datediff(nInicio, nFin);
ELSE
SET auxDias = auxDias + Datediff(nInicio, CURDATE());
END IF;
IF finContratos THEN
LEAVE loop_contratos;
END IF;
END LOOP loop_contratos;
CLOSE cliContratos;
END BLOCK2;
-- Ya tenemos los días trabajados del cliente, realizamos el cálculo del porcentaje
SET porcentaje = porcentaje + ((((auxDias)/90)*(100/num_clientes))/100);
IF finClientes THEN
LEAVE loop_clientesProyecto;
END IF;
END LOOP loop_clientesProyecto;
CLOSE clientes_proyecto;
SELECT porcentaje;
END
在程序中我迭代我的客户表,然后,在CURSOR中我迭代他的合同来计算他工作的天数,然后计算百分比。此百分比是存储过程的返回值。
在我的PHP代码中,我只做DB :: select(&#39; CALL porcentaje_contratacion(3)&#39;)。
为什么会这样?我不清楚Packets乱序的含义。