Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root)

发布时间:2025-12-09 19:43:06 浏览次数:4

Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root)

  • 1. 前言
  • 2. connect_by_root 和 自定义函数
    • 2.1 用 connect_by_root 实现
    • 2.2 用 自定义函数实现
      • 2.2.1 自定义函数
      • 2.2.2 实现效果

1. 前言

  • 看这篇文章之前可以先看下面的文章

    oracle递归查询(start with connect by prior)以及 树形统计connect_by_root(子节点汇总到父节点).

    数据来源和这篇文章里的一样,所有下面用到就直接给sql了,自己想复制数据的话,可以去上篇文章里拿

2. connect_by_root 和 自定义函数

  • 首先,先给一下表数据设计和想要的效果,不多说,直接给图

    接下来就是用两种方式来实现,请继续……

2.1 用 connect_by_root 实现

  • 我这里就直接给个效果图了,sql我就不粘了,上篇文章里都有,剩下的都可以参考上篇文章里的3.3.2章节

2.2 用 自定义函数实现

2.2.1 自定义函数

  • 此函数就是根据dept_id找到公司id,直接看函数:

  • 函数代码:create or replace function f_company_id(v_dept_id varchar2) return varchar2 iscompany_id varchar2(100);count_num number;beginselect count(0) into count_num from sys_company_dept t where t.dept_id = v_dept_id and type = '1';if count_num = 1 thenreturn v_dept_id;elseselect f_company_id(t.parent_id) into company_id from sys_company_dept t where t.dept_id = v_dept_id and rownum < 2;return company_id;end if;end f_company_id;

2.2.2 实现效果

  • 调用上述函数,通过sql来实现想要的效果,如下
  • sql 如下:with temp1 as(select t.*,f_company_id(t.dept_id) company_idfrom sys_company_dept t)select t1.*,t2.dept_name as company_name from temp1 t1left join sys_company_dept t2 on t1.company_id=t2.dept_idwhere t2.type='1';
  • 欧了,不用自带函数 connect_by_root ,也把问题解决
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477