2016-09-13 5 views
0

Вот простая функция, которую я создаю для практики. Но получите данную ошибку.Что не так, эта простая функция?

DELIMITER $$ 

CREATE FUNCTION Weighted_Average(n1 INT, n2 INT, n3 INT, n4 INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
    DECLARE avg INT; 
    SET avg = (n1 + n2 + n3*2 + n4*4)/8; 
    RETURN avg; 
END; 
DELIMITER $$ 

Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «n4 * 4)/8; RETURN avg; END»в строке 6

Я сравниваю его на этот пост:

MySQL CREATE FUNCTION Syntax

Кто-то с опытом, вероятно, может указать на мою ошибку, пока я не подвожу не где. Я не вижу, что не так, где ошибка просит меня посмотреть. Примечание. Я использую workbench.

+3

Я протестировал его и успешно создал эту функцию. Невозможно воспроизвести какую-либо ошибку. Я бы предположил, что вы не рассказываете нам об окружающей среде или коде. –

+1

Просто примечание: ваш второй оператор DELIMITER должен возвращать его по умолчанию ';'. –

+1

Минус инструкций разделителя, это отлично работает на SQL Fiddle: http://www.sqlfiddle.com/#!9/4adc3c. –

ответ

0

Вы уверены, что не имеете в виду следующее, главным образом нижнее его?

DROP FUNCTION IF EXISTS Weighted_Average; 
DELIMITER $$ 
CREATE FUNCTION Weighted_Average(n1 INT, n2 INT, n3 INT, n4 INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
    DECLARE avg INT; 
    SET avg = (n1 + n2 + n3*2 + n4*4)/8; 
    RETURN avg; 
END;$$ 
DELIMITER ; 

DELIMITER необходимо для некоторых на стороне клиента среды, чтобы очертить начало и конец блоков, а также изменить линии связи с прекращением для отчетности.

Поскольку DELIMITER по умолчанию имеет значение ;, мы знаем, как закончить с ним линию sql и никогда не думать об этом. До ...

Когда дело доходит до специальных блоков, как CREATE PROCEDURE, FUNCTION, EVENT, TRIGGER, там должен быть какой-то протокол для клиента и сервера, чтобы знать, где все это заканчивается.

Итак, для клиентов, таких как MySQL Workbench и т. Д., Мы используем блоки DELIMITER. Мы меняем его на что-то смешное вверху, код как обычно, и заканчиваем, как видно выше. Установка DELIMITER обратно в наш нормальный ;

Они не нужны для PHPMyAdmin. И, предположительно, не так для SqlFiddle

+0

Мне было бы лучше, если бы я знал, что такое DELIMITER, а затем что происходит, когда я беру знаки $$ и вводим их после END; – Bhail

Смежные вопросы