02 mayo, 2020

Solucionar el Error Code: 1064 en MySQL Workbench

¿Estas obteniendo el siguiente error?

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1 0.000 sec
Mira este post que aquí encontrarás la solución.

Ejemplo

Tenemos el siguiente procedimiento almacenado el cual genera un código auto-incremental con letras y números.

CREATE PROCEDURE sp_Generar_Codigo
(
OUT p_codigo_secundario VARCHAR(4) 
)
BEGIN
    DECLARE contador INT;
    BEGIN
        SET contador = (SELECT COUNT(*)+1 FROM productos); 
        IF(contador<10)THEN
            SET p_codigo_secundario = CONCAT('P00',contador);
            ELSE IF(contador<100) THEN
                SET p_codigo_secundario = CONCAT('P0',contador);
                ELSE IF(contador<1000)THEN
                    SET p_codigo_secundario = CONCAT('P',contador);
                END IF;
            END IF;
        END IF; 
    END;
END

¿Por qué? MySQL Workbench lanza Incomplet Statment: excepting ; después de la consulta de inserción. ¿Qué puedo hacer?



Respuesta

Los procedimientos de varias etapas (cuando BEGIN ... END están presente) requieren anulaciones del delimitador para evitar que las declaraciones que contienen terminen la definición del procedimiento prematuramente.

Solución

Por lo general, debe hacer algo como:

DELIMITER //
CREATE PROCEDURE sp_Generar_Codigo2
(
OUT p_codigo_secundario VARCHAR(4) 
)
BEGIN
    DECLARE contador INT;
    BEGIN
        SET contador = (SELECT COUNT(*)+1 FROM productos); 
        IF(contador<10)THEN
            SET p_codigo_secundario = CONCAT('P00',contador);
            ELSE IF(contador<100) THEN
                SET p_codigo_secundario = CONCAT('P0',contador);
                ELSE IF(contador<1000)THEN
                    SET p_codigo_secundario = CONCAT('P',contador);
                END IF;
            END IF;
        END IF; 
    END;
END//
DELIMITER ;

Para ejecutar el procedure

delimiter ;
CALL sp_Generar_Codigo(@a);
SELECT @a;

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!