我有一个存储过程,用于检查用户是否已经存在,而不管用于数据库中第一行返回的电子邮件的输入。如果我手动运行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
答案 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