mysql存储过程解决线上的一个问题

        最近线上有个问题是要给拥有A权限的所有角色添加A权限下的一个子权限A1,因为需要查询A权限的所有角色,并批量

添加子权限A1,所以简单的sql不能处理此问题,有两种方法:1. 写脚本解决 2. 用存储过程解决。

        脚本相对简单些,在此不做记录,主要讲一下存储过程解决办法。

        #### 拥有**权限的角色添加 **报表权限
       DELIMITER //
       DROP PROCEDURE IF EXISTS batch_add_access_for_yingyun //
       CREATE PROCEDURE batch_add_access_for_yingyun()
       BEGIN
             DECLARE role_id INT; #定义变量 角色id
             DECLARE str VARCHAR (300); #为了给个该存储函数执行成功后给个提示
             DECLARE s INT DEFAULT 0; #这个用于处理游标到达最后一行的情况
             DECLARE yingyun_module_id INT DEFAULT (SELECT `module_id` FROM `module_info` WHERE `module_name` = '营运');
             DECLARE **_module_id INT DEFAULT (SELECT `module_id` FROM `module_info` WHERE `module_name` = '**报表');

             #声明游标cursor_name(cursor_name是个多行结果集)
             DECLARE role_ids CURSOR FOR SELECT `role_id` FROM `role_relation_map` WHERE `module_id` = yingyun_module_id;
             #设置一个终止标记
             DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
             SET str = '--';
             #打开游标
             OPEN role_ids;
             #获取游标当前指针的记录,读取一行数据并传给变量role_id
             FETCH role_ids INTO role_id;
             SELECT role_id;
             WHILE s <> 1 DO
                     SET str = CONCAT(str, s);
                     INSERT INTO `role_relation_map` (`role_id`,`module_id`)
                            SELECT role_id, **_module_id FROM DUAL WHERE NOT EXISTS 
                                 (SELECT `role_relation_id` FROM `role_relation_map` 
                                         WHERE `role_id` = role_id AND `module_id` = **_module_id);
                     #读取下一行数据
                     FETCH role_ids INTO role_id;
              END WHILE;
              #关闭游标
              CLOSE role_ids;
              SELECT str;
       END//
       DELIMITER ;

       CALL batch_add_access_for_yingyun();

       以上就是整个存储过程的描述。

       有以下几个知识点需要总结吧:

              1.存储过程结果体中的变量定义

                 ①DECLARE用来声明局部变量,且DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前;可以被用在嵌套的块中,除了那些用相同名字声明变量的块。

            ②如果要给变量提供一个默认值,使用DEFAULT子句(值可以是常数,也可以指定为一个表达式);如果没有DEFAULT子句,初始值为NULL。

                 参考链接:https://www.cnblogs.com/geaozhang/p/6803423.html

                                   https://www.cnblogs.com/vincentvoid/p/6433085.html

             2.游标的定义和循环遍历调用

               参考链接:https://www.cnblogs.com/phao123/p/5941293.html

             3.mysql插入前判断数据是否存在

                参考链接:https://blog.csdn.net/lai0yuan/article/details/78234102

                                  https://www.cnblogs.com/xingmeng/p/4446613.html

            4.存储过程的整体使用

               参考链接:https://blog.csdn.net/Tom_Green/article/details/78229904

       如果好的意见或建议,请不吝赐教~

发布了151 篇原创文章 · 获赞 107 · 访问量 133万+

猜你喜欢

转载自blog.csdn.net/sanbingyutuoniao123/article/details/83269286