Plsql PL-SQL递归函数

Plsql PL-SQL递归函数,plsql,oracle10g,plsqldeveloper,Plsql,Oracle10g,Plsqldeveloper,我是PL SQL的新手,我试图在其上创建一个递归函数,但我对PL SQL术语太过困惑了 我的表格结构如下: FFAM_ACC_ID FFAM_UPPER_ACC_ID FFAM_GROUP_FLAG 1 0 1 2 1 1 3 1

我是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\u ACC\u ID
,它应该能够返回具有
FFAM\u GROUP\u标志的子ID
2

FFAM\u UPPER\u ACC\u ID
是父ID,
FFAM\u GROUP\u FLAG
确定行是否为组

所以,如果我提供2,它应该什么也不返回,因为尽管它有一个子行,4。该行具有
FFAM\u组\u标志
1。这是一个小组

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

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


实际上不需要递归过程,甚至根本不需要过程:使用

这应该满足您的要求(至少适用于您提供的输入):

从FMS\U FC\U ACC\U MST中选择*
其中,ffam_组_标志=2
从ffam\U acc\U id开始=
通过ffam连接\u组\u标志=2
以及先前的ffam_acc_id=ffam_upper_acc_id;

分层查询不是递归的吗:-)?它只是隐藏在数据库引擎中,而不是为了查看。分层查询对我来说很有效,但是如果我想创建一个递归函数呢?正如@Ben所说,这已经是递归的了,只是你没有“手工”进行递归。如果你想用手来做,那就做吧。执行一个过程,在给定“父”ID列表的情况下选择“子”并递归调用。可能有点棘手,而且效率也不高。
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;
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