create table NODE
(
NODECODE CHAR(8) not null,
NODENAME VARCHAR(100) not null,
NODEWITH CHAR(8) );
/*
NODE 是网点表:NODECODE网点编号,VARCHAR网点名,NODEWITH 属于那个网点
*/insert into node values( '00000000','总部',null);insert into node values( '00000001','广东分公司','00000000');
insert into node values( '00000002','四川分分公司','00000000');insert into node values( '00000005','云南分分公司','00000000');
insert into node values( '00000003','广州办事处','00000001');
insert into node values( '00000004','成都办事处','00000002');
insert into node values( '00000006','昆明办事处','00000005');create table USERORDER
(
NODECODE CHAR(8),
USERCODE CHAR(8),
DEALRATE INTEGER
);
/*
USERORDER 订单审核人表:NODECODE网点编号(与NODE表的NODECODE关联),USERCODE用户编号,DEALRATE 等级
*/
insert into USERORDER values( '00000000','A1',1);
insert into USERORDER values( '00000001','B1',1);
insert into USERORDER values( '00000001','B2',2);
insert into USERORDER values( '00000002','C1',1);
insert into USERORDER values( '00000002','C2',2);
insert into USERORDER values( '00000003','D1',1);
insert into USERORDER values ('00000004','D2',1);
insert into USERORDER values( '00000006','F1',1);/*
我要的结果是订单审核的几种线路比如:广东分公司的订单是让 D1 B1 B2 A1 按顺序审(B1 B2同一级,B2等级数据高一点,所以B1在B2前)
云南公公司在分公司时没有人,所以就只有总部与办事处审核 结果是: D1 B1 B2 A1
D2 C2 C1 A1
F1 A1
*/drop table node;
drop table USERORDER;
(
NODECODE CHAR(8) not null,
NODENAME VARCHAR(100) not null,
NODEWITH CHAR(8) );
/*
NODE 是网点表:NODECODE网点编号,VARCHAR网点名,NODEWITH 属于那个网点
*/insert into node values( '00000000','总部',null);insert into node values( '00000001','广东分公司','00000000');
insert into node values( '00000002','四川分分公司','00000000');insert into node values( '00000005','云南分分公司','00000000');
insert into node values( '00000003','广州办事处','00000001');
insert into node values( '00000004','成都办事处','00000002');
insert into node values( '00000006','昆明办事处','00000005');create table USERORDER
(
NODECODE CHAR(8),
USERCODE CHAR(8),
DEALRATE INTEGER
);
/*
USERORDER 订单审核人表:NODECODE网点编号(与NODE表的NODECODE关联),USERCODE用户编号,DEALRATE 等级
*/
insert into USERORDER values( '00000000','A1',1);
insert into USERORDER values( '00000001','B1',1);
insert into USERORDER values( '00000001','B2',2);
insert into USERORDER values( '00000002','C1',1);
insert into USERORDER values( '00000002','C2',2);
insert into USERORDER values( '00000003','D1',1);
insert into USERORDER values ('00000004','D2',1);
insert into USERORDER values( '00000006','F1',1);/*
我要的结果是订单审核的几种线路比如:广东分公司的订单是让 D1 B1 B2 A1 按顺序审(B1 B2同一级,B2等级数据高一点,所以B1在B2前)
云南公公司在分公司时没有人,所以就只有总部与办事处审核 结果是: D1 B1 B2 A1
D2 C2 C1 A1
F1 A1
*/drop table node;
drop table USERORDER;
(select b.nodecode nodecode ,a.nodecode node , a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode = b.nodecode
and b.nodecode<>'00000000'
and nodewith='00000000'
union
select b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode=b.nodewith
and b.nodecode<>'00000000'
and nodewith='00000000'
union
select b.nodecode nodecode ,a.nodecode node ,a.usercode usercode ,a.dealrate dealrate from USERORDER a ,node b
where a.nodecode=(select nodecode from node c where c.nodewith=b.nodecode )
and b.nodecode<>'00000000'
and nodewith='00000000')
order by nodecode ,node desc ,dealrate
D2 C1 C2 A1
F1 A1我要的结果大概意思就是,从总部到分公司有多少条审核线路,
比如:总部是让 A1 一个人审,所以他是第一级
广东分公司: D1 B1 B2 A1 因为D1(办事处)是最下面的所以它是第一个审核人:
(B1,B2)是同一级的,但B1等级(DEALRATE )小,所以他在B2前
A1是总部的,他是最后一个审核人
我不知道现在说清楚没
广东分公司的订单是让 D1 B1 B2 A1 按顺序审
type t_RefCursor is ref cursor;
end RefCursor;
create or replace procedure test
as
v_cur RefCursor.t_RefCursor;
v_count varchar2(8);
v_level number;
v_sql varchar2(4000);
v_sql1 varchar2(4000);
i number;
begin
v_sql:='create or replace view aaa as select '
open v_cur for 'select b.level,count(1)
from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
on a.NODECODE=b.NODECODE group by b.level order by level desc';
open v_cur;
fetch v_cur into v_level,v_count;
while v_cur %found loop
for i in 1..v_count loop
v_sql1:=v_sql1||' ,max(case when level='||v_level||' and DEALRATE='||v_count||' then USERCODE else null end) col_'||v_level||'_'||i;
exit when i=v_count;
end loop;
fetch v_cur into v_level,v_count;
end loop;
close v_cur;
v_sql1:=v_sql1||' from (select b.level,a.DEALRATE,a.USERCODE
from USERORDER a left join (select level,NODECODE from NODE connect by prior NODECODE=NODEWITH) b
on a.NODECODE=b.NODECODE) tab'
execute immediate v_sql||substr(v_sql1,2);
end;
/select * from aaa;