CREATE FUNCTION работает на локальном компьютере, не работает на сервере - та же версия MySQL - PullRequest
0 голосов
/ 21 декабря 2018

У меня странный вопрос: у меня есть MySQL v5.7.24 на моей локальной машине и мой сервер.Следующий код хорошо выполняется локально:

DROP FUNCTION IF EXISTS SharingRatio;

CREATE FUNCTION SharingRatio(users int, sharer int, cabins int, outdoors int) RETURNS DECIMAL(6,2)
    DETERMINISTIC
    READS SQL DATA
BEGIN
    DECLARE ratio DECIMAL(6,2);

    IF cabins IS NULL THEN
     SET cabins = 0;
    END IF;

    IF sharer IS NULL THEN
     SET sharer = 1;
    END IF;

    IF users IS NULL THEN
     SET users = 1;
    END IF;

    SELECT  IF(sharer = 1, telco1, IF(sharer = 2, telco2, IF(sharer = 3, telco3, IF(sharer =4, telco4, IF(sharer = 5, telco5, null)))))
    FROM rates r WHERE (r.type='Utility' and r.cabin = cabins and if(outdoors IS NULL, true, r.outdoor = outdoors) and r.users = users) LIMIT 1 INTO ratio;

    IF ratio IS NULL THEN
       SET ratio = ROUND(100 / users, 2) ;
    END IF;

 RETURN (ratio);
END;


DROP FUNCTION IF EXISTS SharingValue;

CREATE FUNCTION SharingValue(value decimal(10,2), users int, sharer int, cabins int, outdoors int) RETURNS DECIMAL(10,2)
    DETERMINISTIC
    READS SQL DATA
BEGIN
    DECLARE ratio DECIMAL(6,2);

    IF value IS NULL THEN
       RETURN NULL;
    END IF;

    IF cabins IS NULL THEN
     SET cabins = 0;
    END IF;

    IF sharer IS NULL THEN
     SET sharer = 1;
    END IF;

    IF users IS NULL THEN
     SET users = 1;
    END IF;

    SET ratio = SharingRatio(users, sharer, cabins, outdoors);

 RETURN CAST(value * (ratio / 100) AS DECIMAL(10,2));
END;

Однако, когда я развертываю через MySQLAdmin с правами доступа root, я получаю печально известный # 1064 ошибка с сообщением об ошибке в строке 5 рядом с '' .

Я просмотрел ряд других сообщений, без висячих запятых, без ИСПОЛЬЗОВАНИЯ в случае возникновения проблем.Честно говоря, я застрял!

1 Ответ

0 голосов
/ 21 декабря 2018

Решено!

Проблема с тегом-разделителем.Правильный код:

DROP FUNCTION IF EXISTS SharingRatio;
DELIMITER $$
CREATE FUNCTION SharingRatio(users int, sharer int, cabins int, outdoors int)

RETURNS DECIMAL(6,2)
DETERMINISTIC READS SQL DATA

BEGIN
    DECLARE ratio DECIMAL(6,2);

    IF cabins IS NULL THEN
     SET cabins = 0;
    END IF;

    IF sharer IS NULL THEN
     SET sharer = 1;
    END IF;

    IF users IS NULL THEN
     SET users = 1;
    END IF;

    SELECT  IF(sharer = 1, telco1, IF(sharer = 2, telco2, IF(sharer = 3, telco3, IF(sharer =4, telco4, IF(sharer = 5, telco5, null)))))
    FROM rates r WHERE (r.type='Utility' and r.cabin = cabins and if(outdoors IS NULL, true, r.outdoor = outdoors) and r.users = users) LIMIT 1 INTO ratio;

    IF ratio IS NULL THEN
       SET ratio = ROUND(100 / users, 2);
    END IF;

 RETURN (ratio);
END$$

DELIMITER ;

DROP FUNCTION IF EXISTS SharingValue;

DELIMITER $$

CREATE FUNCTION SharingValue(value decimal(10,2), users int, sharer int, cabins int, outdoors int)

RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA

BEGIN
    DECLARE ratio DECIMAL(6,2);

    IF value IS NULL THEN
       RETURN NULL;
    END IF;

    IF cabins IS NULL THEN
     SET cabins = 0;
    END IF;

    IF sharer IS NULL THEN
     SET sharer = 1;
    END IF;

    IF users IS NULL THEN
     SET users = 1;
    END IF;

    SET ratio = SharingRatio(users, sharer, cabins, outdoors);

 RETURN CAST(value * (ratio / 100) AS DECIMAL(10,2));
END$$
DELIMITER ;
...