MySql - 存储过程中的if exists子句

时间:2015-11-25 13:03:52

标签: mysql stored-procedures

根据我发现的教程,我正在编写程序的登录/注册模块。 一切正常,但后来我从MSSql切换到MySql数据库。

问题是我无法重写我的InsertUser程序。此过程需要3个参数(用户名,密码和电子邮件),并且可以返回3个不同的值

如果已使用用户名,则

-1 如果已使用电子邮件,则 -2 如果注册成功, id 新行

我试着这样写:

DELIMITER $$
CREATE PROCEDURE InsertUser(
    IN username VARCHAR(50),
    IN pass VARCHAR(255),
    IN email VARCHAR(50))
BEGIN
IF (SELECT Id FROM Users WHERE UserName=username) THEN
BEGIN
    SELECT -1;
END;
ELSEIF (SELECT Id FROM Users WHERE Email=email)
THEN
BEGIN
    SELECT -2;
END;
ELSE
BEGIN
    INSERT INTO Users (UserName, Password, RegDate, Email) VALUES(username, pass, CURDATE(), email);
    SELECT LAST_INSERT_ID();
END;
END IF;
END $$
DELIMITER ;

当我尝试使用Visual Studio的上述代码创建此过程时,我收到错误(语法错误)。但是如果我从phpmyadmin页面执行此操作则没有错误。但无论我提供什么参数,它根本不起作用(不返回任何东西)。我正在使用phpmyadmin页面并执行过程选项来测试它。

这是原始的T-Sql代码:

CREATE PROCEDURE [dbo].[Insert_User]    
      @Username NVARCHAR(20),    
      @Password NVARCHAR(20),    
      @Email NVARCHAR(50)    
AS    
BEGIN    
      SET NOCOUNT ON;    
      IF EXISTS(SELECT Id FROM Users WHERE Username = @Username)    
      BEGIN    
            SELECT -1 -- Username exists.    
      END    
      ELSE IF EXISTS(SELECT Id FROM Users WHERE Email = @Email)    
      BEGIN    
            SELECT -2 -- Email exists.    
      END    
      ELSE    
      BEGIN    
            INSERT INTO [Users]    
                     ([Username]    
                     ,[Password]    
                     ,[Email]    
                     ,[RegDate])    
            VALUES    
                     (@Username    
                     ,@Password    
                     ,@Email    
                     ,GETDATE())                       
            SELECT SCOPE_IDENTITY() -- UserId 
     END    
END

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  

6.10.1 Using Stored Routines from Connector/Net

     

...

     

与命令行和GUI客户端不同,在Connector / Net中创建存储过程时,不需要指定特殊的分隔符。

     

...

MySQL中的一个选项(命令行):

DELIMITER $$

CREATE PROCEDURE `InsertUser` (
    IN `_username` VARCHAR(50),
    IN `_pass` VARCHAR(255),
    IN `_email` VARCHAR(50)
)
BEGIN
    IF (SELECT `Id` FROM `Users` WHERE `UserName` = `_username`) THEN
        SELECT -1;
    ELSEIF (SELECT `Id` FROM `Users` WHERE `Email` = `_email`) THEN
        SELECT -2;
    ELSE
        INSERT INTO `Users` (`UserName`, `Password`, `RegDate`, `Email`)
        VALUES (`_username`, `_pass`, CURDATE(), `_email`);
        SELECT LAST_INSERT_ID();
    END IF;
END$$

DELIMITER ;

答案 1 :(得分:0)

谢谢,但我自己解决了。我不知道为什么我要如此糟糕地使用EXISTS功能:)我摆脱它现在它的工作原理:

BEGIN
    IF(SELECT Id FROM Users WHERE UserName=username) IS NOT NULL THEN
        SELECT -1;
    ELSEIF (SELECT Id FROM Users WHERE Email=email) IS NOT NULL THEN
        SELECT -2;
    ELSE
        INSERT INTO Users(UserName, Password, RegDate, Email) VALUES (username, pass, CURDATE(), email);
        SELECT LAST_INSERT_ID();
    END IF;
END