Хранимая функция в MYSQL - PullRequest
       10

Хранимая функция в MYSQL

0 голосов
/ 25 октября 2018

Если у меня есть TABLE с именем MyTable, столбцы которого содержат C1 (тип даты) и C2 (тип символа), я хочу создать хранимую функцию, которая принимает входные данные, а входные данные всегда должны принадлежать C1, а выходные данныесохраненная функция должна быть соответствующим элементом в C2.Я попытался сделать это с помощью оператора «select», за которым следует предложение «where» внутри хранимой функции, но не смог этого достичь.Есть ли другой способ выполнить эту задачу.

DELIMITER $$ 
CREATE FUNCTION `MyFunction` 
  (`Date` datetime) 
  RETURNS char(10)
BEGIN 
  DECLARE MyVariable char(10)
SELECT MyVariable = `C2`
FROM MyTable
WHERE `Date` = `C1`; RETURN MyVariable;
END$$
DELIMITER ;

Но это продолжает давать мне КОД ОШИБКИ: 1064

1 Ответ

0 голосов
/ 25 октября 2018

На первый взгляд, я вижу синтаксическую ошибку:

...
BEGIN 
  DECLARE MyVariable char(10)     <-- needs a semicolon here
  SELECT MyVariable = `C2`
  ...

Каждое утверждение в теле вашей подпрограммы должно заканчиваться точкой с запятой.См. Примеры DECLARE на этой странице руководства: https://dev.mysql.com/doc/refman/8.0/en/local-variable-scope.html

Это должно быть так:

...
BEGIN 
  DECLARE MyVariable char(10);
  SELECT MyVariable = `C2`
  ...

Ваш комментарий:

Ошибка 1415 означает "не может вернуть набор результатов ".Ваша сохраненная функция выполняет SELECT, не помещая результат в объявленную локальную переменную, используя ключевое слово INTO.

Вы пытаетесь установить значение MyVariable с помощью =, но это только сравнение.MyVariable ничего не присваивает.

Без использования INTO для присвоения переменной ваш оператор SELECT по умолчанию возвращает набор результатов.Это разрешено в хранимой процедуре, но не в хранимой функции.Хранимая функция должна возвращать одно скалярное значение, а не набор результатов.

...
BEGIN 
  DECLARE MyVariable char(10);

  SELECT `C2` INTO MyVariable
  FROM MyTable
  WHERE `Date` = `C1`;

  RETURN MyVariable;
END

PS: я отредактировал ваш вопрос, чтобы заменить термин «пользовательская функция» на «сохраненная функция».Это две разные вещи в MySQL.Вы пишете сохраненную функцию .

В MySQL они используют термин пользовательская функция (UDF) для функции, которую вы реализуете в коде C / C ++ и компилируете в сервер MySQL.Разработчики реже пишут этот тип расширения.

...