oracle存储过程随机抽取一条数据并返回
1、1、涉及表介绍
CLWW
jgsj date类型 --经过时间
rksj date类型 --入库时间
sjzt number(1) --数据状态
ggbj number(1)--更改标记 ,用于锁住该条数据
wwid number(15) --唯一标识id,序列自增长
fjr number --操作数据人员编号
2、2、数据基数条件
(1)一段时间内随机抽取一条数据来分配
select *
from CLWW
where jgsj > sysdate - 15 --15天内,变化的时间
and jgsj < sysdate - 1 / 12 --前2个小时
and sjzt = 1 --有效数据
and fjbj = 0 --数据未更改
and rksj - jgsj < 3 --入库时间和经过时间不相差3秒
and clwfid < 900000000000001 --序列要求
order by jgsj --排序
(2)某个操作人员前一天未及时更改的数据
select * from clww
where jgsj > sysdate -15 --是否是15天待定
and jgsj<sysdate-1/12 --前2个小时
and fjr=520 --更改人员编号 变化的
and fjbj=3 --正在更改
and rownum<2 --一条数据
end;
因为是某个人未及时更改的,所以不需要使用随机函数
3、3、需求再次简化
经过对比发现,查询某个人员前一天未及时更改的数据比较慢,但是查询一段时间内的速度很快。经过和开发人员讨论发现,查询某个人员前一天未及时更改的数据可以不需要的,直接在后台将某个操作人员未及时更改的数据重置到随机抽取数中。这样就加快了查询速度!
4、4、随机抽取
select * from
(
select * from
(
select * from
(
SELECT * FROM CLWFXX
WHERE JGSJ >SYSDATE -15
AND SJZT=1
AND FJBJ=0
ORDER BY JGSJ DESC
) WHERE ROWNUM <=20 --在20条数据中随机抽取
)
order by dbms_random.value
) where rownum <2;
5、5、存储过程返回一条数据
create or replace procedure wiscom_sorting
(
i_fjr in NUMBER,--操作人
i_fjts in NUMBER,--天数
o_curcor_clww out SYS_REFCURSOR --定义动态游标
)
as
v_wwfid number(15) ;
begin
--将这个需求直接剔除
/*
查找分拣人未及时分拣的数据,
建议去除该段查询,未及时分拣的数据可以单独重置为随机数的基数
*/
/* select * from clww
where jgsj > sysdate -15
and jgsj<sysdate-1/12
and fjr=520
and fjbj=3
and rownum<2
end;*/
--随机分配一条原始数据给分拣人分拣
select wwfid into v_wwfid
from (select wwfid
from (select wwfid
from (select wwfid
from clww
where jgsj > sysdate - i_fjts
and jgsj < sysdate - 1 / 12
and sjzt = 1
and fjbj = 0
and rksj - jgsj < 3
and wwfid< 900000000000001
order by jgsj )
where rownum <= 40) --由于是20个人,加大随机基数,防止随机出现相同数据
order by dbms_random.value)
where rownum < 2;
update clwwset fjbj=3,fjr=i_fjr where wwfid=v_wwfid;
commit; --锁住该条数据
open o_curcor_clww for select * from clwwwhere wwfid=v_wwfid;
return;
end wiscom_sorting;