oracle存储过程随机抽取一条数据并返回
1、涉及表介绍CLWWjgsj date类型 --经过时间rksj date类型 --入库时间sjzt number(1) --数据状态ggbj number(1)--更改标记 ,用于锁住该条数据wwid number(15) --唯一标识id,序列自增长fjr number --操作数据人员编号
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、需求再次简化经过对比发现,查询某个人员前一天未及时更改的数据比较慢,但是查询一段时间内的速度很快。经过和开发人员讨论发现,查询某个人员前一天未及时更改的数据可以不需要的,直接在后台将某个操作人员未及时更改的数据重置到随机抽取数中。这样就加快了查询速度!
4、随机抽取select * from(select * from(select * from(SELECT * FROM CLWFXXWHERE JGSJ >SYSDATE -15AND SJZT=1AND FJBJ=0ORDER BY JGSJ DESC) WHERE ROWNUM <=20 --在20条数据中随机抽取)order by dbms_random.value) where rownum <2;
5、存储过程幻踔佐曝返回一条数据create or replace procedure wiscom_sortin爿讥旌护g(i_fjr in NUMBER,--操作人i_fjts in NUMBER,--天数o_curcor_clww out SYS_REFCURSOR --定义动态游标)asv_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 wwfidinto 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;