2016-08-23 85 views
1

我遇到了一些麻烦与MySQL updateusers存储过程是这样的:MySQL的多个存储过程更新

DELIMITER go 

Create procedure updateusers(
    IN UserID tinyint(11), 
    IN FirstName varchar(30), 
    IN LastName varchar(30), 
    IN Password varchar(30), 
    IN EmailAddress varchar(30), 
    IN Salt varchar(40), 
    IN RoleID varchar(1)) 
BEGIN 
    update users 
    set 
    FirstName = FirstName 
    where UserID = UserID 
End 
BEGIN 
    update users 
    set 
    LastName = LastName 
    where UserID = UserID 

End 
BEGIN 
    update users 
    set  
    Password = Password 
    where UserID = UserID 

End 
BEGIN 
    update users 
    set 
    EmailAddress = EmailAddress 
    where UserID = UserID 
End 
BEGIN 
    update users 
    set 
    Salt = Salt 
    where UserID = UserID 
End 

BEGIN 
    update users 
    set 
    RoleID = RoleID 
    where UserID = UserID; 
End 
go 

DELIMITER ; 

和我在第16行的错误,说:

MySQL表示:文档#1064 - 您的SQL语法错误;检查对应于你的MySQL服务器版本正确的语法附近

'End BEGIN update users set 
LastName = LastName 
where UserID = Us' at line 16 

使用然后我会用这样的调用存储过程的手册:

call updateusers(3,'John','Jamieson','dsd','[email protected]','abac123','U') 

的输出,我会希望得到的是,例如,如果我想更新来自:

UserId FirstName LastName Password EmailAddress Salt RoleID 
3  John  Smith  abc  [email protected] 123 U 

这样:

UserId FirstName LastName Password EmailAddress  Salt RoleID 
3  John  Jamieson dsd  [email protected] abac123 U 

UserId FirstName LastName Password EmailAddress  Salt RoleID 
3  Aaron  Smith  abc  [email protected]  123  A 

回答

0

无可否认,对于MySQL的存储过程的文件从来没有得到很好的。没有足够的例子。

在你的情况,我会写这样的程序:

DELIMITER go 

CREATE PROCEDURE updateusers(
    IN inUserID tinyint, 
    IN inFirstName varchar(30), 
    IN inLastName varchar(30), 
    IN inPassword varchar(30), 
    IN inEmailAddress varchar(30), 
    IN inSalt varchar(40), 
    IN inRoleID varchar(1)) 
BEGIN 
    UPDATE users 
    SET 
    FirstName = inFirstName, 
    LastName = inLastName, 
    Password = inPassword, 
    EmailAddress = inEmailAddress, 
    Salt = inSalt, 
    RoleID = inRoleID 
    WHERE UserID = inUserID; 
END 
go 

DELIMITER ; 

变化:

  • 名称的输入参数的东西在你的表中的列名不同,否则,如果你很暧昧想要将FirstName设置为相同名称的输入参数,或者将其设置为自身(这将是无操作)。为了消除歧义,我只是使用“in”作为输入参数的前缀。
  • 您可以在一个UPDATE中更新多个列。事实上,你应该这样做,所以你只需要运行一个查询来找到要更新的行。
  • 在每个语句周围,不需要BEGIN...END,只是围绕语句块,类似于在许多编程语言中使用花括号的方式。
  • 用分号终止您的UPDATE声明。
  • 我将tinyint(11)更改为tinyint。长度参数不起任何作用。阅读我的回答Types in MySQL: BigInt(20) vs Int(20)
+0

谢谢,解决了这个问题,你是正确的MySQL存储过程的文档的例子是不是比较好的mssql。 –

+0

一般来说,我发现MySQL存储过程是不值得的麻烦。他们很难发展,而且文件很差。他们不支持包或调试。他们不编译,他们的表现很差。 MySQL用户社区中的大多数开发人员不使用过程,他们只是在其应用程序代码中编写SQL语句。 –