Сохраненная функция в MYSQL

Если у меня есть ТАБЛИЦА с именем 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

Вместо длинных словесных объяснений Stack Overflow работает лучше, если вы можете показать небольшой фрагмент кода. Например, SHOW CREATE TABLE для этой минимальной схемы плюс функция, которую вы пробовали. Может быть, вы прошли 99% пути, и мы можем дать вам немного, чтобы преодолеть финишную черту. Без этого кода нам придется начинать с нуля и делать всю работу заново.

tadman 25.10.2018 17:58

@tadman Я добавил фрагмент кода.

SHOURIE MRSS 25.10.2018 18:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
990
1

Ответы 1

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

...
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

P.S .: Я отредактировал ваш вопрос, заменив термин «определяемая пользователем функция» на «сохраненная функция». В MySQL это две разные вещи. Вы пишете сохраненная функция.

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

Я все еще получаю сообщение об ошибке, но на этот раз это КОД ОШИБКИ 1415.

SHOURIE MRSS 25.10.2018 18:39

Другие вопросы по теме