2013-03-04 64 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