Процедура вызова MySQL внутри функции для подсчета - PullRequest
0 голосов
/ 01 мая 2018

Можно ли использовать процедуру внутри функции? Например, я хотел бы собрать все свои строки, связанные с идентификатором, но я также хотел бы подсчитать строки и использовать их в операторе выбора. Это не работает:

  drop procedure if exists relatives;
   create procedure relatives(in parent int(11),out counted int(11))
   begin
    set counted=(select count(*) from category where related=parent);
   end;
   drop function if exists relatives_count;
   create function relatives_count(parent parent(11)) returns int(11)
   begin
    declare count int(11);
    call relatives(parent,counted);
    return counted;
   end;

Так что я могу использовать счет

select relatives_count(id) from category

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

1 Ответ

0 голосов
/ 01 мая 2018

Да, 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 ;

Пожалуйста, укажите точное поведение, которое вы наблюдаете. Сообщение об ошибке при создании процедуры? Сообщение об ошибке при выполнении функции? Неожиданное поведение. Это гораздо точнее и информативнее, чем говорить нам, что «не работает».

...