dbms_random是oracle提供的一个pl/sql包,用于生成随机数据和字符。它具有以下函数。
其中,initialize,random,terminate函数在oracle11g中已不推荐使用,主要用于向后兼容。下面对各个函数进行举例说明
1. initialize
用一个种子值来初始化dbms_random包。
默认情况下,dbms_random包是根据用户、时间、会话来进行初始化,这样,即便是同一个语句,每次生成的数值都会不一样,但这样会产生一个问题,在测试环境下,如果我想每次生成的随机序列都是一样的,该怎么办?initialize函数就很好的解决了这一问题,通过设置相同的种子值,则每次生成的随机序列都将是一样的。
语法:
dbms_random.initialize (
val in binary_integer);
举例:
sql> begin
dbms_random.initialize(100);
for i in 1 .. 10 loop
dbms_output.put_line(dbms_random.random);
end loop;
end;
/
751599369
1131809137
-865013504
-407075626
-448154892
-1371178596
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;
举例:
sql> select dbms_random.normal from dual;
normal
----------
.321082788
3. random
random返回值的范围为: [-2^31, 2^31),返回的是整数。
语法:
dbms_random.random
return binary_integer;
举例:
sql> select dbms_random.random from dual;
random
----------
-1.363e+09
4. seed
功能和initialize函数类似,实际上,initialize函数被淘汰,推荐的替代函数即是seed函数。与initialize函数不同的是seed函数同时支持数值和字符作为种子值,而initialize函数只支持数值。
语法:
dbms_random.seed (
val in binary_integer);
dbms_random.seed (
val in varchar2);
举例:
begin
dbms_random.seed('hello');
for i in 1 .. 10 loop
dbms_output.put_line(round(dbms_random.value * 100));
end loop;
end;
输出如下:
58
71
33
4
39
53
93
37
20
5
其中,varchar2的最大范围为2000.
5. string
随机生成字符串
语法:
dbms_random.string
opt in char,
len in number)
return varchar2;
关于opt和len的说明,解释如下:
可见,opt指的是字符串的格式,len指的是字符串的长度。
举例:
sql> select dbms_random.string('u',10) value from dual;
value
--------------------
mcpezleqoo
sql> select dbms_random.string('l',10) value from dual;
value
--------------------
laufaqufln
sql> select dbms_random.string('a',10) value from dual;
value
--------------------
vjeetxlitt
sql> select dbms_random.string('x',10) value from dual;
value
--------------------
lamdgze22e
sql> select dbms_random.string('p',10) value from dual;
value
--------------------
4lf =q'(fp
6. terminate
在使用完dbms_random包后,用该函数进行终止。该函数在11gr1中即不推荐使用了。
语法:
dbms_random.terminate;
举例:
sql> exec dbms_random.terminate;
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。
举例:
sql> select dbms_random.value from dual;
value
----------
.291782963
sql> select dbms_random.value(10,20) from dual;
dbms_random.value(10,20)
------------------------
12.4079412
总结:
关于value函数返回38位精度的小数,可通过以下方式验证。
sql> select dbms_random.value from dual;
value
----------
.511020102
sql> col value for 999999.9999999999999999999999999999999999999999999999999
sql> select dbms_random.value from dual;
value
---------------------------------------------------------
.1590863051775181450023750363985770254400000000000
sql> /
value
---------------------------------------------------------
.5831363280913832608492096535119024112700000000000
