Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于计数的函数内的MySQL调用过程_Mysql_Stored Procedures_Stored Functions - Fatal编程技术网

用于计数的函数内的MySQL调用过程

用于计数的函数内的MySQL调用过程,mysql,stored-procedures,stored-functions,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);

是否可以在函数内部使用过程?例如,我希望收集与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变量

是的,MySQL
函数可以调用MySQL
过程

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

“不起作用”是如此模糊,以至于在调试问题时实际上毫无用处。观察到的确切行为是什么

我怀疑显示的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 ;


请确定您观察到的确切行为。创建过程时的错误消息?执行函数时的错误消息?意外行为。这比告诉我们“不工作”要准确得多。是的,MySQL
函数可以调用MySQL
过程

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

“不起作用”是如此模糊,以至于在调试问题时实际上毫无用处。观察到的确切行为是什么

我怀疑显示的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 ;


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

现在非常有用。感谢您提供的所有精彩信息。可以在函数中计算调用过程的结果吗?@MaciekSemik:我不知道您在问什么。我们可以将过程中的结果集传回函数吗?这样函数就可以处理结果集了?我想我们不能从pro中传递结果集以函数可以访问的方式返回函数。在本例中,查询返回的计数被分配给过程的OUT参数
,并被分配到ai_counted
,它被存储在函数中的局部变量li_counted中……我认为这是显而易见的,所以这可能不是您要问的问题。I“我不确定问题是什么。现在非常有用。感谢您提供的所有精彩信息。可以在函数中计算调用过程的结果吗?@MaciekSemik:我不确定您在问什么。我们可以将过程的结果集传回函数吗?这样函数就可以处理结果集了?我认为我们不能将过程中的结果集以函数可以访问的方式返回给函数。在本例中,查询返回的计数被分配给过程的OUT参数
,并被分配到ai_counted
,这将被存储在函数中的局部变量li_counted中……我认为这是显而易见的,因此这是可能的你不是在问什么。我不确定问题是什么。