gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:44:29 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于MySQL 在函数内部调用过程进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50108479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com