我正在尝试编写一个简单的过程,但在第一个参数遇到语法错误。我可以告诉我正确遵循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上的选项将分隔符更改为/.
我收到语法错误“near'@id INT, @oldIndex INT....
”。我以为我可能会遇到更多的分隔符错误,因为我不完全清楚它们的范围。我相信如果这是问题,那么当它无法理解分号时,错误就会出现在程序中的新行上,而不是参数声明。
答案 0 :(得分:1)
您正在使用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;
...
具有@
sigil的MySQL变量是会话变量。
另见:
答案 1 :(得分:0)
在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