我正在尝试编写一个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
这是我所能做到的。可能还有更多的问题,但我不会去寻找它们。