Синтаксическая ошибка MySql в параметре процедуры

Я пытаюсь написать простую процедуру, но сталкиваюсь с синтаксической ошибкой в ​​первом параметре. Насколько я могу судить, я следую синтаксису CREATE PROCEDURE правильно.

Я ограничен доступом к моей базе данных с помощью phpMyAdmin. Вот сценарий создания, который я пытаюсь запустить:

DROP PROCEDURE IF EXISTS product_index_swap/
CREATE PROCEDURE product_index_swap (@id INT, @oldIndex INT, @newIndex INT)
BEGIN
    DECLARE @swapID;
    SET @swapID = (SELECT `id` FROM `product` WHERE `order_index` = @newIndex LIMIT 1);
    UPDATE `products` SET `order_index` = (CASE WHEN `id` = @id THEN @newIndex
                                                WHEN `id` = @swapID THEN @oldIndex END)
    WHERE `id` IN (@id, @swapID);
END

Я использую опцию в phpMyAdmin, чтобы изменить разделитель на /.

Я получаю синтаксическую ошибку «рядом с '@id INT, @oldIndex INT....». Я думал, что могу столкнуться с большим количеством ошибок разделителей, так как я не совсем понимаю их масштабы. Я считаю, что если бы это было проблемой, ошибка была бы на новой строке в процедуре, когда она не могла понять точку с запятой, а не в объявлении параметров.


person Fr33dan    schedule 08.12.2017    source источник
comment
Просто удалите @.   -  person Paul Spiegel    schedule 08.12.2017


Ответы (2)


Вы используете соглашение Microsoft SQL Server о размещении @ перед всеми параметрами и локальными переменными. MySQL этого не делает.

В синтаксисе MySQL параметры процедуры не имеют сигила.

Также параметры обычно объявляются IN, OUT или INOUT.

CREATE PROCEDURE product_index_swap (IN id INT, IN oldIndex INT, IN newIndex INT)
BEGIN
    DECLARE swapID;
    ...

Переменные MySQL, имеющие сигил @, являются сеансовыми переменными.

Смотрите также:

person Bill Karwin    schedule 08.12.2017

В MySQL переменные @var являются переменными уровня сеанса.

Используйте обычные переменные без @ и убедитесь, что у вас нет конфликта с именами столбцов:

CREATE PROCEDURE product_index_swap (in_id INT, in_oldIndex INT, in_newIndex INT)
BEGIN
    DECLARE v_swapID int;

    SELECT id into v_swapID
    FROM product 
    WHERE order_index = in_newIndex 
    LIMIT 1;

    UPDATE products
    SET order_index = CASE WHEN id = in_id THEN in_newIndex
                           WHEN id = v_swapID THEN in_oldIndex 
                      END
    WHERE id IN (in_id, v_swapID);
END
person slaakso    schedule 08.12.2017