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

 时间:2026-02-15 08:25:02

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;

  • vba窗体如何设置定时提醒功能
  • VBA如何提取相符条件2个表格的数据
  • 在VBA中,如何编写删除空行的代码?
  • 如何使用VBA中GetOpenFilename的文件多选参数
  • Excel通过Code函数返回汉字的ACSII码值
  • 热门搜索
    祖国建设新成就手抄报 网络安全手抄报的句子 中秋节手抄报内容文字 手抄报图片大全初一 廉洁文化手抄报 手抄报清明节 快乐寒假手抄报 儿童端午节手抄报简单 八一建军节手抄报 新年手抄报图片大全