Pregunta

Vengo de un fondo de MS SQL Server. Trabajando en un nuevo proyecto usando MySQL con las herramientas de administración de NaviCat 8. Ok, esta es la pregunta. Normalmente cuando trabajo en MS land si quiero actualizar algunos datos, uso un procedimiento almacenado para hacer esto:

Drop Procedure spNew
Create Procedure spNew (@P_Param)

UPDATE Table
SET Field = 'some value'
WHERE ID = @P_Param

Estoy tratando de hacer esta misma lógica desde NaviCat. Definí el parámetro, (IN '@P_Param' int)

En la definición que puse:

BEGIN
     UPDATE Table
     SET Field = 'some value'
     WHERE ID = @P_Param
END;

Cuando intento guardar el procedimiento almacenado, obtengo este error: " 1064 - Tiene un error en su sintaxis SQL, bla, bla, bla "

¿Al menos alguien puede señalarme en la dirección correcta?

Gracias.

¿Fue útil?

Solución

CREATE PROCEDURE spNew(P_Param INT)
BEGIN
     UPDATE Table
     SET Field = 'some value'
     WHERE ID = P_Param;
END;

Tenga en cuenta que la sintaxis MySQL y la ideología general son muy diferentes de las de SQL Server .

También es posible que necesite establecer un delimitador:

DELIMITER $

CREATE PROCEDURE spNew(P_Param INT)
BEGIN
     UPDATE Table
     SET Field = 'some value'
     WHERE ID = P_Param;
END;
$

DELIMITER ;

Por cierto, supongo que en realidad no llama a su tabla " Table " , ya que es una palabra reservada.

Si lo hace, debe encerrarlo en backticks como este:

DELIMITER $

CREATE PROCEDURE spNew(P_Param INT)
BEGIN
     UPDATE `Table`
     SET    `Field` = 'some value'
     WHERE  `ID` = P_Param;
END;
$

DELIMITER ;

Otros consejos

Los parámetros de los procedimientos almacenados de MySQL no tienen el prefijo @ ni se citan en la declaración o cuando se usan. Sin embargo, las variables locales tienen el prefijo @.

Prueba:

DROP PROCEDURE IF EXISTS spNew;
CREATE PROCEDURE spNew(IN P_Param INT)
BEGIN
     UPDATE Table
     SET Field = 'some value'
     WHERE ID = P_Param
END;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top