【问题标题】:creating Stored procedure in mysql gives error在mysql中创建存储过程会出错
【发布时间】:2015-03-14 08:05:22
【问题描述】:

数据库架构

CREATE TABLE Users(
UserId int auto_increment NOT NULL Primary key,
Username varchar(20) NOT NULL,
Password varchar(20) NOT NULL,
Email nvarchar(30) NOT NULL,
CreatedDate datetime NOT NULL,
LastLoginDate datetime NULL
);

我要写的存储过程是

CREATE procedure Insert_User(
in uname NVARCHAR(20),
in Pass NVARCHAR(20),
in Em NVARCHAR(30)),
out result int)

BEGIN 
IF EXISTS(SELECT UserId FROM Users WHERE Username = uname)
BEGIN
    set result=-1 -- Username exists.
END
elif EXISTS(SELECT UserId FROM Users WHERE Email = Em)
BEGIN
    set result=-2 -- Email exists.
END
ELSE
BEGIN
    INSERT INTO Users
           (Username
           ,Password
           ,Email
           ,CreatedDate)
    VALUES
           (@Username
           ,@Password
           ,@Email
           ,GETDATE())

    set result=SCOPE_IDENTITY() -- UserId              
 END
 END

我做错了什么?

【问题讨论】:

  • 产生了哪个错误?
  • 不要分心,不要闲聊(阅读help→tour),让您的问题简短明了。包括实际的错误消息。

标签: mysql database stored-procedures


【解决方案1】:

你的程序有很多问题,这里是mysql中的一个。

delimiter //
CREATE procedure Insert_User(
in uname VARCHAR(20),
in Pass VARCHAR(20),
in Em VARCHAR(30),
out result int
)
BEGIN 
 IF (select count(*) from Users WHERE Username = uname ) > 0 then
    begin
      set result=-1 ;
    end ;
 elseif (select count(*) from Users WHERE Email = Em ) > 0 then
    begin
     set result=-2 ;
    end ;
 else
    begin
      INSERT INTO Users
           (Username
           ,Password
           ,Email
           ,CreatedDate)
      VALUES
           (uname
           ,Pass
           ,Em
           ,curdate()) ;

     set result=LAST_INSERT_ID(); 
    end ;             
 end if ;
END ;//

delimiter ;

这里是mysql cli中的测试用例

mysql> CREATE TABLE Users(
    -> UserId int auto_increment NOT NULL Primary key,
    -> Username varchar(20) NOT NULL,
    -> Password varchar(20) NOT NULL,
    -> Email nvarchar(30) NOT NULL,
    -> CreatedDate datetime NOT NULL,
    -> LastLoginDate datetime NULL
    -> 
    -> ); 
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter //
mysql> CREATE procedure Insert_User(
    -> in uname VARCHAR(20),
    -> in Pass VARCHAR(20),
    -> in Em VARCHAR(30),
    -> out result int
    -> )
    -> BEGIN 
    ->  IF (select count(*) from Users WHERE Username = uname ) > 0 then
    ->     begin
    ->       set result=-1 ;
    ->     end ;
    ->  elseif (select count(*) from Users WHERE Email = Em ) > 0 then
    ->     begin
    ->      set result=-2 ;
    ->     end ;
    ->  else
    ->     begin
    ->       INSERT INTO Users
    ->            (Username
    ->            ,Password
    ->            ,Email
    ->            ,CreatedDate)
    ->       VALUES
    ->            (uname
    ->            ,Pass
    ->            ,Em
    ->            ,curdate()) ;
    -> 
    ->      set result=LAST_INSERT_ID(); 
    ->     end ;             
    ->  end if ;
    -> END ;//
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> delimiter ;

mysql> call Insert_User('Abhik','abhik','abhik@aa.com',@res);
Query OK, 1 row affected (0.05 sec)

mysql> select @res;
+------+
| @res |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from Users;
+--------+----------+----------+--------------+---------------------+---------------+
| UserId | Username | Password | Email        | CreatedDate         | LastLoginDate |
+--------+----------+----------+--------------+---------------------+---------------+
|      1 | Abhik    | abhik    | abhik@aa.com | 2015-03-14 00:00:00 | NULL          |
+--------+----------+----------+--------------+---------------------+---------------+
1 row in set (0.00 sec)

mysql> call Insert_User('Abhik','abhik','abhik@aa.com',@res);
Query OK, 0 rows affected (0.00 sec)

mysql> select @res;
+------+
| @res |
+------+
|   -1 |
+------+
1 row in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2018-03-23
    • 2020-12-02
    • 2014-05-07
    • 1970-01-01
    • 2016-11-11
    • 2017-10-14
    • 2021-07-10
    相关资源
    最近更新 更多