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 递归函数的主要内容,如果未能解决你的问题,请参考以下文章