代码之家  ›  专栏  ›  技术社区  ›  Maciek

count函数内的MySQL调用过程

  •  0
  • Maciek  · 技术社区  · 6 年前

    是否可以在函数中使用过程?例如,我想收集与某个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变量。

    1 回复  |  直到 6 年前
        1
  •  4
  •   spencer7593    6 年前

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

    请确定 准确的 你观察到的行为。创建过程时出现错误消息?执行函数时出现错误消息?意外行为。这比告诉我们什么“不起作用”要精确得多,信息也要丰富得多。