虽然条件在我的SQL

时间:2017-08-24 05:30:45

标签: mysql sql stored-procedures

我有一个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'条件满足并且应该停止执行。

2 个答案:

答案 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;