NutzCN Logo
问答 mysql存储过程中使用变量碰到问题了!
发布于 2214天前 作者 忧郁深蓝 1871 次浏览 复制 上一个帖子 下一个帖子
标签:
DROP PROCEDURE if EXISTS test;
delimiter $$
CREATE PROCEDURE test()
	BEGIN
		set @startTime = CURRENT_TIMESTAMP;
		select @diff = TIMESTAMPDIFF(MINUTE ,end_time,CURRENT_TIMESTAMP) from table_name order by end_time desc limit 1;
		set @endTime;
		IF @diff>10 THEN
			@endTime = DATE_SUB(@startTime,INTERVAL @diff MINUTE);
		ELSE
			@endTime = DATE_SUB(@startTime,INTERVAL 10 MINUTE);
		END IF;
		select concat('startTime is ', @startTime),concat('endTime is ', @endTime);
	END
delimiter ;

求大神指点一下,这个存储过程有什么问题呀,一直编译不过去,错误信息如下:

[Err] 1064 - 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 ';
		IF @diff>10 THEN
			@endTime = DATE_SUB(@startTime,INTERVAL @diff MINUTE);' at line 5

table_name的建表语句
CREATE TABLE table_name(
id BIGINT(64) AUTO_INCREMENT,
start_time TIMESTAMP NULL DEFAULT NULL COMMENT '开始查询时间',
end_time TIMESTAMP NULL DEFAULT NULL COMMENT '结束查询时间',
create_time TIMESTAMP NULL DEFAULT NULL COMMENT '创建时间',
update_time TIMESTAMP NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8;

4 回复

忘记说明业务了,这个业务是个定时任务,需要对某一张表的数据进行统计,然后更新到另外一张表内,因为数据忒多了,就没想用程序实现,想写个存储过程放到数据库去执行...结果开始就碰到问题....其中table_name这个表是记录上一次的执行时间,做为下一次执行的依据.

select @diff = TIMESTAMPDIFF(MINUTE ,end_time,CURRENT_TIMESTAMP) from table_name order by end_time desc limit 1;
		set @endTime;
		IF @diff>10 THEN
			@endTime = DATE_SUB(@startTime,INTERVAL @diff MINUTE);
		ELSE
			@endTime = DATE_SUB(@startTime,INTERVAL 10 MINUTE);
		END IF;

这一段是判断上次执行是否成功,如果上一次执行未成功,则这次执行一并连上次的一起.更新成功后,会把startTime和endTime插入到table_name这个表内.中间执行错误,会让数据库的事物进行回滚!

这是在mysql的console执行创建??

在mysql里 我用的是navicat for mysql

我找到问题了,因为有个变量没有直接赋值,并且没有指定类型.

添加回复
请先登陆
回到顶部