MySQL 在函数内调用过程进行计数

MySQL Call procedure inside function for count

是否可以在函数内部使用过程?例如,我想收集与 id 相关的所有行,但我也想计算行数并在 select 语句中使用它。这不起作用:

  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 查询并获得相同的结果,但我想知道如何在函数中使用我的过程输出变量。

是的,一个MySQLFUNCTION可以调用一个MySQLPROCEDURE

但是...过程执行的操作将限于函数允许的操作。 (我们不能使用过程来解决对函数的限制。)

"is not working" 含糊不清,在调试问题时几乎毫无用处。观察到的确切行为是什么?

我怀疑显示的 SQL 语句失败了,因为没有覆盖默认语句定界符。

此外,parent(11) 不是有效的数据类型。

请注意,当 MySQL 存储程序中的 SQL 语句中的列标识符 匹配 用于参数或本地的标识符变量,MySQL 遵循关于引用哪个(列名或变量)的规则。

最佳做法是对与列名称不匹配的参数和局部变量采用命名约定,并使用 table 名称或 table 别名限定所有列引用。

就个人而言,我为参数和局部变量使用前缀(a 用于参数,l 用于局部,后跟数据类型 i 用于整数,d 用于 date/datetime,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 ;

请确定您观察到的确切行为。创建程序时出现错误消息?执行函数时出现错误消息?意外行为。这比告诉我们一些事情 "is not working".

更精确,信息更丰富