Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL v 5.5中使用“Select INTO”的例程出现1064语法错误_Mysql_Mysql Error 1064 - Fatal编程技术网

在MySQL v 5.5中使用“Select INTO”的例程出现1064语法错误

在MySQL v 5.5中使用“Select INTO”的例程出现1064语法错误,mysql,mysql-error-1064,Mysql,Mysql Error 1064,我做错了什么?我不断得到: #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 'INTO userID, currentStatus, failedLogin FROM access WHERE username = p_UserName ' at line 9

我做错了什么?我不断得到:

#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 'INTO userID, 
currentStatus, failedLogin FROM access WHERE username = p_UserName ' at line 9 
当然,以下是我的常规:

DELIMITER $$

DROP PROCEDURE IF EXISTS `user_login`$$

CREATE PROCEDURE `user_login`(IN v_UserName VARCHAR(45), IN v_Password VARCHAR(45), IN v_IP VARCHAR(45), IN v_Source VARCHAR(45))

BEGIN

    DECLARE userID INT(10);
    DECLARE currentStatus VARCHAR(10);
    DECLARE failedLogin INT(4);

    IF EXISTS(SELECT access_user_id, status, failed_login_count INTO userID, currentStatus, failedLogin FROM access WHERE username = v_UserName AND hash = v_Password LIMIT 1) THEN
        UPDATE access SET failed_login_count=0 WHERE access_user_id=userID;
        INSERT INTO last_login (profiles_user_id, timestamp, ip_address, login_source) VALUES (userID, NOW(), v_IP, v_Source) ON DUPLICATE KEY UPDATE timestamp=VALUES(timestamp), ip_address=VALUES(ip_address), login_source=VALUES(login_source);
        INSERT INTO login_history (profiles_user_id, timestamp, ip_address, login_source) VALUES (userID, NOW(), v_IP, v_Source);

        CASE currentStatus
            WHEN 'Active' THEN
                SELECT userID, currentStatus;
            WHEN 'Dormant' THEN
                UPDATE access SET status='Active' WHERE access_user_id=userID;
                SELECT userID, currentStatus;               
            WHEN 'Locked' THEN
                SELECT userID, currentStatus;
            ELSE

        END CASE;

    ELSE
        IF EXISTS(SELECT access_user_id, failed_login_count INTO userID, failedLogin FROM access WHERE username = p_UserName LIMIT 1) THEN
            failedLogin = failedLogin +1;
            UPDATE access SET failed_login_count=failedLogin WHERE access_user_id=userID;

            CASE failedLogin
                WHEN (<10) THEN
                    SELECT 0, 'Invalid';
                WHEN (>10) THEN
                    UPDATE access SET status='Locked' WHERE access_user_id=userID;
                    SELECT 0, 'Invalid';
                ELSE
                    UPDATE access Set failed_login_count=1 WHERE access_user_id=userID;
                    SELECT 0, 'Invalid';
            END CASE;

        ELSE
            SELECT 0, 'Invalid';
        END IF;
    END IF;
END$$

DELIMITER ;

我已经翻阅了MySQL 5.5文档,根据它,我的SELECT INTO语法是正确的。。。嗯,显然不是根据服务器。。。有人有什么想法吗?

有一些问题:

在EXISTS子句中使用SELECT…INTO语句。您不能这样做,因为SELECT…INTO不返回结果集,它只设置变量。解决方法拆分查询并检查IF语句中的ID值:

SELECT access_user_id, status, failed_login_count INTO userID, currentStatus, failedLogin FROM access WHERE username = p_UserName AND hash = p_Password LIMIT 1;

IF userID IS NOT NULL THEN
...
从第一个CASE结构中删除ELSE关键字

最后一个CASE struct语法错误,请尝试使用此语法-

CASE
  WHEN failedLogin < 10 THEN
    SELECT 0, 'Invalid';
  WHEN failedLogin > 10 THEN
    UPDATE access SET status='Locked' WHERE access_user_id=userID;
    SELECT 0, 'Invalid';
  ELSE
    UPDATE access Set failed_login_count=1 WHERE access_user_id=userID;
    SELECT 0, 'Invalid';
END CASE;

p_UserName,p_Password应该是v_UserName,v_Password?p_UserName来自哪里,在Where UserName=p_UserName中使用?更正了这个错误,仍然是完全相同的错误…谢谢!这就解决了这个问题。实际上,我很好奇是否可以在IF-EXISTS子句中声明一个变量。那么,如果存在,仅仅是测试它是否存在?谢谢你的改变。然而,我仍然得到一个错误:1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以获得可在“=failedLogin+1”附近使用的正确语法;更新访问集失败\u login\u count=failedLogin WHERE acces'在第32行,您需要向更新上方的查询添加SET命令-SET failedLogin=failedLogin+1;哎呀!成功了!非常感谢你!!!