您好我已经编写了这个MySQL存储过程并且我一直收到此语法错误
#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 '@start := @start + 3600;
END WHILE;
@start = 1505469600;
' at line 42
这是我的存储过程,由于语法错误,我还没有能够运行它,所以可能有一些问题。如果您发现任何问题,如果您可以帮助我,那将非常有用。
DELIMITER ;;
CREATE PROCEDURE insert_zone_time_range_data()
BEGIN
SET @start = 1505469600, @end = 1505483940;
WHILE @start < @end DO
WHILE @start < @end DO
INSERT INTO daily_stats_zone_visitors_time_range
(
day_epoch,
day_of_week,
time_range_hours,
venue_id,
visitors,
visitors_new
)
SELECT UNIX_TIMESTAMP(FROM_UNIXTIME(ts,'%Y-%m-%d')) AS day_epoch,
FROM_UNIXTIME(ts,'%W') AS day_of_week,
FROM_UNIXTIME(@start, '%h') + '-' + FROM_UNIXTIME(@end, '%h') AS time_range_hours,
venue_id,
COUNT(DISTINCT mac) AS visitors,
COUNT(id) AS visitors_new
FROM (
SELECT probe_request.venue_id,
probe_request.mac,
macs.id,
probe_request.ts
FROM probe_request
LEFT OUTER JOIN daily_stats_venue_mac_cache AS macs
ON probe_request.mac = macs.mac
AND probe_request.venue_id = macs.venue_id
AND macs.first_seen BETWEEN @start AND @end
WHERE probe_request.ts BETWEEN @start AND @end
GROUP BY probe_request.venue_id, probe_request.mac
) AS temp
GROUP BY venue_id;
@start = @start + 3600;
END WHILE;
@start = 1505469600;
@end = @end - 3600;
END WHILE;
END;
;;
我将DELIMITER ;;
添加到我的脚本顶部,因为我在设置变量时遇到了语法错误,这似乎解决了这个问题。说实话,我不知道为什么,但这一点似乎现在有效。
如果您因为错误而感到遗憾,我没有任何结果。感谢您的帮助。非常感谢
答案 0 :(得分:4)
要将值设置为变量,您必须使用Set关键字。
这里将是
set @start = @start + 3600
答案 1 :(得分:0)
关于user-defined variables的MySQL文档说:
设置用户定义变量的一种方法是发出
SET
语句:SET @var_name = expr [, @var_name = expr] ...
您还可以在
SET
以外的语句中为用户变量赋值。在这种情况下,赋值运算符必须是:=
而不是=
,因为后者在非SET
语句中被视为比较运算符=
:mysql> SET @t1=1, @t2=2, @t3:=4; mysql> SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
该行:
@start = @start + 3600;
不是有效的MySQL语句(即使使用:=
而不是=
,它也无效)。在此上下文中为变量@start
赋值的正确方法是使用SET
语句:
SET @start = @start + 3600;
其他两项任务相同:
SET @start = 1505469600;
SET @end = @end - 3600;