PL-SQL 递归函数

Posted

技术标签:

【中文标题】PL-SQL 递归函数【英文标题】:PL- SQL recursive function 【发布时间】:2013-03-04 06:11:49 【问题描述】:

我是 PL SQL 的新手,我试图在其上创建一个递归函数,但我对 PL SQL 术语感到困惑。

我有一个像这样的表结构:

    FFAM_ACC_ID     FFAM_UPPER_ACC_ID   FFAM_GROUP_FLAG
        1                   0                   1
        2                   1                   1
        3                   1                   2
        4                   2                   1
        5                   4                   2
        6                   1                   2
        7                   6                   2
        8                   0                   1
        9                   8                   2

现在,我想创建一个递归函数。所以,如果我提供FFAM_ACC_ID,它应该能够返回给我具有FFAM_GROUP_FLAG 2 的子ID。

FFAM_UPPER_ACC_ID 是父 ID,FFAM_GROUP_FLAG 确定该行是否为组。

所以,如果我提供 2,它应该什么也不返回,因为虽然它有一个子行,但 4。该行有 FFAM_GROUP_FLAG 1。即。这是组。

如果我提供 1,它应该返回 3、6、7。这需要递归,因为 3 的父 id 是 1,而 7 的父 id 是 6。

如果我提供9,它应该返回9。虽然它没有子行,但它不是一个组。

SQL fiddle

【问题讨论】:

【参考方案1】:

您实际上不需要递归过程,甚至根本不需要过程:改用hierarchical queries。

这应该做你想做的(至少在你提供的输入上工作):

select * from FMS_FC_ACC_MST
where ffam_group_flag = 2
start with ffam_acc_id = <your input>
connect by ffam_group_flag = 2 
       and prior ffam_acc_id = ffam_upper_acc_id;

【讨论】:

层次查询不是递归的:-)?它只是隐藏在数据库引擎中,而不是为了查看而布局。 分层查询对我有用,但如果我想创建一个递归函数怎么办? 正如@Ben 所说,这已经是递归的,只是你没有“手动”进行递归。如果你想手工做,那就去做吧。执行一个过程,在给定“父”ID 列表的情况下选择“子”,然后递归调用它。可能有点棘手,而且效率也不高。【参考方案2】:
with 
  input as (
     select 9 as FFAM_ACC_ID from dual  -- change to 1, 2
  )

select FFAM_ACC_ID
from FMS_FC_ACC_MST
start with 
   FFAM_UPPER_ACC_ID = (select FFAM_ACC_ID from input)
   and FFAM_GROUP_FLAG = 2
connect by 
   prior FFAM_ACC_ID = FFAM_UPPER_ACC_ID

union all

select FFAM_ACC_ID
from FMS_FC_ACC_MST
natural join input 
where FFAM_GROUP_FLAG = 2

fiddle

【讨论】:

以上是关于PL-SQL 递归函数的主要内容,如果未能解决你的问题,请参考以下文章

递归函数 集合 列表 元组

UE4定义递归函数

递归与内置函数

函数递归

python 递归与递归函数

python - - 函数 - - 递归函数