存储过程 游标嵌套

有一个需求,三张表,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 为其他符号,修改了;为提交符号了。。。


好大的一个坑啊。

要不提示语法错误。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL存储过程可以使用游标来进行数据的遍历和操作。游标嵌套是指在一个游标循环内部再使用一个或多个游标循环,以实现更复杂的数据操作。 下面是一个简单的示例,演示了如何在MySQL存储过程嵌套使用游标: ``` DELIMITER // CREATE PROCEDURE nested_cursors() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE outer_cursor CURSOR FOR SELECT id FROM table1; DECLARE inner_cursor CURSOR FOR SELECT value FROM table2 WHERE id = @current_id; OPEN outer_cursor; outer_loop: LOOP FETCH outer_cursor INTO @current_id; IF done THEN LEAVE outer_loop; END IF; OPEN inner_cursor; inner_loop: LOOP FETCH inner_cursor INTO @current_value; IF done THEN LEAVE inner_loop; END IF; -- 在这里进行数据操作,例如将数据插入到一个临时表中 END LOOP; CLOSE inner_cursor; END LOOP; CLOSE outer_cursor; END// DELIMITER ; ``` 在这个示例中,我们定义了两个游标:`outer_cursor` 和 `inner_cursor`。`outer_cursor` 用于遍历 `table1` 表中的所有记录,而 `inner_cursor` 则用于遍历 `table2` 表中与当前 `outer_cursor` 记录相关联的所有记录。 在存储过程的主循环中,我们首先打开 `outer_cursor`,然后进入一个无限循环,直到所有记录都被遍历完毕。在每次循环中,我们使用 `FETCH` 命令获取当前记录的 `id` 值,并将其存储在变量 `@current_id` 中。 接下来,我们打开 `inner_cursor`,并进入另一个无限循环,直到所有与当前 `@current_id` 相关联的记录都被遍历完毕。在每次循环中,我们使用 `FETCH` 命令获取当前记录的 `value` 值,并将其存储在变量 `@current_value` 中。 最后,在内部循环中,我们可以使用 `@current_id` 和 `@current_value` 变量进行数据操作,例如将数据插入到一个临时表中。完成内部循环后,我们关闭 `inner_cursor`,回到外部循环中,继续遍历下一个记录,直到所有记录都被遍历完毕。 注意,为了避免游标嵌套时出现问题,我们需要在每个游标的内部循环中使用唯一的变量名,否则可能会出现变量名冲突的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值