• 如何用存储过程替代递归算法实现菜单栏效果
  • 发布于 2个月前
  • 278 热度
    0 评论
一般后台管理系统都有一张菜单表,并且有上下级的关系,比如:成品库存>>预警报表>>产品库存呆滞预警。 很多时候,如果新人对菜单不熟悉,就要多次去查询这张菜单表,根据sId和sParentId不断去查,这就很麻烦。由于低版本MySQL是没有递归语法的,所以我们可以通过编写一个存储过程的方式,去完成这个操作。当然,Java也可以操作,但不管用何种方式,都绕不过递归。

以下是我用存储过程编写的方法:
drop PROCEDURE if EXISTS get_menu_path;
CREATE PROCEDURE get_menu_path(
  IN menu_name VARCHAR(255),
  OUT menu_path_out VARCHAR(255))
BEGIN

top:
 BEGIN
  DECLARE parent_id VARCHAR(100);
  DECLARE menu_path VARCHAR(1024) DEFAULT '';
  
  -- 查找初始菜单的父级菜单
  SELECT sParentId INTO parent_id
  FROM gdsmodule
  WHERE sChineseUnMemo = menu_name;


  -- 循环直到找不到父级菜单
  WHILE parent_id is not null and parent_id <> '' DO
    -- 将当前菜单添加到菜单路径中
    SELECT CONCAT(sChinese, '>>', menu_path) INTO menu_path
    FROM gdsmodule
    WHERE sid = parent_id;

    
    -- 查找当前菜单的父级菜单
    SELECT sParentId INTO parent_id
    FROM gdsmodule
    WHERE sid = parent_id;

  END WHILE;
  
  set menu_path_out = concat(menu_path,menu_name) ;

SELECT menu_path_out;

END;
END ;
这段MySQL存储过程get_menu_path旨在根据给定的菜单名称menu_name,找到并返回该菜单的完整路径。路径是通过将每个上级菜单的名称用>>连接起来构建的。

1.参数:
menu_name: 输入参数,表示要查询的菜单名称。
menu_path_out: 输出参数,用于返回查询到的菜单路径。
2.过程:
声明了两个变量:parent_id用于存储当前菜单的父级ID,menu_path用于存储构建的菜单路径。
通过查询gdsmodule表,找到与menu_name匹配的菜单的父级ID,并将其存储在parent_id中。
使用一个WHILE循环,只要parent_id不为空且不为空字符串,就继续执行循环。
在循环内部,首先通过查询gdsmodule表,找到与parent_id匹配的菜单的中文名称,并将其与当前的menu_path(如果有的话)用>>连接起来,然后更新menu_path。
接着,再次查询gdsmodule表,找到当前菜单的父级ID,并更新parent_id。
当找不到更多的父级菜单时(即parent_id为空或空字符串),循环结束。
最后,将menu_path与原始的menu_name连接起来,得到完整的菜单路径,并将其赋值给输出参数menu_path_out。
通过SELECT语句返回menu_path_out的值。

效果:

用户评论