【问题标题】:UDF and running it in MySqlUDF 并在 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,如错误消息所示

标签: mysql user-defined-functions


【解决方案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 ;
    

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2020-07-04
      • 2012-09-09
      相关资源
      最近更新 更多