Procédures stockées MySQL
-
08-07-2019 - |
Question
Je viens d'un contexte MS SQL Server. Travailler sur un nouveau projet utilisant MySQL avec les outils d’administration NaviCat 8. Ok, voici la question. Normalement, lorsque je travaille dans un pays MS, si je souhaite mettre à jour des données, j'utilise une procédure stockée pour le faire:
Drop Procedure spNew
Create Procedure spNew (@P_Param)
UPDATE Table
SET Field = 'some value'
WHERE ID = @P_Param
J'essaie de suivre la même logique depuis NaviCat.
J'ai défini le paramètre, (IN '@P_Param' int)
Dans la définition, j'ai placé:
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = @P_Param
END;
Lorsque j'essaie de sauvegarder la procédure stockée, le message d'erreur suivant s'affiche: "1064 - Vous avez une erreur dans votre syntaxe SQL: blah, blah, blah"
Quelqu'un peut-il au moins me diriger dans la bonne direction?
Merci.
La solution
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param;
END;
Notez que la syntaxe MySQL
et l'idéologie globale sont très différentes de celles de SQL Server
.
Vous devrez peut-être également définir le délimiteur:
DELIMITER $
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param;
END;
$
DELIMITER ;
BTW, je suppose que vous n'appelez pas réellement votre table "table"
, car il s'agit d'un mot réservé.
Si vous le faites, vous devez le placer entre guillemets comme ceci:
DELIMITER $
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE `Table`
SET `Field` = 'some value'
WHERE `ID` = P_Param;
END;
$
DELIMITER ;
Autres conseils
Les paramètres des procédures stockées MySQL ne portent pas le préfixe @, ni ne sont cités dans la déclaration ou lorsqu'ils sont utilisés. Les variables locales portent toutefois le préfixe @.
Essayez:
DROP PROCEDURE IF EXISTS spNew;
CREATE PROCEDURE spNew(IN P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param
END;