存储过程 游标嵌套

本文介绍了一种使用MySQL存储过程来实现从两个不同的表中选取数据,并将这些数据组合后批量插入到第三个表中的方法。具体操作包括:从role表筛选出管理员角色ID,从resource表中获取所有子模块为“分组”的资源ID,然后将这两组ID配对后插入到dpm_common_role_resource表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个需求,三张表,role表中找出管理员的role_id,resource表中找出sub_module=‘‘分组’’的source_id,如role_id为1,source_id为7 8 9,则在中间表dpm_common_role_resource中插入1 7,1 8,1 9.

dpm_common_role表,( SELECT role_id   FROM  dpm_common_role where name = '高级用户' OR name = '管理员';)


dpm_common_resource表,(SELECT source_id  FROM  dpm_common_resource where sub_module = "分组";)


dpm_common_role_resource表

delimiter //
CREATE PROCEDURE dowhile()
BEGIN
DECLARE FID1 int;
DECLARE FID2 int;
DECLARE done int;
DECLARE ou_cur CURSOR FOR SELECT role_id   FROM  dpm_common_role where name = '高级用户' OR name = '管理员';
DECLARE ou_cur1 CURSOR FOR SELECT source_id  FROM  dpm_common_resource where sub_module = "分组";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN ou_cur;
    out_loop:LOOP
        FETCH ou_cur INTO FID1;
        IF done = 1 THEN
            LEAVE out_loop;
        END IF;

        OPEN ou_cur1;
        inner_loop:LOOP
		FETCH ou_cur1 INTO FID2;
		IF done = 1 THEN
		    LEAVE inner_loop;
		END IF;

		INSERT INTO DPM_COMMON_ROLE_RESOURCE (role_id, source_id) values (FID1,FID2);

		end LOOP inner_loop;
        CLOSE ou_cur1;

        SET done=0;

    END LOOP out_loop;
  CLOSE ou_cur;
END;
 //   
call dowhile();


前面要加

delimiter //


后面要加

//

写存储过程一定要delimiter  某个标记一下,不然默认情况下mysql遇到分号; 就认为是一个执行标记。


没想到navicat执行存储过程的时候,会默认就自动设置delimiter 为其他符号,修改了;为提交符号了。。。


好大的一个坑啊。

要不提示语法错误。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值