Проблема с созданием функции в MySQL

#mysql #sql-server

#mysql #sql-server

Вопрос:

Я привык работать в MS SQL Server, поэтому MySQL всегда немного чужд мне. Я написал следующее для MS SQL Server, и я пытаюсь перенести его в MySQL:

 CREATE FUNCTION ToRadians
(@Degrees float)
RETURNS float
AS
BEGIN
  DECLARE @Radians float
  SELECT @Radians  = @Degrees * 3.1415927 / 180
  RETURN @Radians
END
GO
  

У меня

 CREATE FUNCTION ToRadians
(@Degrees float)
RETURNS float
BEGIN
  DECLARE @Radians float;
  SELECT @Radians  = @Degrees * 3.1415927 / 180;
  RETURN @Radians;
END
  

но в phpMyAdmin это выдает ошибку:

 Error

SQL query:

CREATE FUNCTION ToRadians(
@Degrees float
) RETURNS float AS BEGIN DECLARE@Radians float;

MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@Degrees float)
RETURNS float
AS
BEGIN
DECLARE @Radians float' at line 2 
  

Выполненный мной поиск показывает, что приведенный выше UDF MySQL должен быть правильным, но это, очевидно, не так. SELECT version() возвращает 5.0.77

Ответ №1:

 CREATE FUNCTION ToRadians (in_degrees FLOAT) RETURNS FLOAT
DETERMINISTIC
BEGIN
    RETURN in_degrees * 3.1415927 / 180;    
END;    
  

ДЕТЕРМИНИРОВАННЫЙ, потому что возвращаемое значение в градусах всегда должно быть одинаковым в радианах.

Также функции DEGREES() и RADIANS() уже существуют в mysql. RADIANS()

Комментарии:

1. Я не знал, что эта функция существует. Необычно.

Ответ №2:

  1. Не используйте @ в именах переменных MySQL, это создает локальную переменную сеанса.
  2. Вероятно, вам нужно заменить стандартный разделитель, который является точкой с запятой, на другой символ, например // : DELIMITER // перед определением вашей функции, затем // сразу после функции, затем переключите разделитель обратно на точку с запятой ( DELIMITER ; )

Комментарии:

1. Кроме того, оказывается, я не могу использовать SELECT для выполнения математики внутри функции. Я должен был использовать SET Radians = Degrees * 3.1415927 / 180;

2. Вы также могли бы сделать SELECT ... INTO [variable]