Хранимая функция возвращает NULL Mysql - PullRequest
0 голосов
/ 28 июня 2018

я делаю эту простую STORED FUNCTION в MySql, которая возвращает электронные письма, разделенные запятой:

CREATE FUNCTION get_participantes (id INT) RETURNS VARCHAR(50)
BEGIN
 DECLARE par VARCHAR(50) DEFAULT "";
 (select GROUP_CONCAT(mail SEPARATOR ',') INTO @par from users where id IN (
select user_id from meeting_participants where meeting_id = id));
 RETURN @par;
END

Но когда я звоню с помощью SELECT, я получаю NULL каждый раз. Предложение SQL работает отлично, но само по себе.

+----------------------+
| get_participantes(5) |
+----------------------+
| NULL                 |
+----------------------+

Пожалуйста, помогите

1 Ответ

0 голосов
/ 28 июня 2018

Имя вашего параметра функции - id, но у вас также есть столбец id в вашей таблице пользователей, и, возможно, в вашей таблице meeting_participants также есть столбец id.

Это создает двусмысленность. Выражение не знает, имеете ли вы в виду столбец id или параметр функции id.

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

CREATE FUNCTION get_participantes (_id INT) RETURNS VARCHAR(50)
READS SQL DATA
BEGIN
 DECLARE par VARCHAR(50) DEFAULT "";
 (select GROUP_CONCAT(mail SEPARATOR ',') INTO par from users where id IN (
select user_id from meeting_participants where meeting_id = _id));
 RETURN par;
END

Пара других вопросов, о которых вам следует знать, даже если они не связаны с вашим вопросом:

  1. В подпрограммах MySQL (в отличие от SQL Server, например) ваша локальная переменная par отличается от переменной сеанса @var. Ваш код в этом конкретном случае будет работать, но, возможно, некоторые другие функции, которые вы пишете, будут сбиты с толку. Смотрите также мой ответ на символ "@" в хранимой процедуре?

  2. Вы должны добавить к своей функции пункт READS SQL DATA, иначе вы можете получить эту ошибку (как я делал, когда проверял вашу функцию):

ОШИБКА 1418 (HY000): эта функция не имеет DETERMINISTIC, NO SQL или READS SQL DATA в своем объявлении, и двоичное ведение журнала включено (вы можете захотите использовать менее безопасную переменную log_bin_trust_function_creators)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...