mysql - 在 MySQL 的 SELECT 命令中分配不起作用

标签 mysql sql function select

我正在尝试分配@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 ;

最佳答案

  1. 您的直接错误与作业无关。这是由于函数定义无效引起的。您缺少指示函数返回类型的强制 RETURNS 子句。请参阅CREATE FUNCTION Syntax .
  2. 在您的情况下不需要使用变量,除非用户( session )变量。只需 RETURN 查询结果即可。
  3. 由于您可以使用唯一的语句,因此无需在 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 演示


现在,如果您出于某种原因想使用变量,那么

  1. 使用本地而不是用户( session )。
  2. 使用 SETSELECT ... 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/

相关文章:

MySQL - 如何列出具有引用我的表主键的外键的所有表?

Access 中旧 VB.NET 项目中的 MYSQL 连接字符串

sql - MySQL 问题 - 如何处理多种类型的用户 - 一个表或多个?

postgresql - 错误: syntax error at or near "SET"

c++ - "void SomeFunction(int, void*)"是什么意思?

php - mod_rewrite 将请求发送到正确的位置,但未加载 CSS 文件?

c# - 将缺失的月份计数为零 (0) 并填充到数据表中

sql - 如何在 sql 中将浮点值转换为时间并获取其总和?

android - 基于函数调用栈优化Android App代码的方法?

c - 为什么在传递参数时使用 const 会给我一个警告?