簡體   English   中英

mysql多個存儲過程更新

[英]mysql multiple stored procedure update

我遇到了一些mysql updateusers存儲過程的問題,如下所示:

 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','jamie@gmail.com','abac123','U')

我希望獲得的輸出是,例如,如果我想從以下更新:

 UserId  FirstName  LastName  Password  EmailAddress    Salt  RoleID
 3       John       Smith     abc       john@gmail.com  123   U

對此:

 UserId  FirstName  LastName  Password  EmailAddress       Salt    RoleID
 3       John       Jamieson    dsd       jamie@gmail.com  abac123   U

要么

UserId  FirstName  LastName  Password  EmailAddress       Salt    RoleID
 3       Aaron     Smith     abc       john@gmail.com     123     A

不可否認,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 長度參數不起作用。 閱讀我對MySQL中的類型的回答:BigInt(20)vs Int(20)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM