Ошибка MariaDB при создании функции при работе с MySQL

Пожалуйста, рассмотрите следующее определение функции. Я создал и настроил его в 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

Я получаю следующую ошибку:

ОШИБКА 1064 (42000) в строке 1: ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, для правильного синтаксиса для использования рядом с '' в строке 8

Спасибо


person tank    schedule 21.03.2014    source источник
comment
не знаю о mariaDB .... но я сильно чувствую ошибку, потому что done будет зарезервированным ключевым словом в mariaDB для строки DECLARE done INT DEFAULT 0;   -  person NoobEditor    schedule 21.03.2014
comment
Вы выполнили это после переопределения значения для delimiter, например DELIMITER // или чего-то еще?   -  person Ravinder Reddy    schedule 21.03.2014


Ответы (1)


Mysql видит ';' разделители в функции и нарушает ваш оператор CREATE FUNCTION.

Чтобы избежать этого, измените разделитель перед определением функции, а затем измените его обратно:

Нравиться:

DELIMITER //

-- your create function definition statement here

//
DELIMITER ;

Поскольку в вашем коде первая точка с запятой ; была найдена в line 8, он пытался выполнить ее код до ';', и синтаксис был недействителен, потому что он был неполным (BEGIN без END).

person Ravinder Reddy    schedule 21.03.2014