MySQL Stored Procedures
-
08-07-2019 - |
Domanda
Vengo da un background di MS SQL Server. Lavorare su un nuovo progetto usando MySQL con gli strumenti di amministrazione di NaviCat 8. Ok, ecco la domanda. Normalmente quando lavoro in MS Land se voglio aggiornare alcuni dati uso una procedura memorizzata per fare questo:
Drop Procedure spNew
Create Procedure spNew (@P_Param)
UPDATE Table
SET Field = 'some value'
WHERE ID = @P_Param
Sto provando a fare questa stessa logica da NaviCat.
Ho definito il parametro (IN '@P_Param' int)
Nella definizione che ho inserito:
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = @P_Param
END;
Quando provo a salvare la procedura memorizzata, visualizzo questo errore: " 1064 - Hai un errore nella sintassi SQL, blah, blah, blah "
Qualcuno può almeno indicarmi la giusta direzione?
Grazie.
Soluzione
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param;
END;
Nota che la sintassi MySQL
e l'ideologia generale sono molto diverse da quelle di SQL Server
.
Potrebbe anche essere necessario impostare il delimitatore:
DELIMITER $
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param;
END;
$
DELIMITER ;
A proposito, presumo che in realtà non chiami la tua tabella " Table "
, poiché è una parola riservata.
In tal caso, è necessario racchiuderlo in backtick in questo modo:
DELIMITER $
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
UPDATE `Table`
SET `Field` = 'some value'
WHERE `ID` = P_Param;
END;
$
DELIMITER ;
Altri suggerimenti
I parametri delle stored procedure MySQL non sono preceduti da @ o citati nella dichiarazione o quando utilizzati. Le variabili locali sono precedute da @, tuttavia.
Prova:
DROP PROCEDURE IF EXISTS spNew;
CREATE PROCEDURE spNew(IN P_Param INT)
BEGIN
UPDATE Table
SET Field = 'some value'
WHERE ID = P_Param
END;