oracle递归查询 -行业应用

    最近做项目,需求为:将当前部门要继承直属上级部门的机构权限 查询出来。权限查询模块,就是需要将用户、组织、角色、功能、资源一起查询出来,并加上筛选条件。为了实现将继承的父组织机构的权限一并查询出来,可以采用oracle递归查询 方式。

    oracle递归查询算法 先了解下oracle递归查询 之后继续说如何应用 oracle递归查询 行业应用。

    文章中说道 sys_connect_by_path(column,'分隔符') 很有用的。确实,往往被忽略。想下如果要实现继承权限问题,一定要用到 sys_connect_by_path ,我们以逗号为分隔符,之后再将逗号转成行。这样就可以完成组织和角色之间的关联,并递归查询出角色,而角色对应的是权限,所以ok解决了。

select distinct org_code, role_id
    from (with test as (
    -- 自己的查询语句
           select org_code,
                  substr(t.ca,
                         instr(t.ca, ',', 1, role_id.lv) + 1,
                         instr(t.ca, ',', 1, role_id.lv + 1) -
                         (instr(t.ca, ',', 1, role_id.lv) + 1)) AS role_id
             from (select org_code,

                          ',' || role_id || ',' AS ca,
                          length(role_id || ',') -
                          nvl(length(REPLACE(role_id, ',')), 0) AS cnt
                     FROM test) t,
                  (select LEVEL lv from dual CONNECT BY LEVEL <= 10) role_id
            where role_id.lv <= t.cnt)
            where role_id is not null  ;

代码意思是将逗号转成 行数据,只要将字段名称:org_code,role_id 换成自己的即可。

    如果需要将用户、组织、角色、权限 关联起来查询 也可以的。此问题虽然看似简单,但越是简单的问题更应该弄懂,工作3年以上必须知道的,必须会的。以上代码只是一部分,实际上构造好了数据之后查询就非常容易了。欢迎批评指正,谢谢。

    贴下我的完整sql,仅供参考,其中sys_connect_by_path(column,'分隔符') 查询出来的结果中第一个字符为 分隔符 所以需要截掉。

select distinct org_code, role_id
    from (with test as (select distinct allprole.org_code,
                                        allprole.org_name,
                                        allprole.roleids as role_id,
                                        allprole.role_name
                          from (Select oror.org_code,
                                       oror.org_name,
                                       oror.role_name,
                                       substr(SYS_CONNECT_BY_PATH(oror.role_id,
                                                                  ','),
                                              2) as roleids,
                                       substr(SYS_CONNECT_BY_PATH(oror.org_code,
                                                                  ','),
                                              2) as orgcodes,
                                       substr(SYS_CONNECT_BY_PATH(oror.role_name,
                                                                  ','),
                                              2) as rolenames
                                  From (select o.org_code,
                                               o.org_name,
                                               aor.role_id,
                                               r.role_name,
                                               o.parent_code
                                          from RI_NT_AUTH_ORG o
                                          left join ri_nt_auth_org_role aor
                                            on o.org_code = aor.org_code
                                          left join RI_NT_AUTH_ROLE r
                                            on r.role_id = aor.role_id) oror
                                 Start With oror.org_code = '9998'
                                Connect By Prior
                                            oror.org_code = oror.parent_code) allprole
                        --where allprole.org_code in ('9998001001')
                        )
           select org_code,
                  substr(t.ca,
                         instr(t.ca, ',', 1, role_id.lv) + 1,
                         instr(t.ca, ',', 1, role_id.lv + 1) -
                         (instr(t.ca, ',', 1, role_id.lv) + 1)) AS role_id
             from (select org_code,

                          ',' || role_id || ',' AS ca,
                          length(role_id || ',') -
                          nvl(length(REPLACE(role_id, ',')), 0) AS cnt
                     FROM test) t,
                  (select LEVEL lv from dual CONNECT BY LEVEL <= 10) role_id
            where role_id.lv <= t.cnt)
            where role_id is not null  ;


©声明:本站原创文章采用 BY-NC-SA 共享协议,受法律保护,转载请注明出处;转载文章版权归原作者所有。
©转载请注明来源:

未经允许不得转载:最优质网--最有指望 » oracle递归查询 -行业应用

赞 (0) 打赏

评论 0

评论前必须登录!

登陆 注册

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏