MariaDB Error saat membuat Fungsi saat bekerja di MySQL

Silakan pertimbangkan definisi fungsi berikut. Saya membuat dan mengaturnya di MySQL 5.1 tetapi gagal di 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

Saya mendapatkan kesalahan berikut:

ERROR 1064 (42000) pada baris 1: Anda mengalami kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MariaDB Anda untuk sintaks yang tepat untuk digunakan di dekat '' pada baris 8

Terima kasih


person tank    schedule 21.03.2014    source sumber
comment
tidak mengetahui mariaDB....tapi, saya sangat merasa ada kesalahan karena done akan menjadi kata kunci yang dicadangkan di mariaDB untuk baris DECLARE done INT DEFAULT 0;   -  person NoobEditor    schedule 21.03.2014
comment
Apakah Anda menjalankan ini setelah mendefinisikan ulang nilai pembatas, seperti DELIMITER // atau yang lainnya?   -  person Ravinder Reddy    schedule 21.03.2014


Jawaban (1)


Mysql melihat ';' pembatas dalam fungsi dan merusak pernyataan CREATE FUNCTION Anda.

Untuk menghindari hal ini, ubah pembatas sebelum Anda menentukan fungsi, lalu ubah kembali setelahnya:

Menyukai:

DELIMITER //

-- your create function definition statement here

//
DELIMITER ;

Seperti dalam kode Anda, titik koma ; pertama ditemukan di line 8, ia mencoba mengeksekusi kode tersebut hingga ';', dan sintaksnya tidak valid karena tidak lengkap (BEGIN tanpa END).

person Ravinder Reddy    schedule 21.03.2014