MySQL调用程序里面的函数用于计数

时间:2018-04-30 21:29:20

标签: mysql stored-procedures stored-functions

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

 FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .show(new FragmentIncomingNotification())
                    .commit();

这样我就可以使用计数

  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;

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

1 个答案:

答案 0 :(得分:2)

是的,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 ;

请确定您观察到的完全行为。创建过程时出现错误消息?执行功能时出现错误信息?意外的行为。这比告诉我们某些东西更加精确和有益,并且不能正常工作"。