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

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 := dbms_random.value;   
    --      update a set a2=a2+1 where a1 <;   
 
    -- 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插入随机数

    ### Oracle插入随机数 在Oracle数据库管理中,有时我们需要向数据库表中插入大量的随机数据来进行测试、演示或者数据模拟分析等工作。本篇文章将详细介绍如何利用自定义的Oracle函数来实现这一功能。 #### 自定义...

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

    Oracle 里取随机数的几种具体的方法 Oracle 是一个功能强大的关系数据库管理系统,它提供了多种方法来生成随机数。随机数生成是许多应用程序的重要组件,例如抽奖活动、验证码生成、密码生成等。在本文中,我们将...

    Oracle 随机数

    Oracle数据库提供了一个名为DBMS_RANDOM的包,用于生成随机数,这对于各种应用场景,如模拟、测试和数据分析等非常有用。在Oracle 9i版本中,你可以利用DBMS_RANDOM包的函数来实现特定的需求,比如随机选取数据库表...

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

    Oracle 中抽取随机数的多种方法 在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的用户,以颁发获奖通知或其它消息。本文将通过实例讲解如何抽取随机数的多种方法。 ...

    ORACLE随机数DBMS_RANDOM包

    Oracle数据库中的DBMS_RANDOM包是一个非常实用的工具,它提供了多种生成随机数和随机字符串的方法,广泛应用于数据填充、测试场景模拟以及各种需要随机性的应用中。以下将详细讲解DBMS_RANDOM包中的主要函数和其使用...

    oracle中随机数的获取

    在Oracle数据库中,生成随机数是一项常见的需求,特别是在数据测试、模拟或数据分析场景中。本文将详细介绍如何在Oracle SQL中获取各种类型的随机数。 首先,Oracle提供了一个内置的函数DBMS_RANDOM,它包含了一...

    oracle取随机数

    在Oracle数据库环境中,生成随机数是一项常见且实用的操作,它被广泛应用于数据模拟、测试、安全性和数据分析等领域。本文将深入探讨如何在Oracle中生成不同类型的随机数,包括字符型、数值型以及GUID,旨在为数据库...

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

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

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

    在C#编程中,生成随机数、排序以及与Oracle数据库交互是常见的操作。在这个特定的项目中,我们看到一个挑战性的任务,即生成250万个随机数,对其进行排序,然后将结果存入Oracle数据库。这里我们将深入探讨这些知识...

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

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

    利用ORACLE实现数据的抽样

    此外,Oracle还支持`DBMS_RANDOM`包,这是一个强大的随机数生成器,可以用来辅助实现更复杂的抽样需求。如: ```sql SELECT * FROM (SELECT * FROM MEMBER ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM ; ``` 这将从`...

    Oracle造数工具

    例如,对于整数字段,可能使用Python的random模块生成随机数;对于字符串字段,可能使用字符串模板或正则表达式来构造符合格式的文本。此外,脚本还可能包含了处理相等关系的逻辑,确保生成的数据满足预设的关联条件...

    oracle系统内置包

    例如,DBMS_RANDOM包提供了生成随机数的功能,而DBMSCRYPTO包则提供了加密和解密数据的功能。 4. 实现数据同步和定时服务 Oracle内置包还支持数据同步和定时服务,这在数据库管理和维护中非常有用。例如,DBMS_...

    Oracle相关技术-解决忘记oracle管理员密码,创建只读用户语法等

    至于“随机抽取”,在Oracle中,可以使用内置的函数如`DBMS_RANDONTEGER`或`DBMS_RANDOM.VALUE`来生成随机数,然后结合SQL查询实现数据的随机抽样。例如,如果想从表中随机选取10%的数据,可以创建一个伪列并按该列...

    Oracle创造测试数据

    2. **使用DBMS_RANDOm包**:Oracle提供了一系列随机数生成函数,如DBMS_RANDOM.STRING和DBMS_RANDOM.VALUE,可以用来创建随机的数据。 3. **PL/SQL脚本**:编写PL/SQL过程,根据业务逻辑生成复杂的数据结构。 4. **...

    Oracle中如何用一条SQL快速生成10万条测试数据

    `dbms_random`是Oracle提供的包,包含了一系列随机数生成函数,`value`函数可以生成指定范围内的随机数。通过`trunc`函数,我们可以将其转换为整数。 #### 4. **随机字符串生成** `dbms_random.string('x',20)`...

    Oracle经典SQL语句

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

Global site tag (gtag.js) - Google Analytics