`
zjx2388
  • 浏览: 1303373 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle,随机数

阅读更多
=======================================
自己用到的代码:(使用的是Oracle 10)
select   *   from   (select   *   from   t_consumer    order   by   dbms_random.value)   where   rownum<3
====================以下搜罗了网络上一些关于Oracle随机数的帖子=============
ORDER BY DBMS_RANDOM.VALUEdbms_random.value(100,200),dbms_random.string('A',10) 

SELECT *
FROM (SELECT EMPNO, ENAME FROM SCOTT.EMP ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM <3> 注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sql 
dbms_random.value(100,200)可以产生100到200范围的随机数
取排序后的前3条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn 取排序后的第4-6条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn between 4 and 6;
11.13 随机产生N个字符串
select dbms_random.string('A',10) from dual; 
========================
Oracle随机函数—dbms_random  

1.基础认识

关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中:
     select text   from all_source 
      where name = 'DBMS_RANDOM' 
       and type = 'PACKAGE' order by line; 

   ◆ TYPE      num_array
   ◆ PROCEDURE terminate
   ◆ PROCEDURE seed
   ◆ PROCEDURE initialize
   ◆ FUNCTION random
   ◆ FUNCTION value RETURN NUMBER; 
   ◆ FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER; 
   ◆ FUNCTION normal RETURN NUMBER; 
   ◆ FUNCTION string (opt char, len NUMBER) RETURN VARCHAR2; 


2.应用举例

SELECT DBMS_RANDOM.RANDOM FROM DUAL; 
  
再进一步的要求,比如,产生一个0-100的随机数,稍微变通一下就可以了: 
  
select abs(mod(dbms_random.random,100)) from dual

3.进阶说明

dbms_random又有新函数了可以实现这些功能 
FUNCTION value RETURN NUMBER; 
FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER; 
FUNCTION normal RETURN NUMBER; 
FUNCTION string (opt char, len NUMBER)   RETURN VARCHAR2;  
  
产生N到M之间的随机数 
SELECT   DBMS_RANDOM.VALUE(N,M) FROM DUAL; 
  
缺省DBMS_RANDOM.VALUE返回0到1之间的随机数 

SQL> select dbms_random.value, dbms_random.value(55,100) from dual; 
VALUE            DBMS_RANDOM.VALUE(55,100) 
--------------- ----------------------------- 
0.714469037747011      68.5593418279622
  
NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。 
最后,是STRING函数。它返回一个长度达60个字符的随机字符串。

用DBMS_RANDOM生成文本和日期值 

数字、文本字符串和日期都是用户会在表格里碰到的三种常见数据类型。虽然你可以用PL/SQL程序包里的DBMS_RANDOM随机生成数字——它确实能够做到这一点——它还能够随机生成文本和日期值。

1.产生随机数字
就让我们先从数字开始。VALUE函数会返回一个大于等于0但是小于1的数,精度是38位。

SELECT DBMS_RANDOM.VALUE FROM DUAL; 

对于指定范围内的整数,要加入参数low_value和high_value,并从结果中截取小数(最大值不能被作为可能的值)。所以对于0到99之间的整数,你要使用下面的代码:

SELECT TRUNC(DBMS_RANDOM.VALUE(0, 100)) FROM DUAL;

2.产生随机文本字符串
要随机生成文本字符串,就要使用STRING函数并编写代码指定字符串的类型和所希望的长度:

SELECT DBMS_RANDOM.STRING('A', 20) FROM DUAL; 

类型代码在《Oracle Database 10g PL/SQL程序包和类型参考(Oracle Database 10g PL/SQL Packages and Types Reference)》有说明。

下面是一些类型的代码:

‘U’用来生成大写字符

‘L’用来生成小写字符

‘A’用来生成大小写混合的字符

3.产生随机日期
Oracle将日期作为过去某个关键日期(如果你好奇的话,我可以告诉你这个日期是公元前4712年1月1日)的整数偏移量来保存。这就意味着你可以通过寻找与你希望的起始日期相对应的整数,然后向它加入一个随机的整数来随机生成一个指定范围内的日期。

使用TO_CHAR函数和‘J’格式代码,你可以为今天的日期生成一个内部日期数:

SELECT TO_CHAR(SYSDATE, 'J') FROM DUAL; 

例如,要生成一个2003年内的任意日期,你可以首先确定2003年1月1日的日期整数;

SELECT TO_CHAR(TO_DATE('01/01/03','mm/dd/yy'),'J')FROM DUAL; 

系统给的结果是2452641。所以要生成该年度内的任意日期,我们就要用带有low_value等于2452641和high_value等于2452641+364参数的DBMS_RANDOM.VALUE,再把它转换成日期:

SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),'J') FROM DUAL;



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luojun198610/archive/2009/02/27/3941491.aspx
========================
    没事做简单看了一下Oracle随机函数的取法:
dbms_random 

CREATE OR REPLACE PACKAGE SYS.dbms_random AS 
    ------------ 
    --  OVERVIEW 
    -- 
    --  This package should be installed as SYS.  It generates a sequence of 
    --  random 38-digit Oracle numbers.  The expected length of the sequence 
    --  is about power(10,28), which is hopefully long enough. 
    -- 
    -------- 
    --  USAGE
    -- 
    --  This is a random number generator.  Do not use for cryptography. 
    --  For more options the cryptographic toolkit should be used. 
    -- 
    --  By default, the package is initialized with the current user 
    --  name, current time down to the second, and the current session.
    -- 
    --  If this package is seeded twice with the same seed, then accessed 
    --  in the same way, it will produce the same results in both cases. 
    -- 
    -------- 
    --  EXAMPLES 
    -- 
    --  To initialize or reset the generator, call the seed procedure as in: 
    --      execute dbms_random.seed(12345678); 
    --    or 
    --      execute dbms_random.seed(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS')); 
    --  To get the random number, simply call the function, e.g. 
    --      my_random_number BINARY_INTEGER; 
    --      my_random_number := dbms_random.random; 
    --    or 
    --      my_random_real NUMBER; 
    --      my_random_real := dbms_random.value; 
    --  To use in SQL statements: 
    --      select dbms_random.value from dual; 
    --      insert into a values (dbms_random.value); 
    --      variable x NUMBER; 
    --      execute :x := dbms_random.value; 
    --      update a set a2=a2+1 where a1 < :x; 

    -- Seed with a binary integer 
    PROCEDURE seed(val IN BINARY_INTEGER ); 
    PRAGMA restrict_references (seed, WNDS ); 
    -- Seed with a string (up to length 2000) 
    PROCEDURE seed(val IN VARCHAR2 ); 
    PRAGMA restrict_references (seed, WNDS ); 
    -- Get a random 38-digit precision number, 0.0 <= value < 1.0 
   FUNCTION value RETURN NUMBER ; 
    PRAGMA restrict_references ( value , WNDS ); 
    -- get a random Oracle number x, low <= x < high 
    FUNCTION value (low IN NUMBER , high IN NUMBER ) RETURN NUMBER ; 
    PRAGMA restrict_references ( value , WNDS ); 
    -- get a random number from a normal distribution 
    FUNCTION normal RETURN NUMBER ; 
    PRAGMA restrict_references (normal, WNDS ); 
      -- get a random string 
    FUNCTION string (opt char , len NUMBER ) 
    /* "opt" specifies that the returned string may contain: 
       'u','U'  :  upper case alpha characters only 
       'l','L'  :  lower case alpha characters only 
       'a','A'  :  alpha characters only (mixed case) 
       'x','X'  :  any alpha-numeric characters (upper) 
       'p','P'  :  any printable characters 
     */ 
    RETURN VARCHAR2 ;  -- string of <len> characters (max 60) 
    PRAGMA restrict_references ( string , WNDS ); 
    -- Obsolete, just calls seed(val) 
    PROCEDURE initialize(val IN BINARY_INTEGER ); 
    PRAGMA restrict_references (initialize, WNDS ); 
    -- Obsolete, get integer in ( -power(2,31) <= random < power(2,31) ) 
    FUNCTION random RETURN BINARY_INTEGER ; 
    PRAGMA restrict_references (random, WNDS ); 
  
   -- Obsolete, does nothing 
    PROCEDURE terminate; 
    TYPE num_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ; 
END dbms_random; 
   简单得说,通过dbms_random包调用随机数的方法大致有4种:

1、dbms_random.normal 

    这个函数不带参数,能返回normal distribution的一个number类型,所以基本上随机数会在-1到1之间。 

    简单测试了一下,产生100000次最大能到5左右: 

 

    SQL> declare
      2    i number:=0;
      3    j number:=0;
      4  begin
      5    for k in 1 .. 100000 loop
      6    i:= dbms_random.normal;
      7      if i > j
      8        then j:=i;
      9      end if;
     10    end loop;
     11    dbms_output.put_line(j);
     12  end;
     13  / 

 

    5.15325081797418404136433867107468983182
 
    PL/SQL procedure successfully completed 

 

2、dbms_random.random 

    这个也没有参数,返回一个从-power(2,31)到power(2,31)的整数值 
3、dbms_random.value 
    这个函数分为两种,一种是没有参数,则直接返回0-1之间的38位小数 
    SQL > column value format 9.99999999999999999999999999999999999999
    SQL > select dbms_random.value from dual; 
                                        VALUE
    -----------------------------------------
      .58983014999643548701631750396301271752 
    第二种是加上两个参数a、b,则返回值在a、b之间的38位小数
    SQL > column value format 999.999999999999999999999999999999999999
    SQL > select dbms_random.value(100,500) value from dual; 

                                        VALUE
    -----------------------------------------
     412.150194612502916808701157054098274240 
    注意:无论前面几位,小数点之后都是38位 
4、dbms_random.string 

    这个函数必须带有两个参数,前面的字符指定类型,后面的数值指定位数(最大60) 
    类型说明: 

    'u','U'  :  upper case alpha characters only 

    'l','L'  :  lower case alpha characters only 

    'a','A'  :  alpha characters only (mixed case) 

    'x','X'  :  any alpha-numeric characters (upper) 

    'p','P'  :  any printable characters 
    SQL > column value format a30
    SQL > select dbms_random.string('u',30) value from dual; 

    VALUE
    ------------------------------
    VTQNLGISELPXEDBXKUZLXKBAJMUTIA 

    SQL > select dbms_random.string('l',30) value from dual; 

    VALUE
    ------------------------------
    uqygsbquingfqdytpgjvdoblxeglgu 
    SQL > select dbms_random.string('a',30) value from dual; 

    VALUE
    ------------------------------
    NGTGkQypuSWhBfcrHiOlQwOUXkqJjy 
    SQL > select dbms_random.string('x',30) value from dual; 
    VALUE
    ------------------------------
    UVWONYJMXT31VEFPD736WJCJ5QT6BD 
    SQL > select dbms_random.string('p',30) value from dual; 
    VALUE
    ------------------------------
    :mak$(WT4M_7c/+f[_XUscf$P Zcq{ 

5、关于seed 
    可以设置seed来确定随机数的起始点,对于相同的seed而言,随机数的任意一次变化都将是确定的。
    就是说,如果在某一时刻调用了seed,之后第一次产生的随机数是4,第二次是6,第三次是1,那么当你再次调用相同的seed之后,一次产生的随机数还是4、6、1 
    seed有两种,一种是数值型的,一种是字符型(最大长度2000)的 
    -- Seed with a binary integer 
    PROCEDURE seed(val IN BINARY_INTEGER ); 
    PRAGMA restrict_references (seed, WNDS );  

    -- Seed with a string (up to length 2000) 
    PROCEDURE seed(val IN VARCHAR2 ); 
    PRAGMA restrict_references (seed, WNDS ); 

6、关于initialize 
    一个integer参数,注释说的很清楚了:
    -- Obsolete, just calls seed(val) 
    PROCEDURE initialize(val IN BINARY_INTEGER ); 
    PRAGMA restrict_references (initialize, WNDS ); 

sys_guid() 
 
    官方文档的说明如下: 

    SYS_GUID generates and returns a globally unique identifier (RAW value) made up of 16 bytes. On most platforms, the generated identifier consists of a host identifier, a process or thread identifier of the process or thread invoking the function, and a nonrepeating value (sequence of bytes) for that process or thread. 
   简单得说就是,随机生成一个32位的RAW,但是后面的那段经过实验发现不是这么回事,每次生成的字符串都千差万别,不知道为什么。 
   在具体应用中,除了可以用来插入生成唯一的标识符外,还可以用来取表中的任意一条记录: 
select  * from ( select * from t2 order by sys_guid()) where rownum = 1 ; 

-The End-
==========
  
Oracle学习之二: 取整函数和随机函数
 
 
 
这次需要用取整函数,于是在网上查到了: 

ceil(15.01) 只能取最接近但大于15.7的整数 

结果:16 

floor(15.73) 只能取最接近但小于15.7的整数 

结果:15 

trunc(15.79,1) 只能依据精确位来取,不会四舍五入 

结果:15.7 

round(15.79,1) 能依据精确位数来四舍五入 

结果:15.8 

trunc 和 round 中的"1"表示小数点 1 位,0 表示个位,-1 表示十位 
随机函数如下: 

dbms_random.value(v1, v2) v1 和 v2 两个参数是取值范围. 再配合上取整函数,就可以取得一个范围内的任何随机数了.
 
分享到:
评论

相关推荐

    ORACLE随机数DBMS_RANDOM包

    主要介绍了ORACLE随机数DBMS_RANDOM包,通过dbms_random包调用随机数的方法大致有4种,具体哪4种请看本篇文章吧

    Oracle 随机数

    利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户: select * from ( select * from busi.t_ar_userinfo order by dbms_random.value) where rownum &lt; 500; 有关dbms_random的参考文献,链接...

    Oracle插入随机数

    自定义Oracle函数,向Oracle数据库中插入随机数。

    oracle中随机数的获取

    oracle中随机数的获取 通过sql获取各种类型的随机数

    Oracle里抽取随机数的多种方法

    本文以实例的方式来讲解如何抽取随机数的多种方法。

    Oracle里取随机数的几种具体的方法

    本文介绍了Oracle里取随机数的几种具体的方法。

    oracle取随机数

    oracle产生随机字符型,数值型或生成GUID

    Oracle经典SQL语句

    -- 随机数 -- 产生业务流水号 -- 查询某张表中有哪些字段 -- 自循环表中 由叶子节点查父节点 -- 查子节点 复制一张表的数据到另外一张表中 PLSQL中存储过程及游标的基本使用 Oracle中恢复某张表丢失数据的方法 -- 把...

    C#随机数生成并排序然后插入数据库

    这个是C#培训的一个题目:随机生成250万个随机数 并将其排序,最后将这个250万数据插入到数据库(我用的是ORACLE) 这个耗时我测试了在200秒以内 仅供新手参考 因为我也只是个新手

    Oracle中如何生成随机数字、随机字符串、随机日期

    Oracle中如何生成随机数字、随机字符串、随机日期 详细实例脚本。

    Oracle 10g应用指导

    介绍了PL/SQL中常用的函数、异常处理等,还有对随机数生成、分析函数、多表合并、多表插入等问题的解决方法。第7章 子程序和触发器,包括函数、存储过程、包以及触发器等。对子程序的调用者权限、管道表函数、传递...

    Oracle+10g应用指导与案例精讲

    介绍了PL/SQL中常用的函数、异常处理等,还有对随机数生成、分析函数、多表合并、多表插入等问题的解决方法。第7章 子程序和触发器,包括函数、存储过程、包以及触发器等。对子程序的调用者权限、管道表函数、传递...

    Java随机数生成主键(16位)

    oracle自动生成主键的工具类,就一个简单的方法。

    SQLServer和Oracle的常用函数对比

    SQLServer和Oracle的常用函数对比 共计45点 1.绝对值 2.取整(大) 3.取整(小) 4.取整(截取) 5.四舍五入 6.e为底的幂 7.取e为底的对数 8.取10为底对数 9.取平方 10.取平方根 11.求任意数为底的幂 12.取...

    取不重复的N个随机数

    随机函数的用法,数组的用法,GOTO语句的用法

    oracle统计时间段内每一天的数据(推荐)

    下面给大家介绍oracle统计时间段内每一天的数据,具体sql语句如下所示: 1. 生成1000个随机数 SELECT ROWNUM RN, DBMS_RANDOM.VALUE(0, 1000) RANDOM FROM DUAL CONNECT BY ROWNUM &lt;= 1000; 注:DBMS_RANDOM....

    solana.games:基于Solana的随机性游戏

    第0层:简单游戏经典骰子-掷骰的结果由Oracle系统确定,该系统在Solana上生成随机数。 从12中选择-中奖号码由Oracle系统确定,该系统在Solana上生成随机数。 掷硬币-获胜方是由Oracle系统确定的,该系统在Solana上...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能 Oracle P/L SQL实现发送Email、浏览网页等网络操作功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 --.使用聚合函数实现 多行...

Global site tag (gtag.js) - Google Analytics