简体   繁体   English

MySQL-如果存储过程中存在条件子句

[英]MySql - if exists clause in stored procedure

I'm working on login/register module of my program based on a tutorial I found. 我正在根据发现的教程来开发程序的登录/注册模块。 Everything worked fine but then I switched from MSSql to MySql database. 一切正常,但随后我从MSSql切换到MySql数据库。

The problem is I can't rewrite my InsertUser procedure. 问题是我无法重写我的InsertUser过程。 This procedure takes 3 parameters (username, password and email) and can return 3 different values 此过程采用3个参数(用户名,密码和电子邮件),并且可以返回3个不同的值

-1 if username is already used -1(如果已使用用户名)
-2 if email is already used -2如果已经使用了电子邮件
id of new row if registration is successful 注册成功后新行的id

I tried to write it like this: 我试图这样写:

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 ;

When I try to create this procedure using the above code from Visual Studio I get error (wrong syntax). 当我尝试使用上述代码从Visual Studio创建此过程时,出现错误(语法错误)。 However there is no error if I do it from phpmyadmin page. 但是,如果我从phpmyadmin页面执行此操作,则没有错误。 But it doesn't work at all (returns nothing) regardless of arguments I provide. 但是无论我提供什么参数,它根本都不起作用(不返回任何内容)。 I'm using phpmyadmin page and execute procedure option to test it. 我正在使用phpmyadmin页面并执行过程选项进行测试。

Here is original T-Sql code: 这是原始的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

Any ideas? 有任何想法吗?

6.10.1 Using Stored Routines from Connector/Net 6.10.1从连接器/网络使用存储的例程

... ...

Unlike the command-line and GUI clients, you are not required to specify a special delimiter when creating stored procedures in Connector/Net. 与命令行和GUI客户端不同,在Connector / Net中创建存储过程时,不需要指定特殊的分隔符。

... ...

One option in MySQL (command-line): 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 ;

Thank you, but I solved it myself. 谢谢,但我自己解决了。 I don't know why I wanted so badly to use EXISTS function:) I got rid of it and now it works: 我不知道为什么我如此迫切希望使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM