2015-05-04 59 views
0

當我需要使用@來引用mySQL中的變量時,我很模糊。我來自MS SQL,你總是使用它,但顯然這在mySQL中是不正確的。這個if/then存儲過程有什麼問題?

因此,即使會話值已過期,以下存儲過程始終執行第一個IF塊 - 因爲它始終執行更新語句。顯然,唯一能找到的用於mySQL存儲過程的調試工具可以在Windows和Linux上運行。我在Mac上。 Wamp wamp wamp。

所以是的。任何人都可以看到這裏有什麼問題?謝謝!

DELIMITER $$ 

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256)) 
BEGIN 
    DECLARE sessId INT DEFAULT NULL; 

    SELECT sessId = id FROM UserSessions 
    WHERE userId = uid 
    AND sessionToken = token 
    AND expires > INTERVAL 2 MINUTE + NOW() ORDER BY expires DESC LIMIT 1; 

IF sessId IS NOT NULL THEN 
    UPDATE UserSessions 
    SET expires = INTERVAL 2 HOUR + NOW() 
    WHERE id = sessId; 
ELSE 
    DELETE FROM UserSessions 
    WHERE userId = uid 
    AND sessionToken = token; 
    SET @sessId = 0; 

END IF; 

SELECT sessId; 
END 

對於什麼它應該在僞代碼做記錄:

if we have a session for this user, with a matching token which has not expired { 
    update the expiration time to 2 hours from now 
    return the session id; 
} 
else { 
    delete the (now stale) session 
    return 0; 
} 

在此先感謝。

+0

Barranka所涉及的主要問題,我在下面他的回答看;但我不確定爲什麼第一個IF塊會在你的版本中執行,因爲sessId應該始終爲NULL。另外,如果你真的想要一個返回值而不是結果集,一個存儲的FUNCTION可能更適合你的需求。 – Uueerdo

回答

0

您沒有設置sessId的值...您在查詢中進行了比較。

我想你需要的是這樣的:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256)) 
BEGIN 
    DECLARE sessId INT DEFAULT NULL; 

    SELECT id 
     INTO sessId -- Here is the assignment 
    FROM UserSessions 
    WHERE userId = uid 
     AND sessionToken = token 
     AND expires > INTERVAL 2 MINUTE + NOW() 
    ORDER BY expires DESC 
    LIMIT 1; 

    IF sessId IS NOT NULL THEN 
     UPDATE UserSessions 
      SET expires = INTERVAL 2 HOUR + NOW() 
      WHERE id = sessId; 
    ELSE 
     DELETE FROM UserSessions 
      WHERE userId = uid 
      AND sessionToken = token; 
     SET sessId = 0; 
    END IF; 

    SELECT sessId; 
END 

參考:

+0

明白了。謝謝! – MonkRocker