-1

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

#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 语法是正确的......嗯,显然不是根据服务器......有人有什么想法吗?

4

1 回答 1

0

有一些问题:

SELECT...INTOEXISTS子句中使用语句。你不能这样做,因为 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
...

ELSE从第一个 CASE 结构中删除关键字。

最后一个CASE结构有错误的语法,试试这个 -

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;
于 2013-05-28T05:36:15.930 回答