DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 866|回复: 0
打印 上一主题 下一主题

[待整理] Oracle里抽取随机数的多种方法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 15:24:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在你的工作中是否会为了某个活动要随机取出一些符合条件的EMAIL或者手机号码用户,来颁发获奖通知或其它消息?本文以实例的方式来讲解如何抽取随机数的多种方法。

如果是的话,可以用oracle里生成随机数的PL/SQL, 目录文件名在:/ORACLE_HOME/rdbms/admin/dbmsrand.sql。

用之前先要在sys用户下编译:SQL>@/ORACLE_HOME/rdbms/admin/dbmsrand.sql。

它实际是在sys用户下生成一个dbms_random程序包,同时生成公有同义词,并授权给所有数据库用户有执行的权限。

使用dbms_random程序包, 取出随机数据的方法:

1. 先创建一个唯一增长的序列号tmp_id:


           
  1. create sequence tmp_id increment by 1 start with 1
  2. maxvalue 9999999 nocycle nocache;
复制代码
           

2. 然后创建一个临时表tmp_1,把符合本次活动条件的记录全部取出来:

           
  1. create table tmp_1 as select tmp_id.nextval as id,
  2. email,mobileno from 表名 where 条件;
复制代码
           
找到最大的id号:select max(id) from tmp_1;。

3. 设定一个生成随机数的种子:

           
  1. execute dbms_random.seed(12345678);

  2. 或者

  3. execute dbms_random.seed
  4. (TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));
复制代码
           
4. 调用随机数生成函数dbms_random.value生成临时表tmp_2(假设随机取200个):

           
  1. create table tmp_2 as select trunc
  2. (dbms_random.value(1,5000)) as id from tmp_1 where rownum<201;
复制代码
           
[ 说明:dbms_random.value(1,5000)是取1到5000间的随机数,会有小数,
trunc函数对随机数字取整,才能和临时表的整数ID字段相对应。

注意:如果tmp_1记录比较多(10万条以上),也可以找一个约大于两百行的表(假如是tmp_3)来生成tmp_2

           
  1. create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_3 where rownum<201; ]
复制代码
           
5. tmp_1和tmp_2相关联取得符合条件的200用户

           
  1. select t1.mobileno,t1.email from tmp_1 t1,
  2. tmp_2 t2 where t1.id=t2.id;
复制代码
           
[ 注意:如果tmp_1记录比较多(10万条以上),需要在id字段上建索引。]

也可以输出到文本文件:

           
  1. set pagesize 300;
  2. spool /tmp/200.txt;
  3. select t1.mobileno,t1.email from tmp_1 t1,
  4. tmp_2 t2 where t1.id=t2.id order by t1.mobileno;
  5. spool off;
复制代码
           
6. 用完后,删除临时表tmp_1、tmp_2和序列号tmp_id。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-15 09:25 , 耗时 0.082333 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表