Если у меня есть ТАБЛИЦА с именем 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
@tadman Я добавил фрагмент кода.
На первый взгляд я вижу синтаксическую ошибку:
...
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.
Вместо длинных словесных объяснений Stack Overflow работает лучше, если вы можете показать небольшой фрагмент кода. Например,
SHOW CREATE TABLE
для этой минимальной схемы плюс функция, которую вы пробовали. Может быть, вы прошли 99% пути, и мы можем дать вам немного, чтобы преодолеть финишную черту. Без этого кода нам придется начинать с нуля и делать всю работу заново.