我正在創建此存儲過程,並且在過程中第一次選擇時出現語法錯誤。這個過程有一個名爲selProyecto的IN var。帶光標的MySQL存儲過程 - 語法錯誤
BEGIN
DECLARE num_clientes INT DEFAULT 0;
DECLARE exit_loop BOOLEAN;
DECLARE nInicio DATE;
DECLARE nFin DATE;
DECLARE nIdCliente INT;
DECLARE clientCounter INT;
DECLARE auxDias INT;
DECLARE finClientes BOOLEAN;
DECLARE finContratos BOOLEAN;
SELECT COUNT(clientes.id) from clientes WHERE id_proyecto = selProyecto INTO num_clientes;
DECLARE clientes_proyecto CURSOR FOR SELECT id FROM clientes WHERE id_proyecto = selProyecto;
-- Declaración de un manejador de error tipo NOT FOUND
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finClientes = TRUE;
OPEN clientes_proyecto;
loop_clientesProyecto: LOOP
-- Recogemos la id del Cliente
FETCH clientes_proyecto INTO nIdCliente;
-- Reseteamos los días trabajados
SET auxDias = 0;
-- Abrimos un segundo cursor para iterar los contratos de ese cliente
DECLARE cliContratos CURSOR FOR SELECT fecha_inicio, fecha_fin FROM contratos_cliente WHERE id_cliente = nIdCliente;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finContratos = TRUE;
OPEN cliContratos;
loop_contratos: LOOP
FETCH cliContratos INTO nInicio, nFin;
IF nFin < CURDATE() THEN
auxDias = auxDias + Datediff(nInicio, nFin);
ELSE
auxDias = auxDias + Datediff(nInicio, CURDATE());
END IF;
IF finContratos THEN
LEAVE loop_contratos;
END IF;
end loop_contratos;
-- 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_clientesProyecto;
END
目的是計算90天工作的客戶的百分比,但無法保存。
首先,我將SELECT COUNT(clientes.id) from clientes WHERE id_proyecto = selProyecto INTO num_clientes;
的客戶總數與之後聲明一個遊標來迭代每個客戶端。在遊標內部,我嘗試聲明另一個遊標來爲該客戶端完成總工作日。最後,我用一個函數計算工作日的百分比。
問題是它在第一次選擇之前會引發語法錯誤。
我已經tryied更改了一句:SET num_clientes = (SELECT COUNT(clientes.id) from clientes WHERE id_proyecto = selProyecto);
具有相同的結果
什麼是語法錯誤? – cjwfuller
我在做phpMyAdmin,它說'你有一個語法錯誤附近'DECLARE clientes_proyecto CURSOR FOR SELECT ID FROM clientes WHERE id_proyecto = selProyecto;'' –