DBMS_RANDOM是Oracle提供的一个PL/SQL包,用于生成随机数据和字符。它具有以下函数。

其中,initialize,random,terminate函数在Oracle11g中已不推荐使用,主要用于向后兼容。下面对各个函数进行举例说明

1. INITIALIZE

用一个种子值来初始化DBMS_RANDOM包。

默认情况下,DBMS_RANDOM包是根据用户、时间、会话来进行初始化,这样,即便是同一个语句,每次生成的数值都会不一样,但这样会产生一个问题,在测试环境下,如果我想每次生成的随机序列都是一样的,该怎么办?INITIALIZE函数就很好的解决了这一问题,通过设置相同的种子值,则每次生成的随机序列都将是一样的。

语法:

DBMS_RANDOM.INITIALIZE (
         val IN BINARY_INTEGER);

举例:

  1. SQL> BEGIN
  2. 2 dbms_random.initialize(100);
  3. 3 FOR i IN 1 .. 10 LOOP
  4. 4 dbms_output.put_line(dbms_random.random);
  5. 5 END LOOP;
  6. 6 END;
  7. 7 /
  8. 163284779
  9. 751599369
  10. 659804475
  11. 1131809137
  12. -865013504
  13. -407075626
  14. 2128226600
  15. -448154892
  16. -1371178596
  17. 472933400
  18.  
  19. PL/SQL procedure successfully completed.

即便是在不同的会话中,不同的用户下,随机生成的10个值都是一样的。

2. NORMAL

NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

语法:

DBMS_RANDOM.NORMAL
        RETURN NUMBER;

举例:

  1. SQL> select dbms_random.normal from dual;
  2.  
  3. NORMAL
  4. ----------
  5. .321082788

3. RANDOM

RANDOM返回值的范围为: [-2^31, 2^31),返回的是整数。

语法:

DBMS_RANDOM.RANDOM
          RETURN binary_integer;

举例:

  1. SQL> select dbms_random.random from dual;
  2.  
  3. RANDOM
  4. ----------
  5. -1.363E+09

4. SEED

功能和INITIALIZE函数类似,实际上,INITIALIZE函数被淘汰,推荐的替代函数即是SEED函数。与INITIALIZE函数不同的是SEED函数同时支持数值和字符作为种子值,而INITIALIZE函数只支持数值。

语法:

DBMS_RANDOM.SEED (
     val IN BINARY_INTEGER);

DBMS_RANDOM.SEED (
     val IN VARCHAR2);

举例:

  1. BEGIN
  2. dbms_random.seed('hello');
  3. FOR i IN 1 .. 10 LOOP
  4. dbms_output.put_line(round(dbms_random.value * 100));
  5. END LOOP;
  6. END;

输出如下:

  1. 58
  2. 71
  3. 33
  4. 4
  5. 39
  6. 53
  7. 93
  8. 37
  9. 20
  10. 5

其中,VARCHAR2的最大范围为2000.

5. STRING

随机生成字符串

语法:

DBMS_RANDOM.STRING
      opt IN CHAR,
      len IN NUMBER)
  RETURN VARCHAR2;

关于opt和len的说明,解释如下:

可见,opt指的是字符串的格式,len指的是字符串的长度。

举例:

  1. SQL> select dbms_random.string('u',10) value from dual;
  2.  
  3. VALUE
  4. --------------------
  5. MCPEZLEQOO
  6.  
  7. SQL> select dbms_random.string('l',10) value from dual;
  8.  
  9. VALUE
  10. --------------------
  11. laufaqufln
  12.  
  13. SQL> select dbms_random.string('a',10) value from dual;
  14.  
  15. VALUE
  16. --------------------
  17. vjEetXlItt
  18.  
  19. SQL> select dbms_random.string('x',10) value from dual;
  20.  
  21. VALUE
  22. --------------------
  23. LAMDGZE22E
  24.  
  25. SQL> select dbms_random.string('p',10) value from dual;
  26.  
  27. VALUE
  28. --------------------
  29. 4LF =Q'(fP

6. TERMINATE

在使用完DBMS_RANDOM包后,用该函数进行终止。该函数在11gR1中即不推荐使用了。

语法:

DBMS_RANDOM.TERMINATE;

举例:

  1. SQL> exec DBMS_RANDOM.TERMINATE;
  2.  
  3. PL/SQL procedure successfully completed.

7. VALUE

语法:

DBMS_RANDOM.VALUE
   RETURN NUMBER;

DBMS_RANDOM.VALUE(
       low IN NUMBER,
       high IN NUMBER)
   RETURN NUMBER;

对于第一种用法,返回的值的范围为大于或等于0,小于1,带有38位精度的小数。

对于第二种用法,可指定最小值和最大值,返回值的范围为大于或等于low,小于high。

举例:

  1. SQL> select dbms_random.value from dual;
  2.  
  3. VALUE
  4. ----------
  5. .291782963
  6.  
  7. SQL> select dbms_random.value(10,20) from dual;
  8.  
  9. DBMS_RANDOM.VALUE(10,20)
  10. ------------------------
  11. 12.4079412

总结:

关于VALUE函数返回38位精度的小数,可通过以下方式验证。

  1. SQL> select dbms_random.value from dual;
  2.  
  3. VALUE
  4. ----------
  5. .511020102
  6.  
  7. SQL> col value for 999999.9999999999999999999999999999999999999999999999999
  8. SQL> select dbms_random.value from dual;
  9.  
  10. VALUE
  11. ---------------------------------------------------------
  12. .1590863051775181450023750363985770254400000000000
  13.  
  14. SQL> /
  15.  
  16. VALUE
  17. ---------------------------------------------------------
  18. .5831363280913832608492096535119024112700000000000

故意将value列的格式设置为999999.9999999999999999999999999999999999999999999999999,当然不限,只要小数位数超过38位即可,在本例中,为49位,通过dbms_random.value随机返回数值,不难发现,最后生成的数值虽然是49位,但最后11位均是0,换句话说,有效数值只有38位。

参考:

1. http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_random.htm#ARPLS040

2. http://zhangzhongjie.iteye.com/blog/1948930

Oracle之DBMS_RANDOM包详解的更多相关文章

  1. Oracle中dbms_random包详解

    Oracle之DBMS_RANDOM包详解参考自:https://www.cnblogs.com/ivictor/p/4476031.html https://www.cnblogs.com/shen ...

  2. ORACLE之UTL_FILE包详解

    1 Utl_File包简介Oracle的UTL_FILE包用来实现对磁盘文件的I/O操作.(1)Oracle10g之前的版本需要指定utl_file包可以操作的目录.      方法:        ...

  3. DBMS_RANDOM包详解

    DBMS_RAMDOM包中一共包含9个存储过程和函数,其中6个是现在用的,3个是已经过时的: 当前版本11gR2 每次生成一个随机数oracle都会初始化一个种子,也可以调用seed过程自己初始化一个 ...

  4. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  5. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  6. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  7. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

随机推荐

  1. JDK6环境下升级项目到springframework4.x和tomcat7.x

    springframework 3.x升级到 4.x  1 xsi:schemaLocation 对应的3.x->4.x 2 pom  springframework <propertie ...

  2. easyUI 的tree 修改节点,sql递归查询

    1.easyUI 的tree 修改节点: 我需要:切换语言状态,英文下, 修改根节点文本,显示英文. 操作位置:在tree的显示 $('#tree').tree(),onLoadSuccess事件方法 ...

  3. Vagrant 启用 rsync

    折腾了那么久,发现这些smb,nfs,virtualcfs,这些同步方案在windows下都不是最完美的.最完美的还是 rsync,我使用它同步windows上的代码,在windows浏览器中打开虚拟 ...

  4. linux-dns服务器搭建

    1.先查看系统是否安装了bind rpm -qa|grep bind 2.如果没有安装则

  5. jpa更新数据出错

    在更新表的一条记录时出错,错误为“java.sql.SQLException: Field 'is_del' doesn't have a default value”,表有一个属性isDel为Boo ...

  6. C++ REST SDK in Visual Studio 2013

    The C++ REST project provides a modern asynchronous C++ API for cloud-based client-server communicat ...

  7. [ASE][Daily Scrum]11.28

    昨天基本上已经完成了sprint2的task, 现在剩下一些bug还需要来修正, 然后我正式加入码代码的大军啦~ Shilin Liu  显示聊天框 Zhao Li     搭建聊天服务器 Yimin ...

  8. Replication的犄角旮旯(八)-- 订阅与发布异构的问题

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  9. 排序 via F#

    冒泡排序: let rec bsort_asc s = let rec _bsort_asc = function |x1::x2::xs when x1 > x2 -> match _b ...

  10. C#函数式编程

    提起函数式编程,大家一定想到的是语法高度灵活和动态的LISP,Haskell这样古老的函数式语言,往近了说ruby,javascript,F#也是函数式编程的流行语言.然而自从.net支持了lambd ...