mysql 存储过程菜单拷贝

1、根据菜单名称,查找菜单记录,并拷贝生成一条新的菜单

CREATE  PROCEDURE `menu_copybyname`(in params_name varchar(255))
begin
#定义
declare cur_menu_id INT default 0 ;
declare v_maxid bigint(20);
declare v_new_pid bigint(20); #新的子菜单pid
declare done int default false;
declare v_menu_id bigint(20)  ;
declare v_pid bigint(20) ;
declare v_sub_count int(5) ;#'子菜单数目'
declare v_type int(11) ; # '菜单类型';
declare v_title varchar(255) ; # '菜单标题';
declare v_name varchar(255) ; # '组件名称';
declare v_component varchar(255) ; # '组件';
declare v_menu_sort int(5) ; # '排序';
declare v_icon varchar(255) ; # '图标';
declare v_path varchar(255) ; # '链接地址';
declare v_i_frame bit(1) ; # '是否外链';
declare v_cache bit(1) DEFAULT b'0'; # COMMENT '缓存';
declare v_hidden bit(1) DEFAULT b'0' ; #COMMENT '隐藏';
declare v_permission varchar(255) ; # '权限';
declare v_display int(1) DEFAULT '0';
declare v_menu_category int(1) ; # '菜单类型';

#删除name 为 name+ _link	记录
#DELETE from sys_menu where name = CONCAT(params_name,'_link');

#根据菜单名称查询记录
select menu_id,pid,sub_count,type,title,name,component ,menu_sort, icon,path,i_frame,cache,hidden,permission,display,menu_category  into cur_menu_id,v_pid,v_sub_count,v_type,v_title,v_name,v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category  from sys_menu where  name = params_name;
SELECT cur_menu_id,v_pid,v_sub_count,v_type,v_title,v_name,v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category ;

#插入当前查询的记录,680为临时菜单ID
insert into sys_menu
	(pid,sub_count,type,title,name,component ,menu_sort, icon,path,i_frame,cache,hidden,permission,display,menu_category)
	values(680,v_sub_count,v_type,v_title,CONCAT(v_name,'_link'),v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category );
#获取v_new_pid
select max(menu_id) into v_new_pid from sys_menu;
#SELECT v_new_pid ;
#递推copy菜单到新的菜单中
call menu_copybypid(cur_menu_id,v_new_pid);

 
end

2、递归调用拷贝子菜单

CREATE  PROCEDURE `menu_copybypid`(in params_pid bigint(20),in params_new_pid bigint(20))
begin
#定义
declare curmenuid INT default 0 ;
declare counts INT default 0 ;
declare v_maxid bigint(20);
declare v_new_pid bigint(20);
declare done int default false;
declare v_menu_id bigint(20)  ;
declare v_pid bigint(20) ;
declare v_sub_count int(5) ;#'子菜单数目'
declare v_type int(11) ; # '菜单类型';
declare v_title varchar(255) ; # '菜单标题';
declare v_name varchar(255) ; # '组件名称';
declare v_component varchar(255) ; # '组件';
declare v_menu_sort int(5) ; # '排序';
declare v_icon varchar(255) ; # '图标';
declare v_path varchar(255) ; # '链接地址';
declare v_i_frame bit(1) ; # '是否外链';
declare v_cache bit(1) DEFAULT b'0'; # COMMENT '缓存';
declare v_hidden bit(1) DEFAULT b'0' ; #COMMENT '隐藏';
declare v_permission varchar(255) ; # '权限';
declare v_display int(1) DEFAULT '0';
declare v_menu_category int(1) ; # '菜单类型';


#查询pid = curmenuid 的 下级菜单 记录
declare cursor_name cursor for
 select  menu_id,pid,sub_count,type,title,name,component ,menu_sort, icon,path,i_frame,cache,hidden,permission,display,menu_category 
        from sys_menu
        where pid = params_pid
        order by menu_sort asc;
declare continue handler for not found set done = true;

SET @@max_sp_recursion_depth = 10;
#select params_pid,params_new_pid;
open cursor_name;
#获取下级菜单
info_loop:loop

	fetch cursor_name into v_menu_id,v_pid,v_sub_count,v_type,v_title,v_name,v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category ;
	if done then
		leave info_loop;
	end if;	

	#生成新的菜单
  insert into sys_menu
	(pid,sub_count,type,title,name,component ,menu_sort, icon,path,i_frame,cache,hidden,permission,display,menu_category)
	values(params_new_pid,v_sub_count,v_type,v_title,CONCAT(v_name,'_link'),v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category );
	SELECT params_new_pid,v_menu_id,v_pid,v_sub_count,v_type,v_title,v_name,v_component ,v_menu_sort ,v_icon,v_path,v_i_frame,v_cache,v_hidden,v_permission,v_display,v_menu_category ;
	


	#获取v_new_pid
	select max(menu_id) into v_new_pid from sys_menu;

  #查一下菜单v_menu_id有没有子菜单
  select count(1) into counts from sys_menu where  pid = v_menu_id ;
  
  if counts>0 then 
	select v_menu_id ;
	  #SELECT CONCAT('select  * from sys_menu where  pid =',v_menu_id);
		call menu_copybypid(v_menu_id,v_new_pid) ;
	end if; 
 
end loop info_loop;

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值