oracle存储过程随机抽取一条数据并返回

2025-11-04 05:15:42

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;

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢