我有一个sp来基于while条件递归运行。但是,虽然条件没有按预期运作。
BEGIN
declare moduleid VARCHAR(3);
declare parent VARCHAR(3);
declare flag int DEFAULT 0;
SET max_sp_recursion_depth = 3;
set moduleid = mdlid;
set parent = '';
set flag = 0;
select moduleid;
set parent = (
select
ms.parentModule as parentModule
from
x ms
where
ms.moduleid = moduleid
);
select parent;
set flag = if( 'MNU' = parent, 0, 1 );
select flag;
while (flag <> 0) DO
select
ms.menuname
from
x ms
where
ms.moduleId = parent;
select 'called recursive';
call usp_testwhile(parent);
end WHILE;
END
虽然标志值为0,但正在执行的语句。
这个sp的初衷是当父母菜单是MNU时停止。 例如,x的表结构如下,
moduleid parentmodule menuname
aaa bbb alpha1
bbb ccc alpha2
ccc MNU alpha3
预期的功能是 调用spname('aaa');
现在模块id是aaa,parent是bbb。在我正在检查父项时!='MNU'条件失败并且第2周期开始
现在模块ID是bbb,父级是ccc。在我正在检查父项时!='MNU'条件失败并且第3周期开始
现在模块ID是ccc,父节点是MNU。在我正在检查父项时!='MNU'条件满足并且应该停止执行。
答案 0 :(得分:0)
您定义的标志变量不会传递给递归调用,它只存在于每个过程调用的范围内
我建议更新以下电话: 调用usp_testwhile(parent); 以某种方式实际包含旗帜。
或者,只需删除flag变量并直接在while循环中执行Parent ='MNU'检查。
对于您在此处定义的所有变量也是如此,如果您没有将它们传递给递归调用,则它们实际上将在每次递归调用时重置。
答案 1 :(得分:0)
用if条件实现上述问题的解决方案。 在上面的代码中while循环不能按预期工作。
if (parent != 'MNU') then
set @menuname=(select
ms.menuname
from
x ms
where
ms.moduleId = parent);
#select @menuname;
set @conMenu = CONCAT(@menuname,COALESCE(menuname, ''));
select @conMenu;
call usp_testwhile(parent,@conMenu);
end if;