2017-02-06 10 views
1

ストアドプロシージャを作成しようとしていますが、phpmyadminに構文エラーがありますがエラーは表示されません。ストアドプロシージャを作成する際にMySQL構文のエラーが発生する

1064 - SQL構文に誤りがあります。ラインで「

フォーラムFROM SELECT ForumIDされるカーソルのCUR_ID_FORUM」近くで使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください3

delimiter // 
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT) 
BEGIN 
CURSOR CUR_ID_FORUM 
IS 
SELECT ForumID FROM Forum // 
IF(
    previous_role=1, 
    DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0, 
    SELECT ForumID FROM Forum 
    FOR REC_ID_FORUM IN CUR_ID_FORUM 
    LOOP 
     INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0) 
    END LOOP // 
) 
END // 
delimiter ; 

私の更新されたコード:

delimiter // 
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT) 
BEGIN 
DECLARE REC_ID_FORUM INT(11) // 
DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum // 
IF(
    previous_role=1, 
    DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0, 
    SELECT ForumID FROM Forum 
    FOR REC_ID_FORUM IN CUR_ID_FORUM 
    LOOP 
     FETCH CUR_ID_FORUM INTO REC_ID_FORUM // 
     INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0) 
    END LOOP // 
) 
END // 
delimiter ; 

とphpmyadminの更新されたエラー:

1064 - SQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい構文が行末にある ''の近くにあるようにしてください。

+0

このエラーは、それが何であるかを示しています。「CURSOR」を開始した部分が好きではありません。このページでこのコードを取得した場所https://msdn.microsoft.com/en-gb/library/ms180169.aspxカーソル名カーソルをDECLAREする必要があります –

答えて

2

更新日: あなたの構文は間違っています。あなたは、あなたがそれを開く必要があり、あなたのカーソルを宣言した後

DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum // 

:あなたは正しいカーソルの構文を使用する必要が

DECLARE REC_ID_FORUM INTEGER // 

を:あなたはフェッチカーソルに使用するREC_ID_FORUM変数を宣言する必要が

OPEN CUR_ID_FORUM // 

そして、あなたはあなたのLOOPでのカーソルからFETCHする必要があり、あなたのif文で:

FETCH CUR_ID_FORUM INTO REC_ID_FORUM // 

IF文の構文も間違っています。ストアドプロシージャで使用されるIF条件ではなく、MySQL selectステートメントで使用されるIF関数を使用しています。

delimiter // 
CREATE PROCEDURE updateForumAdmin (IN user_id INT, IN previous_role INT,IN new_role INT) 
BEGIN 
    DECLARE REC_ID_FORUM INTEGER // 
    DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum // 
    IF previous_role = 1 THEN 
     DELETE ForumManager WHERE ModuleID=3 AND ModuleEntityID=user_id AND IsDirect=0 // 
    ELSE 
     OPEN CUR_ID_FORUM // 
     LOOP 
      FETCH CUR_ID_FORUM INTO REC_ID_FORUM // 
      INSERT ForumManager (ForumID,ModuleID,ModuleEntityID,ModuleRoleID,AddedBy,IsDirect) VALUES (REC_ID_FORUM,3,user_id,11,0,0) 
     END LOOP // 
    END IF // 
END // 
delimiter ; 

これは非常にテストされていないが、近いあなたを取得する必要があります。ここでは

は、私はあなたの全体のコードは次のようになります考えるものです。

+0

コードを更新しましたかチェックしてください –

+1

私の答えは完全な手順でなければなりません。私はいくつかの欠けている他の部分を記入して、答え全体を再読んでください。 – davidethell

関連する問題