2013-03-04 67 views
2

我是PL SQL新手,我试图在其上创建一个递归函数,但我对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.

FFAM_UPPER_ACC_ID是父ID和FFAM_GROUP_FLAG确定该行是一组或没有孩子的ID。所以,如果我提供2,它应该什么都不会返回,因为它虽然有一个子行,但是4.该行有FFAM_GROUP_FLAG 1. ie。它是组。

如果我提供1,则它应该返回图3,6,7 这需要递归自父ID的图3是图1和7的父ID为6

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

SQL fiddle

回答

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; 
+0

非常感谢,伙计...... – hsuk 2013-03-04 08:23:48

+1

是不是递归层次查询:-)?它只是隐藏在数据库引擎中,而不是布局用于查看。 – Ben 2013-03-04 08:44:56

+0

分层查询适用于我,但如果我想要创建递归函数呢? – hsuk 2013-03-04 08:54:50

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