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 中运行它的主要内容,如果未能解决你的问题,请参考以下文章

从Pyspark UDF调用另一个自定义Python函数

使用 MySQL UDF 执行命令 - sys_exec 不起作用

MySQL 触发器在插入后检查是不是没有重复然后运行 ​​sys_exec udf

我们可以从 Hive 中的自定义 UDF 运行查询吗?

如何使用 panda_udf 对系列运行多个函数

数据流 UDF 的更新延迟