MySQL游标-MySQL工作台中有错误



我正在尝试编写一个mysql程序,其中有游标。由于在编写DECLARE查询时出错,mysql工作台总是向我显示DECLARE在此位置无效,应为EOF、ALTER、ANALYZE、BEGIN、BINLOG、CACHE。。。

你能帮我解决这个问题吗?

这是我的代码:

DELIMITER //
BEGIN
declare Naslov_knjige VARCHAR(24);
declare Cena_knjige   DECIMAL(8,2);
DECLARE cursor_cene CURSOR
FOR SELECT 
Naslov, 
Cena
FROM 
prvi_test_v2.knjige;
OPEN cursor_cene //
FETCH NEXT FROM cursor_cene INTO 
@Naslov_knjige, 
@Cena_knjige //
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Naslov_knjige + CAST(@Cena_knjige AS VARCHAR) //
FETCH NEXT FROM cursor_cene INTO 
@Naslov_knjige, 
@Cena_knjige //
END //
CLOSE cursor_cene //
DEALLOCATE cursor_cene //
END //
DELIMITER ;

谢谢你的帮助!

我假设您省略了CREATE PROCEDURE的一行,因为在MySQL中,BEGIN。。。END块必须是存储例程的一部分。看见https://dev.mysql.com/doc/refman/8.0/en/begin-end.html

开始。。。END语法用于编写复合语句,这些语句可以出现在存储程序(存储过程和函数、触发器和事件(中。

您更改了DELIMITER:

DELIMITER //

使用此分隔符将终止整个CREATE PROCEDURE语句。您不应该在过程主体中的第一个语句之后执行此操作。您需要为过程主体中的每个语句使用普通的;终结符。更改分隔符的原因是,您可以在不结束CREATE procedure的情况下为过程中的每条语句使用;

请参阅此处的示例和文档:https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html

这就是你犯错误的原因。您使用//终止了OPEN cursor_cene //,从而结束了CREATE PROCEDURE,但显然该过程还有更多内容。

你的手术还有其他问题。您似乎在使用Microsoft SQL Server语法,但MySQL不同。

Naslov_knjige与MySQL中的@Naslov_knjige不是同一个变量。不要在局部变量前面使用@sigil。如果使用@sigil,则它指的是用户定义的变量。

WHILE @@FETCH_STATUS = 0语法特定于Microsoft SQL Server。MySQL有不同的语法来运行游标循环。请参阅文档中的示例:https://dev.mysql.com/doc/refman/8.0/en/cursors.html

这是我所能做到的。可能还有更多的问题,但我不会去寻找它们。

最新更新