MySQL的存储过程declare语句报错

Explorer8 2017-02-06 02:08:11
CREATE PROCEDURE curdemo()
begin
declare var_id varchar(32);
declare var_number varchar(32);
DECLARE var_model VARCHAR(32);
declare rs cursor for select id,number from t_device_lending;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
open rs;
fetch next from rs into var_id,var_number;
REPEAT
IF NOT Done THEN
select model_number into var_model from t_device_info where number = var_number;
update t_device_lending_copy set model_number = var_model where id = var_id;
END IF;
FETCH NEXT FROM rs INTO id,number;

UNTIL Done END REPEAT;
/* 关闭游标 */
CLOSE rs;

end



报的错是“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare var_id varchar(32)' at line 3”. 我对了一下5.7.10的官方手册。declare的语法应该是正确的,怎么会报这种错?求大神解释。
...全文
5465 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄昏下的铁塔 2018-08-01
  • 打赏
  • 举报
回复
mysql> DELIMITER //
mysql> CREATE PROCEDURE add_id(out count INT)
-> BEGIM
-> DECLARE @itmp INT;
-> DECLARE cur_id CURSOR FOR SELECT id FORM sch;
-> DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id;
->
-> SELECT count_sch() INTO count;
->
-> SET @sum=0;
-> OPEN cur_id;
-> REPEAT
-> FETCH cur_id INTO itmp;
-> IF itmp<10
-> THEN SET @sum=@sum+itmp;
-> END IF;
-> UNTIL 0 END REPEAT;
-> CLOSE cur_id;
-> END
-> //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'DECLA
RE @itmp INT;
DECLARE cur_id CURSOR FOR SELECT id FORM sch;
DECLARE EXI' at line 3

我这样子写了,为啥还是有错,难受,找不出问题?
chxf0914 2018-05-21
  • 打赏
  • 举报
回复
最前面挤加上 delimiter ;; 结尾加上 ;; delimiter ;
Explorer8 2017-02-09
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
delimiter // CREATE PROCEDURE curdemo() begin declare var_id varchar(32); declare var_number varchar(32); DECLARE var_model VARCHAR(32); declare rs cursor for select id,number from t_device_lending; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1; open rs; fetch next from rs into var_id,var_number; REPEAT IF NOT Done THEN select model_number into var_model from t_device_info where number = var_number; update t_device_lending_copy set model_number = var_model where id = var_id; END IF; FETCH NEXT FROM rs INTO id,number; UNTIL Done END REPEAT; /* 关闭游标 */ CLOSE rs; end //
原来要加delimiter,mysql才能识别整个创建存储过程的语句,这个跟Sql Server不一样,长见识了,感谢
zjcxc 2017-02-08
  • 打赏
  • 举报
回复
不过到现在都没太明白,为什么 mysql 工具一定要个 delimiter 语法上是不需要 delimiter 就可以判断得出语句分割的,程序用 ODBC 提交多语句的时候,这种东东就完全没有问题的,所以应该客户端工具稍微改进一下就可以不要 delimiter 了吧
use xx;
drop procedure if exists p;
create procedure p()
begin
select 1;
select 2;
end;
call p;
drop procedure if exists p;
ACMAIN_CHM 2017-02-06
  • 打赏
  • 举报
回复
delimiter // CREATE PROCEDURE curdemo() begin declare var_id varchar(32); declare var_number varchar(32); DECLARE var_model VARCHAR(32); declare rs cursor for select id,number from t_device_lending; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1; open rs; fetch next from rs into var_id,var_number; REPEAT IF NOT Done THEN select model_number into var_model from t_device_info where number = var_number; update t_device_lending_copy set model_number = var_model where id = var_id; END IF; FETCH NEXT FROM rs INTO id,number; UNTIL Done END REPEAT; /* 关闭游标 */ CLOSE rs; end //

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧