count函数内的mysql调用过程

wvmv3b1j  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(390)

是否可以在函数中使用过程?例如,我想收集与一个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查询并得到相同的结果,但我想知道如何在函数中使用procedure out变量。

olmpazwi

olmpazwi1#

是的,一个mysql FUNCTION 可以调用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 ;

请确认您观察到的确切行为。创建过程时出现错误消息?执行函数时出现错误消息?意外行为。这比告诉我们一些“行不通”的事情要精确得多,信息量也要大得多。

相关问题