Oracle随机数dbms_random测试

Oracle随机数dbms_random测试

dbms_random是一个可以生成随机数值或者字符串的程序包。这个包有initialize()、seed()、terminate()、value()、normal()、random()、string()等几个函数。

1.dbms_random.value方法

value()是最常用的,value()的用法一般有两种:

第一 种function value return number;
这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0,

SQL> col value format a30
SQL> select dbms_random.value from dual;

                         VALUE
------------------------------
             0.869799755266926


第二种value带有两个参数,第一个指下限,第二个指上限,将会生成下限到上限之间的数字,但不包含上限。

SQL> select dbms_random.value(1,10) from dual;

DBMS_RANDOM.VALUE(1,10)
-----------------------
       2.31558044393352


2.dbms_random.string 方法

某些用户管理程序可能需要为用户创建随机的密码。使用11g下的dbms_random.string 可以实现这样的功能。

第一个参数的含义:
■ ‘u’, ‘U’ - returning string in uppercase alpha characters
■ ‘l’, ‘L’ - returning string in lowercase alpha characters
■ ‘a’, ‘A’ - returning string in mixed case alpha characters
■ ‘x’, ‘X’ - returning string in uppercase alpha-numeric characters
■ ‘p’, ‘P’ - returning string in any printable characters. Otherwise the returning string is in uppercase alpha
characters.
P 表示 printable,即字符串由任意可打印字符构成

而第二个参数表示返回的字符串长度。

SQL> col value format a20
--大写
SQL> select dbms_random.string('u',20) from dual;

DBMS_RANDOM.STRING('U',20)
--------------------------------------------------------------------------------
DXQHUNPVWAGHLJQVCQCJ
--小写
SQL> select dbms_random.string('L',20) from dual;

DBMS_RANDOM.STRING('L',20)
--------------------------------------------------------------------------------
gciiqzxuesclyvbljbnj
--大小写混合
SQL> select dbms_random.string('a',20) from dual;

DBMS_RANDOM.STRING('A',20)
--------------------------------------------------------------------------------
sNTCNriTUJeDRWmvezaN
--大写字母数字混合
SQL> select dbms_random.string('x',20) from dual;

DBMS_RANDOM.STRING('X',20)
--------------------------------------------------------------------------------
R4ZW7FE8FFFYWGEUGRZ6
--可打印字符
SQL> select dbms_random.string('p',20) from dual;

DBMS_RANDOM.STRING('P',20)
--------------------------------------------------------------------------------
qy=l_8&Z/`@W1gM&ah;c

3.dbms_random.random 方法

random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数

与dbms_random.value 的区别举例:
Order By dbms_random.value; 这条语句功能是实现记录的随机排序
另外:
dbms_random.value 和dbms_random.random 两者之间有什么区别?

  • Order By dbms_random.value ,为结果集的每一行计算一个随机数,dbms_random.value 是结果集的一个列(虽然这个列并不在select list 中),然后根据该列排序,得到的顺序自然就是随机的啦。
  • 看看desc信息便知道value和random这两个函数的区别了,value返回的是number类型,并且返回的值介于1和0之间,而random返回的是BINARY_INTEGER类型

如果你要实现随机排序,还是用value函数

random生成一个从-power(2,31)到power(2,31)的整数值,注意,区间为左闭右开。

官方说明为:The RANDOM function produces integers in the range [-2^^31, 2^^31).

SQL> select dbms_random.random from dual;

    RANDOM
----------
  -7765356

SQL> 
SQL> select dbms_random.random from dual;

    RANDOM
----------
-206540981

4.dbms_random.normal方法

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

SQL> select dbms_random.normal from dual;

    NORMAL
----------
1.86750562

5.dbms_random.seed方法

用于生成一个随机数种子,设置种子的目的是可以重复生成随机数,用于调试。否则每次不同,难以调度。

BEGIN
   dbms_random.seed('seed');
   FOR i IN 1 .. 10 LOOP
      dbms_output.put_line(round(dbms_random.value * 100));
   END LOOP;
END;
/
--输出
16
21
87
83
62
56
94
41
30
7

6.随机日期

生成一个2021年内的任意日期:

分析:2021年内的任意日期,即日期范围是(2021-01-01, 2021-12-31)

可以转化为 2021-01-01 + (0, 365),

其中,2021-01-01 就是指定日期, (0, 365) 就是指定范围

  1. 首先确定2021年1月1日的日期整数:

select to_char(to_date(‘2021-01-01’, ‘yyyy-MM-dd’), ‘J’) from dual;

系统给的结果是: 2459216

  1. 生成指定范围[min_value, max_value]内的随机日期:

select to_date(2459216+ trunc(DBMS_RANDOM.VALUE(0, 365)), ‘J’) from dual;

SQL> select to_char(to_date('2021-01-01', 'yyyy-MM-dd'), 'J') as name from dual;

NAME
------------------------------------
2459216

SQL> select to_date(2459216+ trunc(DBMS_RANDOM.VALUE(0, 365)), 'J') as name from dual;

NAME
------------------------------------
2021-4-18

SQL> select to_date(2459216+ trunc(DBMS_RANDOM.VALUE(0, 365)), 'J') as name from dual;

NAME
------------------------------------
2021-5-7

生成随机日期+时间 ,生产2015年1月1日到2015年12月31日之间的日期。

select to_date(trunc(dbms_random.value(
       to_number(to_char(to_date('20150101','yyyymmdd'),'J')),
       to_number(to_char(to_date('20151231','yyyymmdd')+1,'J')))),'J')+
       dbms_random.value(1,3600)/3600
       random_time
from dual; 

执行结果:
	2015-12-15 23:21:14

7.生成GUID

全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID

Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(sequence)相比具有诸多优势。一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。   
  序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。

SQL>  col name format a36
SQL> select sys_guid() name from dual;

NAME
------------------------------------
CC291CBD948542B9E053270613AC8A49

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值