UDF 并在 MySql 中运行它
Posted
技术标签:
【中文标题】UDF 并在 MySql 中运行它【英文标题】:UDF and running it in MySql 【发布时间】:2021-05-16 15:52:08 【问题描述】:我想在“日志”表上运行 UDF。但是当我运行它时,它会显示以下错误:
您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 18 行的“SELECT threeConsecutive() AS ConsecutiveNums FROM Logs”附近使用正确的语法
我创建 UDF 并运行它的代码如下:
CREATE FUNCTION threeConsecutive() returns INT
BEGIN
RETURN(
SELECT DISTINCT l3.num
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.id = l2.id -1
AND l2.id = l3.id -1
AND l1.num = l2.num
AND l2.num = l3.num
);
END
SELECT threeConsecutive() AS ConsecutiveNums FROM Logs ;
第 18 行是最后一行,如下所示:
SELECT threeConsecutive() AS ConsecutiveNums FROM Logs ;
【问题讨论】:
您使用的是 MySQL、Microsoft SQL Server、PostgreSQL 还是 Oracle 数据库?该错误表明您正在使用 MySQL,但您已标记所有四个。仅标记您正在使用的 SQL 数据库的品牌。 MySQL,如错误消息所示 【参考方案1】:在继续运行 SELECT 查询之前,您似乎没有终止 CREATE FUNCTION 语句。
如果您没有在 SELECT 之前终止任何语句,您将得到相同的错误。甚至是另一个 SELECT,例如:
SELECT NOW()
SELECT threeConsecutive() AS ConsecutiveNums FROM Logs ;
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“SELECT threeConsecutive() AS ConsecutiveNums FROM Logs”附近使用正确的语法
您应该终止 CREATE FUNCTION,并且由于函数体中包含分号,因此您需要将语句终止符更改为 DELIMIT
。阅读https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html 以获得解释。
【讨论】:
【参考方案2】:可能是您的查询返回多于一行,因此请尝试添加限制 1,并且您无法从子查询中返回结果...但您需要选择 INTO a var 并返回 var 内容:
DELIMITER //
CREATE FUNCTION threeConsecutive()
RETURNS INT
BEGIN
DECLARE select_var INT ;
SELECT DISTINCT l3.num INTO select_var
FROM Logs l1
INNER JOIN Logs l2 ON l1.id = l2.id -1 AND l1.num = l2.num
INNER JOIN Logs l3 ON l2.id = l3.id -1 AND l2.num = l3.num
LIMIT 1
RETURN select_var
END//
DELIMITER ;
为了更好的可读性,您不应使用基于逗号分隔的表名和 where 条件的旧连接语法,而应使用显式连接语法。
否则,如果您想要结果子查询,您可以直接使用:
SELECT num ConsecutiveNums
FROM (
SELECT DISTINCT l3.num INTO select_var
FROM Logs l1
INNER JOIN Logs l2 ON l1.id = l2.id -1 AND l1.num = l2.num
INNER JOIN Logs l3 ON l2.id = l3.id -1 AND l2.num = l3.num
) t ;
【讨论】:
以上是关于UDF 并在 MySql 中运行它的主要内容,如果未能解决你的问题,请参考以下文章
使用 MySQL UDF 执行命令 - sys_exec 不起作用