เกิดข้อผิดพลาด 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 // หรืออย่างอื่นหรือไม่   -  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