2016-08-23 103 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語句。 –