2016-08-23 4 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構文に誤りがあります。

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

出力つまり私はになります。私はこのような呼び出しストアドプロシージャを使用しているだろうその後

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

近くで使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してくださいこれに

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を同じ名前の入力パラメータに設定するか、それ自体に設定します(これはno-opになります)。あいまいさを取り除くために、入力パラメータの接頭辞として "in"を使用しました。

  • UPDATEで複数の列を更新できます。実際には、これを行う必要があるため、更新する行を見つけるために1つのクエリを実行するだけです。
  • 多くのプログラミング言語で中括弧を使用するのと同様に、すべてのステートメントのまわりで文のブロックのまわりでBEGIN...ENDは必要ありません。
  • UPDATEステートメントをセミコロンで終了します。
  • tinyint(11)を単にtinyintに変更しました。 length引数は何もしません。 Types in MySQL: BigInt(20) vs Int(20)
+0

この問題を解決していただきありがとうございます.Microsoft SQL Serverのストアドプロシージャは、mssqlに比べて適切ではありません。 –

+0

一般的に、私はMySQLストアドプロシージャが問題のない価値があると感じています。彼らは開発が難しく、ドキュメンテーションは貧弱です。パッケージやデバッグはサポートしていません。彼らはコンパイルせず、そのパフォーマンスは悪いです。 MySQLユーザーコミュニティのほとんどの開発者は、プロシージャを使用せず、SQL文をアプリケーションコードに記述するだけです。 –

関連する問題