PL-SQL递归函数

时间:2013-03-04 06:11:50

标签: 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                   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,它应该什么也不返回,因为虽然它有一个子行,但是那行有FFAM_GROUP_FLAG 1。它是小组。

如果我提供1,则应返回3,6,7。这需要递归,因为父ID为3且父ID为7。

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

SQL fiddle

2 个答案:

答案 0 :(得分:4)

您实际上并不需要递归程序,甚至根本不需要程序:改为使用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;

答案 1 :(得分:1)

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