您的位置:首页 > 数据库

查询数据库数据连续性问题---存储过程解决

2011-10-24 14:09 555 查看
--切记一定要用jdbc查询 ,不能用hibernate查询,不然临时表不会起临时表的作用,应为一般hibernater用到了缓存。

--要查询的表

create table test(

ids number(5),

names varchar2(50),

nums number(5)

);

--临时表

create global temporary table tempComtinuity

(

id number(5)

)on commit preserve rows;

--测试脚本

insert into test values(1,'张山',1);

insert into test values(2,'sss',2);

insert into test values(3,'李四',3);

insert into test values(4,'王武',5);

insert into test values(5,'赵六',6);

insert into test values(6,'aaa',8);

insert into test values(7,'hui',9);

insert into test values(8,'chen',18);

insert into test values(9,'ivan',16);

insert into test values(11,'kkk',17);

insert into test values(12,'yyy',14);

select * from tempComtinuity;

--创建存储过程 mycursor out SYS_REFCURSOR 输出参数游标

create or replace procedure testContinuity(sizes in number,mycursor out SYS_REFCURSOR)is

minnum number ;--最小值

maxnum number;--最大值

ns number:=0; --记录值

temp number:=0; --是否存在变量

begin

--获取最大值与最小值

begin

--获取最大与最小值

select min(nums) into minnum from test;

select max(nums) into maxnum from test;

end ;

--循环计算

while (minnum<=maxnum)

Loop

--获取是否存在记录,并判断

select count(*) into temp from test where nums =minnum ;

begin

if temp>0 then

begin

minnum :=minnum+1; --最小值+1

ns :=ns+1; --记录+1

if minnum>maxnum and ns>=sizes then --如果最小值超过最大值 并且记录ns大于要连续的参数sizes时 记录该连续的id

insert into tempComtinuity (select ids from test where nums between minnum-ns and minnum);

end if;

end;

else

if ns>=sizes then --记录ns大于要连续的参数sizes时 记录该连续的id

begin

insert into tempComtinuity (select ids from test where nums between minnum-ns and minnum);

minnum:=minnum+1;

ns:=0;--将记录数据归0 使得判断连续性从新开始

end;

else

minnum:=minnum+1;

ns:=0;--将记录数据归0 使得判断连续性从新开始

end if;

end if;

end;

end loop;

--返回游标值

open mycursor for select * from test where ids in (select id from tempComtinuity) order by nums;

end testContinuity;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐