【问题标题】:MySQL stored procedure not returning correct resultsMySQL存储过程没有返回正确的结果
【发布时间】:2014-12-15 16:09:17
【问题描述】:

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

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

【问题讨论】:

  • 您能否添加一些示例数据,显示您期望获得的结果与实际获得的结果?
  • User ID是怎样的列命名?
  • 您似乎已将参数命名为Email 与列相同,Email。尝试将参数名称更改为其他名称。
  • @almasshaikh 绝对不是一个好的字段名称选择,但只要它被这样引用,它就可以工作。
  • 谢谢@AndrewBarber 我不知道你可以在列中使用空间,但你让我很开心。是的,我今天学到了新东西:)

标签: mysql sql stored-procedures


【解决方案1】:

你的问题无疑出在这里:

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

【讨论】:

    【解决方案2】:

    问题是您的变量名称为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
    

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多