2016-08-23 14 views
1

ich einige Probleme mit mysql updateusers mit gespeicherten Prozedur, die wie folgt aussehen:mysql mehrere gespeicherte Prozedur Update

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 ; 

und ich habe einen Fehler in Zeile 16, der sagt:

MySQL sagte : Documentation # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in der Bedienungsanleitung für die richtige Syntax zu Ihrem MySQL-Server-Version entspricht in der Nähe von

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

verwenden Dann würde ich den Anruf gespeicherte Prozedur wie folgt verwendet:

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

Die Ausgabe, die ich würde wie ist zum Beispiel bekommen, wenn ich von aktualisierenden:

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

dazu:

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

oder

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

Antwort

0

Zwar hat die Dokumentation für MySQL gespeicherte Prozeduren nie sehr gut gewesen. Es gibt nicht genug Beispiele.

In Ihrem Fall würde ich das Verfahren wie folgt schreiben:

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 ; 

Änderungen:

  • Benennen Sie Ihre Eingabe etwas verschieden von den Spaltennamen in der Tabelle Parameter, ansonsten ist es nicht eindeutig, wenn Sie möchte FirstName auf den Eingabeparameter mit dem gleichen Namen oder auf sich selbst setzen (was ein No-Op wäre). Um die Mehrdeutigkeit zu entfernen, habe ich einfach "in" als Präfix für die Eingabeparameter verwendet.
  • Sie können mehr als eine Spalte in einem einzigen UPDATE aktualisieren. Eigentlich sollten Sie dies tun, also müssen Sie nur eine Abfrage ausführen, um die Zeile zu finden, die aktualisiert werden soll.
  • Sie brauchen keine BEGIN...END um jede Anweisung, nur um Blöcke von Anweisungen, ähnlich wie Sie geschweifte Klammern in vielen Programmiersprachen verwenden.
  • Beenden Sie Ihre UPDATE Anweisung mit einem Semikolon.
  • Ich änderte tinyint(11) zu einfach tinyint. Das length-Argument macht nichts. Lies meine Antwort auf Types in MySQL: BigInt(20) vs Int(20)
+0

Vielen Dank, dass das Problem löst und Sie Recht haben die mysql gespeicherten Prozeduren für Dokumentationsbeispiele sind nicht gut im Vergleich zu mssql. –

+0

Im Allgemeinen finde ich, dass gespeicherte MySQL-Prozeduren den Aufwand nicht wert sind. Sie sind schwer zu entwickeln und die Dokumentation ist schlecht. Sie unterstützen keine Pakete oder Debugging. Sie kompilieren nicht, und ihre Leistung ist schlecht. Die meisten Entwickler in der MySQL-Benutzergemeinschaft verwenden keine Prozeduren, sie schreiben nur SQL-Anweisungen in ihren Anwendungscode. –

Verwandte Themen