2013-03-04 3 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 является родительским идентификатором и FFAM_GROUP_FLAG определяет, является ли строка представляет собой группу или нет.

Итак, если я предоставляю 2, он не должен возвращать ничего, потому что хотя он имеет дочернюю строку, 4. Эта строка имеет FFAM_GROUP_FLAG 1. ie. это группа.

Если я обеспечиваю 1, он должен вернуть 3, 6, 7. Это необходимо, так как рекурсию родительский идентификатор 3 равен 1, и идентификатор родительского 7 равен 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

+1

не иерархические запросы рекурсивные :-)? Он просто скрыт в движке БД, а не предназначен для просмотра. – Ben

+0

Иерархические запросы работали для меня, но что делать, если я хочу создать рекурсивную функцию? – hsuk

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

Смежные вопросы