在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;哎呀!成功了!非常感谢你!!!