MySQL存储过程没有返回正确的结果

时间:2014-12-15 16:09:18

标签: mysql sql stored-procedures

我有一个存储过程,用于检查用户是否已经存在,而不管用于数据库中第一行返回的电子邮件的输入。如果我手动运行select语句,我会得到正确的结果。有什么建议吗?

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `Email` VARCHAR(30))
BEGIN
    DECLARE User_ID INT(30);
        SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END

2 个答案:

答案 0 :(得分:3)

毫无疑问,你的问题就在这里:

SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1;

致白;您的参数名称与列名称相同。 实际上可以正常工作,但实现这一目标的规则可能很奇怪。 (我想如果你改变了引号,它可能会起作用。)

但实际上,您应该做的是将Email参数重命名为其他内容:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `EmailAddress` VARCHAR(30))
BEGIN
    DECLARE User_ID INT(30);
        SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = EmailAddress  LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END

答案 1 :(得分:1)

问题是您的变量名称为email,与列相同。因此,email = email基本上是无操作,因为它仅指列名。

最好在参数前加上一些东西以避免这种混淆:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN v_Email VARCHAR(30))
BEGIN
    DECLARE v_User_ID INT(30);
    SELECT `User ID` INTO User_ID FROM `Users` u WHERE u.Email = v_Email LIMIT 1;

    IF (User_ID > 0) THEN
        SELECT * FROM `Users` WHERE `User ID` = v_User_ID;
    ELSE
        SELECT concat('No Users Found: ', Customer_Name);
    END IF;
END