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) 就是指定范围
- 首先确定2021年1月1日的日期整数:
select to_char(to_date(‘2021-01-01’, ‘yyyy-MM-dd’), ‘J’) from dual;
系统给的结果是: 2459216
- 生成指定范围[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