求助!需要递归调用Oracle中的存储过程,如何写这样的存储过程

[复制链接]
查看11 | 回复6 | 2007-7-4 17:27:50 | 显示全部楼层 |阅读模式
求助!需要递归调用Oracle中的存储过程,如何写这样的存储过程

求助,因为我们ERP系统中的Menu资料,是通过两个表进行存储的,F9000存是的每个MENU明细资料,F9001时存储MENU之间的上下关系。现在,我想做一个根据MENU层次来显示各ROLES的权限设置,因此需要做一个存储过程来得到一个MENU层次表,我编写如下:
create or replace procedure sp_GetSubMenu(ParentTaskid in nvarchar2(36))
is
begin
DECLARE CURSOR task_temp IS
select tmtaskid,tmtasknm,tmlngtask,tmobnm,tmver,tmfmnm

,trparnttsk,trchildtsk,trprsseq
from testctl.f9000 a,testctl.f9001 b
where a.tmtaskid=b.trchildtsk and b.trchildtsk=ParentTaskid
order by trprsseq ;--

for Cur_Row in task_temp loop
begin

insert intoJDE_GMIMenu(taskid, taskname , objname, objver,objform )

values(Cur_Row.trchildtsk,Cur_Row.tmtasknm,Cur_Row.tmobnm,Cur_Row.tmver,Cur_Row.tmfmnm); --将当前层次保存在一个临时表中

commit;

executesp__GetSubMenu(Cur_Row.trchildtsk);--这里递归调用下一层次
end;
end loop;
CLOSE task_temp;

end sp_GetSubMenu;
但是不能执行这个存储过程,请各位高手帮我看看,就如何写
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
试试如下语句!
select tmtaskid,
tmtasknm,
tmlngtask,
tmobnm,
tmver,
tmfmnm,
trparnttsk,
trchildtsk,
trprsseq
from testctl.f9000 a, testctl.f9001 b
start with a.tmtaskid = b.trchildtsk
connect by prior b.trchildtsk = ParentTaskid;
[ 本帖最后由 bell6248 于 2009-3-6 13:35 编辑 ]
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
F9000 的结构:
tmtaskid,--Menu id
tmtasknm,--Menu name
tmlngtask,--Menu text desc.
tmobnm--调用的对象
...
F9001的结构:
trparnttsk -- Parent Menu id
trchildtsk-- children menu id
trprsseq --Children menusequence
...
想得到的格式是:
menu id ,menu name, menu text desc, tmobnm...
但出来的结果是按MENU的层次和顺序来的
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
我如上的语句你先试一试, 要题问题先看看“http://www.itpub.net/thread-1063592-1-1.html”!
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
多谢!你帮我写的语句执行很久也没执行完,然后我改成下面这样,也是一样,F9000:21788 records,F9001:21292 records
select * from testctl.f9000 a ,
(select level,trchildtsk,trparnttsk,trprsseq
from testctl.f9001
start with trparnttsk ='9001'--根结点
connect by trchildtsk=trparnttsk) b--父子关系. 这个可以这样来写吗,也是执行很久,
where a.tmtaskid=b.trchildtsk
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
非常感谢bell!
现在调整语句为:
select b.*,a.tmtasknm,a.tmlngtask,a.tmobnm,a.tmver,a.tmfmnm from prodctl.f9000 a ,
(select level,trchildtsk,trparnttsk,trprsseq
from prodctl.f9001
start with trparnttsk ='9001'
connect by trparnttsk= priortrchildtsk
order siblings by trprsseq) b
where a.tmtaskid=b.trchildtsk
可以得到我想要的数据了
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
没有必要使用存储过程,用下面的SQL试试
SELECT T1.tmtaskid,T1.tmtasknm,T1.tmlngtask,T1.tmobnm,T1.tmver,T1.tmfmnm,T2.trparnttsk,T2.trchildtsk,T2.trprsseq
FROM testctl.f9000 T1,
(SELECT ParentTaskid,trchildtsk,trprsseq FROM testctl.f9001
CONNECT BY trparnttsk = PRIOR trchildtsk START WITH trparnttsk = ParentTaskid) T2 --(这里ParentTaskid是输入的变量)
WHERE T1.tmtaskid(+) = T2.trchildtsk
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行