MySQL - у вас есть ошибка в вашем синтаксисе SQL;проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MariaDB - phpMyAdmin - PullRequest
0 голосов
/ 26 октября 2019

Я запускаю ниже хранимую процедуру в 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;SET v_IsOTPValid = NULL;DECL 'в строке 9

Я пытался:

Объявлено ли в mysql синтаксическую ошибку?

и

Загадочная ошибка в CREATE PROCEDURE в MariaDB / MySQL

Но ни один из этих ответов не помогает!

1 Ответ

4 голосов
/ 26 октября 2019

У вас есть SET до конца всех операторов DECLARE ..

и в соответствии с official documentation поместите все объявления перед набором или любым другим оператором:

BEGIN   
  DECLARE v_IsOTPValid TINYINT DEFAULT  NULL;
  DECLARE v_userCode CHAR(36);
  DECLARE v_Token CHAR(36); 
  SET v_IsOTPValid = NULL; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...