【问题标题】:MariaDB Error creating Function when it worked on MySQLMariaDB 在 MySQL 上工作时创建函数时出错
【发布时间】:2014-03-21 07:12:13
【问题描述】:

请考虑以下函数定义。我在 MySQL 5.1 上创建并设置了它,但在 MariaDB 5.5 中失败了

CREATE DEFINER=`root`@`127.0.0.1` FUNCTION `weighted_mean_by_kpi`(`KPIID` INT, `employee_id` INT, `date` DATE)
    RETURNS decimal(6,3)
    LANGUAGE SQL
    DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE rating_number INT DEFAULT 0;
    DECLARE rating_count INT DEFAULT 0;
    DECLARE rating_total INT DEFAULT 0;
    DECLARE weighted_total DOUBLE DEFAULT 0;

    DECLARE cur CURSOR FOR
            SELECT COUNT(rating), rating FROM employees_KPIs WHERE kpi_id = KPIID AND employee_id = employee_id AND employees_KPIs.created_at LIKE CONCAT("%",DATE_FORMAT(date,'%Y-%m'),"%") GROUP BY rating;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;
    RATING: LOOP
            FETCH cur INTO rating_count, rating_number;
            IF done = 1 THEN
                    LEAVE RATING;
            END IF;
            SET weighted_total =  weighted_total + (rating_number * rating_count);
            SET rating_total = rating_total + rating_count;
    END LOOP RATING;
    return (weighted_total/rating_total);
    #return (weighted_total);
    CLOSE cur;
END

我收到以下错误:

ERROR 1064 (42000) at line 1:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在第 8 行的 '' 附近使用正确的语法

谢谢

【问题讨论】:

  • 不知道 mariaDB....但是,我强烈地觉得有错误,因为 done 将是 mariaDB 中的保留关键字,用于行 DECLARE done INT DEFAULT 0;
  • 您是否在重新定义了 delimiter 的值后执行了此操作,例如 DELIMITER // 或其他?

标签: mysql mariadb


【解决方案1】:

Mysql 看到 ';'函数中的分隔符并破坏您的 CREATE FUNCTION 语句。

为避免这种情况,请在定义函数之前更改分隔符,然后再将其更改回来:

喜欢:

DELIMITER //

-- your create function definition statement here

//
DELIMITER ;

在您的代码中,第一个 ; 分号是在 line 8 中找到的,它尝试将代码执行到 ';',并且语法无效,因为它不完整(BEGIN 没有 @987654326 @)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-05
    • 2013-05-27
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多