Да, MySQL FUNCTION
может вызывать MySQL PROCEDURE
.
Но ... операции, которые выполняет процедура, будут ограничены операциями, разрешенными функцией. (Мы не можем использовать процедуру, чтобы обойти ограничения, накладываемые на функцию.)
«не работает» настолько туманно расплывчато, что практически бесполезно отлаживать проблему. Какое точное поведение наблюдается?
Я подозреваю, что показанные операторы SQL не выполняются, поскольку не существует переопределения для разделителя операторов по умолчанию.
Кроме того, parent(11)
не является допустимым типом данных.
Помните, что когда идентификатор для столбца в операторе SQL в хранимой программе MySQL соответствует идентификатору, используемому для аргумента или локальной переменной, MySQL следует правилу о котором (имя столбца или переменная), на которую ссылаются.
Рекомендуется принять соглашение об именах для аргументов и локальных переменных, которые не соответствуют именам столбцов, и квалифицировать все ссылки на столбцы именем таблицы или псевдонимом таблицы.
Лично я использую префикс для аргументов и локальных переменных (a для аргумента, l для локального, затем тип данных i для целого числа, d для даты / даты и времени, n для десятичного числа, ...
DELIMITER $$
DROP PROCEDURE IF EXISTS relatives$$
CREATE PROCEDURE relatives(IN ai_parent INT(11),OUT ai_counted INT(11))
BEGIN
SELECT COUNT(*)
INTO ai_counted
FROM category c
WHERE c.related = ai_parent
;
END$$
DROP FUNCTION IF EXISTS relatives_count$$
CREATE FUNCTION relatives_count(ai_parent INT(11))
RETURNS INT(11)
BEGIN
DECLARE li_counted INT(11);
CALL relatives(ai_parent,li_counted);
RETURN li_counted;
END$$
DELIMITER ;
Пожалуйста, укажите точное поведение, которое вы наблюдаете. Сообщение об ошибке при создании процедуры? Сообщение об ошибке при выполнении функции? Неожиданное поведение. Это гораздо точнее и информативнее, чем говорить нам, что «не работает».