我正在尝试分配@lastupd 变量。如下行:
select @lastupd := max(`last_edited_time`)
from flyspray_comments where task_id = taskID;
但是 mysql 给我错误:
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 'BEGIN
set @lastupd = 0; select @lastupd := max(
last_edited_time
) from flys' at line 2
代码:
delimiter $$
use flyspray $$
CREATE function last_upd_time(taskID INT)
BEGIN
set @lastupd = 0;
select @lastupd := max(`last_edited_time`) from flyspray_comments where task_id = taskID;
RETURN @lastupd;
END
$$
delimiter ;
最佳答案
- 您的直接错误与作业无关。这是由于函数定义无效引起的。您缺少指示函数返回类型的强制
RETURNS
子句。请参阅CREATE FUNCTION Syntax
. - 在您的情况下不需要使用变量,除非用户( session )变量。只需
RETURN
查询结果即可。 - 由于您可以使用唯一的语句,因此无需在
BEGIN ... END
block 中并更改DELIMITER
也就是说,您的函数的简化且有效的版本可能看起来像
CREATE FUNCTION last_upd_time(_task_id INT)
RETURNS DATETIME -- mandatory clause
RETURN -- just return the result of the query
(
SELECT MAX(last_edited_time)
FROM flyspray_comments
WHERE task_id = _task_id
); -- use default delimiter since it's a one-statement function
这里是SQLFiddle 演示
现在,如果您出于某种原因想使用变量,那么
- 使用本地而不是用户( session )。
- 使用
SET
或SELECT ... INTO
语法赋值。
它可能看起来像
DECLARE lastupd DATETIME DEFAULT NULL; -- or 0
SET lastupd =
(
SELECT MAX(last_edited_time)
FROM flyspray_comments
WHERE task_id = _task_id
);
或
DECLARE lastupd DATETIME DEFAULT NULL; -- 0
SELECT MAX(last_edited_time)
INTO lastupd
FROM flyspray_comments
WHERE task_id = _task_id;
关于mysql - 在 MySQL 的 SELECT 命令中分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20649818/