Хранимые процедуры MySQL

0

Я прихожу из фона MS SQL Server. Работа над новым проектом с использованием MySQL с инструментами NaviCat 8 Admin. Хорошо, вот вопрос. Обычно, когда я работаю в MS, если я хочу обновить некоторые данные, я использую хранимую процедуру для этого:

Drop Procedure spNew
Create Procedure spNew (@P_Param)

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

Я пытаюсь сделать эту же логику из NaviCat. Я определил параметр (IN '@P_Param' int)

В определении i, помещенном:

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

Когда я пытаюсь сохранить хранимую процедуру, я получаю эту ошибку: "1064 - У вас есть ошибка в синтаксисе SQL, blah, blah, blah"

Может ли кто-нибудь хотя бы указать мне в правильном направлении?

Спасибо.

Теги:
stored-procedures
mysql-error-1064

2 ответа

2
Лучший ответ
CREATE PROCEDURE spNew(P_Param INT)
BEGIN
     UPDATE Table
     SET Field = 'some value'
     WHERE ID = P_Param;
END;

Обратите внимание, что синтаксис MySQL и общая идеология сильно отличаются от синтаксиса SQL Server.

Вам также может потребоваться установить разделитель:

DELIMITER $$

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

DELIMITER ;

Кстати, я предполагаю, что вы фактически не называете свою таблицу "Table", так как это зарезервированное слово.

Если вы это сделаете, вам нужно вложить его в обратные такты:

DELIMITER $$

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

DELIMITER ;
  • 0
    Я понимаю, что идеологии очень разные. Хотя по логике я смог прыгнуть и понять, что я делаю по большей части. После удаления «@» я все еще получаю синтаксическую ошибку.
  • 0
    До сих пор нет кости с разделителем. Можно ли с уверенностью сказать, что хранимые процедуры не часто используются массами в MySQL?
Показать ещё 3 комментария
0

Параметры хранимых процедур MySQL не имеют префикса @или указаны в объявлении или при использовании. Однако локальные переменные имеют префикс @.

Try:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню