1064 - У вас есть синтаксическая ошибка в SQL рядом с '' - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующий код:

CREATE FUNCTION calcular_preco (id_produto INT(11), customer_group_id_informado INT(11))
RETURNS DECIMAL(15, 4)

BEGIN

    DECLARE preco_normal DECIMAL(15, 4);
    DECLARE pd_preco DECIMAL(15, 4);
    DECLARE pd_percentual INT(1);
    DECLARE pd_somar INT(1);
    DECLARE preco_promocional DECIMAL(15, 4);
    DECLARE preco_final DECIMAL(15, 4);
    
    # Preço normal
    SELECT price
    INTO preco_normal
    FROM oc_product
    WHERE product_id = id_produto;

    # Preço diferenciado
    SELECT price, percentual, somar
    INTO pd_preco, pd_percentual, pd_somar
    FROM oc_product_discount
    WHERE product_id = id_produto
    AND ((date_start = '0000-00-00' OR date_start < NOW())
    AND (date_end = '0000-00-00' OR date_end > NOW()))
    AND customer_group_id = customer_group_id_informado
    AND quantity = '1'
    ORDER BY priority ASC
    LIMIT 1;

    # Se este produto tiver preço diferenciado, deverá ser feito o cálculo do preço final
    SELECT IF(pd_preco IS NOT NULL, IF(pd_percentual, IF(pd_somar, preco_normal + ((preco_normal * pd_preco)/100), preco_normal - ((preco_normal * pd_preco)/100)), pd_preco), NULL) AS preco_diferenciado
    INTO pd_preco;

    # Preço promocional
    SELECT price
    INTO preco_promocional
    FROM oc_product_special
    WHERE product_id = id_produto
    AND customer_group_id = customer_group_id_informado
    AND ((date_start = '0000-00-00' OR date_start < NOW())
    AND (date_end = '0000-00-00' OR date_end > NOW()))
    ORDER BY priority ASC
    LIMIT 1;

    SELECT CASE
        WHEN preco_promocional IS NULL AND pd_preco IS NULL THEN preco_normal
        WHEN preco_promocional IS NOT NULL AND pd_preco IS NULL THEN preco_promocional
        WHEN preco_promocional IS NULL AND pd_preco IS NOT NULL THEN pd_preco
        WHEN preco_promocional < pd_preco THEN preco_promocional
        ELSE pd_preco
    END
    INTO preco_final;
    
    RETURN preco_final;
END;

При выполнении этого запроса в моей базе данных отображается ошибка:

1064 - у вас есть синтаксическая ошибка в SQL рядом с '' в строке 6

Строка 6:

DECLARE preco_normal DECIMAL(15, 4);

Судя по документации, в этой строке нет ничего плохого. Вы знали, что это за ошибка?

Моя версия: 10.4.11-MariaDB.

1 Ответ

1 голос
/ 22 июня 2020

По этой ссылке вы можете увидеть причину, по которой запрос не работает.

Предполагая, что вы пытаетесь запросить это:

CREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC
BEGIN
 DECLARE x TINYINT;
 SET x = 42;
 RETURN x;
END; 

Эта ошибка происходит:

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

Разрешение для этого - добавление разделителей следующим образом:

DELIMITER //

CREATE FUNCTION FortyTwo() RETURNS TINYINT DETERMINISTIC
BEGIN
  DECLARE x TINYINT;
  SET x = 42;
  RETURN x;
END 

//

DELIMITER ;

То же самое. Вам необходимо добавить разделители.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...