2017-02-06 1 views
1

J'essaie de créer une procédure stockée mais phpmyadmin dit que j'ai une erreur de syntaxe, mais je ne vois aucune erreur.Problème d'erreur de syntaxe MySQL lors de la création d'une procédure stockée

1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité 'Cursor CUR_ID_FORUM

EST SELECT ForumID du Forum' à la ligne 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 ; 

Mon code mis à jour:

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 ; 

et l'erreur mise à jour de phpmyadmin:

1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '' à la ligne 3

+0

L'erreur vous dit ce que c'est, elle n'aime pas la partie commençant par 'CURSOR'. Où avez-vous obtenu ce code comme suivant cette page https://msdn.microsoft.com/en-gb/library/ms180169.aspx vous devez 'DECLARE cursor CURSOR' –

Répondre

2

MISE À JOUR: Votre syntaxe est incorrecte dans de nombreux endroits. Vous devez déclarer la variable REC_ID_FORUM à utiliser pour votre curseur chercher:

DECLARE REC_ID_FORUM INTEGER // 

Vous devez utiliser la syntaxe correcte du curseur de:

DECLARE CUR_ID_FORUM CURSOR FOR SELECT ForumID FROM Forum // 

Une fois que vous déclarez votre curseur, vous devez l'ouvrir:

OPEN CUR_ID_FORUM // 

Et dans votre déclaration si vous avez besoin de récuperer du curseur dans votre LOOP:

FETCH CUR_ID_FORUM INTO REC_ID_FORUM // 

Votre syntaxe d'instruction IF est également incorrecte. Vous utilisez la fonction IF utilisée dans les instructions select MySQL, et non la condition IF utilisée dans les procédures stockées.

Voici ce que je pense que votre code entier devrait ressembler à:

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 ; 

Ceci est très bien non testé, mais devrait vous rapprocher.

+0

J'ai mis à jour mon code s'il vous plaît vérifier –

+1

I mis à jour ma réponse avec ce qui devrait être une procédure complète. Re-lire la réponse entière comme j'ai rempli quelques autres pièces manquantes. – davidethell