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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top