【问题标题】:MySQL - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax- phpMyAdminMySQL - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法 - phpMyAdmin
【发布时间】:2020-02-22 14:17:06
【问题描述】:

我在 PhpMyAdmin 的存储过程下面运行:

DELIMITER //

CREATE PROCEDURE usp_ForgotPassword (
    -- Add the parameters for the stored procedure here
    p_mobileNo VARCHAR(50),
    p_emailId VARCHAR(300),
    p_password VARCHAR(300),
    p_otp VARCHAR(50),
    p_appInstanceCode CHAR(36))
BEGIN   
    DECLARE v_IsOTPValid TINYINT DEFAULT  NULL;
    SET v_IsOTPValid = NULL;
    DECLARE v_userCode CHAR(36);

    IF (v_IsOTPValid = 1)
    THEN
        IF EXISTS(SELECT * FROM OTP WHERE otp = p_otp AND mobileNo = p_mobileNo)
        THEN

            SET v_userCode = (SELECT userCode FROM UserLogin WHERE userName = p_emailId);

            UPDATE UserLogin UL
            SET password = p_password 
            WHERE userName = p_emailId AND userCode = v_userCode;

            -- Delete the verified OTP 
            DELETE FROM OTP WHERE otp = p_otp AND mobileNo = p_mobileNo;

            DECLARE v_Token CHAR(36);


            INSERT INTO Token (createdAt, updatedAt,code,userCode,appInstanceCode,deviceIMEI,deviceName)
                                VALUES (NOW(),NOW(),v_Token,v_userCode,p_appInstanceCode,NULL,NULL);


            SELECT 200 code, 'Password changed succesfully' as message,v_Token;
        ELSE
            SELECT 400 as code, 'Invalid OTP or Mobile No' as message,v_Token;
        END IF;
    ELSE
        SELECT 401 as code, 'OTP expired' as message,v_Token;
    END IF; 
END
//
delimiter ;

但它一直显示错误:

1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 'DECLARE v_IsOTPValid TINYINT DEFAULT NULL; 附近使用的正确语法; 设置 v_IsOTPValid = NULL; DECL' 在第 9 行

我试过了:

Is declare in mysql giving syntax error?

Mystery error in CREATE PROCEDURE in MariaDB/MySQL

但是这些答案都没有帮助!

【问题讨论】:

    标签: mysql stored-procedures mariadb


    【解决方案1】:

    在所有 DECLARE 语句结束之前都有一个 SET..

    根据official documentation,将所有声明放在集合或任何其他语句之前:

    BEGIN   
      DECLARE v_IsOTPValid TINYINT DEFAULT  NULL;
      DECLARE v_userCode CHAR(36);
      DECLARE v_Token CHAR(36); 
      SET v_IsOTPValid = NULL; 
    

    【讨论】:

    • 遇到另一个错误:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE v_userCode CHAR(36);
    • 尝试将所有声明移到集合之前
    • 只是建议查看您的代码..将 v_IsOTPValid 设置为 null 并检查 if is =1 对我来说似乎没有意义..
    • 是的,有一个标量函数可以为其设置值,但现在(对于问题)我删除了它
    • 顺便说一句谢谢!即使在没有人指出这一点的其他类似问题上,我也无法找到任何有关它的文档!
    猜你喜欢
    • 2021-05-12
    • 2018-11-27
    • 2019-10-24
    • 2017-02-11
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多