|
最初由 haicom 发布
[B]如果用PL/SQL应该如何做呢??????????? [/B]
用pl/sql
create or replace procedure merry
as
cursor a1 is select distinct key_in from k_test where key_in <>0;
num1 int;
num2 int;
a1a k_test.key_in%type;
type ccc is ref cursor;
k01 ccc;
rowvalues k_test%rowtype;
begin
for a1a in a1 loop
select count(*) into num1 from k_test where key_in =a1a.key_in;
select count(*) into num2 from k_test where key_out=a1a.key_in;
if num2 is null then
null;
else
if num1<num2 then
open k01 for select * from k_test where key_in=a1a.key_in;
loop
fetch k01 into rowvalues;
exit when k01%notfound;
insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
end loop;
close k01;
open k01 for select key,key_in,key_out from (select * from (select key,key_in,key_out, row_number() over (partition by key_out order by key_out) tt from k_test) where tt<=num1) where key_out=a1a.key_in;
loop
fetch k01 into rowvalues;
exit when k01%notfound;
insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
end loop;
close k01;
else
open k01 for select * from k_test where key_out = a1a.key_in;
loop
fetch k01 into rowvalues;
exit when k01%notfound;
insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
end loop;
close k01;
open k01 for select key,key_in,key_out from (select * from (select key,key_in,key_out, row_number() over (partition by key_in order by key_in) tt from k_test) where tt<=num2) where key_in=a1a.key_in;
loop
fetch k01 into rowvalues;
exit when k01%notfound;
insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
end loop;
close k01;
end if;
end if;
end loop;
end;
就是麻烦了点 |
|