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

Mat*_*mik 3 mysql stored-procedures stored-functions

是否可以在函数内部使用过程?例如,我想收集与 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;
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用计数

select relatives_count(id) from category
Run Code Online (Sandbox Code Playgroud)

这只是出于好奇的目的。它可能看起来毫无意义,因为我只能调用单个选择查询并获得相同的结果,但我想知道如何在函数中使用我的过程输出变量。

spe*_*593 6

是的,MySQLFUNCTION可以调用 MySQL PROCEDURE

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

“不工作”是如此模糊,以至于在调试问题时几乎毫无用处。观察到的具体行为是什么?

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

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

请注意,当 MySQL 存储程序的 SQL 语句中列的标识符与用于参数或局部变量的标识符匹配时,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 ;
Run Code Online (Sandbox Code Playgroud)

请指出您观察到的确切行为。创建过程时出现错误消息?执行函数时出现错误消息?意外的行为。这比告诉我们某些东西“不起作用”更准确、信息更丰富。