我有下表:
id | parent_id | quantity
-------------------------
1 | null | 5
2 | null | 3
3 | 2 | 10
4 | 2 | 15
5 | 3 | 2
6 | 5 | 4
7 | 1 | 9
现在,我需要一个mysql中的存储过程,该存储过程以递归方式调用自身并返回计算出的数量。例如,id
6有5个父级,而3个父级又有2个父级。因此,我需要计算4 * 2 * 10 * 3
(= 240)作为结果。
我对存储过程还很陌生,将来我不会经常使用它们,因为我更喜欢在程序代码中而不是在数据库中使用业务逻辑。但是在这种情况下,我无法避免。
也许mysql专家(就是您)可以在几秒钟内破解一条工作语句。
其工作仅在mysql版本> = 5中
存储过程声明是这个,
您可以给它一点点改善,但是可以这样工作:
DELIMITER $$
CREATE PROCEDURE calctotal(
IN number INT,
OUT total INT
)
BEGIN
DECLARE parent_ID INT DEFAULT NULL ;
DECLARE tmptotal INT DEFAULT 0;
DECLARE tmptotal2 INT DEFAULT 0;
SELECT parentid FROM test WHERE id = number INTO parent_ID;
SELECT quantity FROM test WHERE id = number INTO tmptotal;
IF parent_ID IS NULL
THEN
SET total = tmptotal;
ELSE
CALL calctotal(parent_ID, tmptotal2);
SET total = tmptotal2 * tmptotal;
END IF;
END$$
DELIMITER ;
调用就像(设置此变量很重要):
SET @@GLOBAL.max_sp_recursion_depth = 255;
SET @@session.max_sp_recursion_depth = 255;
CALL calctotal(6, @total);
SELECT @total;
本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息
是否可以在HSQLDB中创建递归存储过程? 我编写了以下一个来更新一个记录,并递归地更新所有父记录: 但我得到了以下错误: 在HyperSQL用户指南中,我找到了一些信息(请参阅HyperSQL用户指南中的递归例程),但它似乎只支持函数。 提前感谢您的支持。
问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。
本文向大家介绍C#中调用MySQL存储过程的方法,包括了C#中调用MySQL存储过程的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中调用MySQL存储过程的方法。分享给大家供大家参考。具体如下: 这段代码演示在 C# 程序中调用 MySQL 的存储过程,没有返回值,没有参数传递。 希望本文所述对大家的C#程序设计有所帮助。
问题内容: 当我尝试从Rails调用存储过程时,出现以下异常: Rails Wiki中 有一个页面讨论用于解决此问题的MySQL适配器的修补程序,但是它已过时,似乎不再起作用。 配置代码正确地启用了存储过程,但是在存储过程调用之后连接仍然不同步并且新方法不再起作用,仍然存在问题。 关于如何使它工作的任何建议? 这是我正在使用的代码: 无论是否返回任何结果,它都会引发相同的异常。 问题答案: 将程序
主要内容:调用存储过程,调用存储函数存储过程和存储函数都是存储在服务器端的 SQL 语句集合。要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现。 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MySQL 内部函数的使用方法相同。执行存储过程和存储函数需要拥有 EXECUTE 权限(EXECUTE 权限的信息存储在 information_schema 数据库下的 USER_PRIVILEGES 表中