2

私はPLSQLを初めて使用し、再帰関数を作成しようとしていましたが、PLSQLの用語とあまりにも混乱しています。

私は次のようなテーブル構造を持っています:

    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、2を持つ子IDを返すことができるはずFFAM_GROUP_FLAGです。

FFAM_UPPER_ACC_IDは親IDでありFFAM_GROUP_FLAG、行がグループであるかどうかを判別します。

したがって、2を指定すると、子行が4であるにもかかわらず、何も返されないはずです。その行にはFFAM_GROUP_FLAG1があります。グループです。

1を指定すると、3、6、7が返されます。3の親IDが1で、7の親IDが6であるため、これは再帰が必要です。

9を指定すると、9が返されます。子行はありませんが、グループではありません。

SQLフィドル

4

2 に答える 2

4

そのための再帰プロシージャは実際には必要ありません。また、プロシージャもまったく必要ありません。代わりに階層クエリを使用してください。

これはあなたが望むことをするはずです(少なくともあなたが提供した入力で動作します):

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;
于 2013-03-04T07:13:31.167 に答える
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

フィドル

于 2013-03-04T07:23:41.283 に答える