MySQL 在函数内调用过程进行计数
MySQL Call procedure inside function for count
是否可以在函数内部使用过程?例如,我想收集与 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 查询并获得相同的结果,但我想知道如何在函数中使用我的过程输出变量。
是的,一个MySQLFUNCTION
可以调用一个MySQLPROCEDURE
。
但是...过程执行的操作将限于函数允许的操作。 (我们不能使用过程来解决对函数的限制。)
"is not working" 含糊不清,在调试问题时几乎毫无用处。观察到的确切行为是什么?
我怀疑显示的 SQL 语句失败了,因为没有覆盖默认语句定界符。
此外,parent(11)
不是有效的数据类型。
请注意,当 MySQL 存储程序中的 SQL 语句中的列标识符 匹配 用于参数或本地的标识符变量,MySQL 遵循关于引用哪个(列名或变量)的规则。
最佳做法是对与列名称不匹配的参数和局部变量采用命名约定,并使用 table 名称或 table 别名限定所有列引用。
就个人而言,我为参数和局部变量使用前缀(a 用于参数,l 用于局部,后跟数据类型 i 用于整数,d 用于 date/datetime,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 ;
请确定您观察到的确切行为。创建程序时出现错误消息?执行函数时出现错误消息?意外行为。这比告诉我们一些事情 "is not working".
更精确,信息更丰富
是否可以在函数内部使用过程?例如,我想收集与 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 查询并获得相同的结果,但我想知道如何在函数中使用我的过程输出变量。
是的,一个MySQLFUNCTION
可以调用一个MySQLPROCEDURE
。
但是...过程执行的操作将限于函数允许的操作。 (我们不能使用过程来解决对函数的限制。)
"is not working" 含糊不清,在调试问题时几乎毫无用处。观察到的确切行为是什么?
我怀疑显示的 SQL 语句失败了,因为没有覆盖默认语句定界符。
此外,parent(11)
不是有效的数据类型。
请注意,当 MySQL 存储程序中的 SQL 语句中的列标识符 匹配 用于参数或本地的标识符变量,MySQL 遵循关于引用哪个(列名或变量)的规则。
最佳做法是对与列名称不匹配的参数和局部变量采用命名约定,并使用 table 名称或 table 别名限定所有列引用。
就个人而言,我为参数和局部变量使用前缀(a 用于参数,l 用于局部,后跟数据类型 i 用于整数,d 用于 date/datetime,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 ;
请确定您观察到的确切行为。创建程序时出现错误消息?执行函数时出现错误消息?意外行为。这比告诉我们一些事情 "is not working".
更精确,信息更丰富