作用说明:
DBMS_RANDOM包提供了一个内置的随机数生成器。里面包含了很多的方法。
DBMS_RANDOM子程序的摘要:
方法 描述 用种子值初始化包。
返回正态分布中的随机数。
生成一个随机数。
重置种子。
获取一个随机字符串。
终止包。
一个版本获得一个大于或等于0且小于1的随机数,小数点右边有38位(38位精度)。另一个版本获得一个随机Oracle数据库号x,其中x大于或等于一个指定的下限,而小于一个指定的上限。
常用方法案例:
1. DBMS_RANDOM.RANDOM方法:
语法:DBMS_RANDOM.RANDOM RETURN binary_integer;
说明:random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数(正或负)。
SQL> SELECT DBMS_RANDOM.RANDOM FROM DUAL;
RANDOM
----------
-900131307
--产生一个任意大小的随机正数
SQL> SELECT abs(DBMS_RANDOM.RANDOM/100) FROM DUAL;
ABS(DBMS_RANDOM.RANDOM/100)
---------------------------
19653484.99
--产生一个100以内的随机正数(mod取余,可指定其它数字以内的数)
SQL> SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;
ABS(MOD(DBMS_RANDOM.RANDOM,100
------------------------------
28
2.DBMS_RANDOM.VALUE用法:有两种用法
语法:
DBMS_RANDOM.VALUE RETURN NUMBER; DBMS_RANDOM.VALUE( low IN NUMBER, high IN NUMBER) RETURN NUMBER;
FUNCTION value RETURN NUMBER;
说明:这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0。
示例:
--产生一个0~1之间的随机数
sql>SELECT dbms_random.value FROM dual;
VALUE
----------
0.24031434
--产生一个100~1000之间的随机数,不带小数(trunc)
sql>SELECT TRUNC(100+900*DBMS_RANDOM.VALUE) FROM dual;
TRUNC(100+900*DBMS_RANDOM.VALUE)
--------------------------------
122
-
FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
说明:value带有两个参数,第一个指下限,第二个指上限,将会生成下限到上限之间的数字,但不包含上限。
示例:
--产生一个10~20之间的随机数
sql>SELECT dbms_random.value(10,20) FROM dual;
DBMS_RANDOM.VALUE(10,20)
------------------------
16.5068343718981
3.DBMS_RANDOM.NORMAL用法:
语法:DBMS_RANDOM.NORMAL RETURN NUMBER;
说明:获取正态分布的随机数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。
示例:
SQL> exec dbms_output.put_line(round(dbms_random.normal));
1
PL/SQL procedure successfully completed
SQL> exec dbms_output.put_line(round(dbms_random.normal));
0
PL/SQL procedure successfully completed
SQL> exec dbms_output.put_line(round(dbms_random.normal));
-1
PL/SQL procedure successfully completed
SQL> exec dbms_output.put_line(round(dbms_random.normal));
0
PL/SQL procedure successfully completed
SQL> exec dbms_output.put_line(round(dbms_random.normal));
1
PL/SQL procedure successfully completed
SQL> exec dbms_output.put_line(round(dbms_random.normal));
-2
PL/SQL procedure successfully completed
4.dbms_random.string用法:
语法:
DBMS_RANDOM.STRING opt IN CHAR, len IN NUMBER) RETURN VARCHAR2;
说明:某些用户管理程序可能需要为用户创建随机的密码。使用10G下的dbms_random.string 可以实现这样的功能。
参数:opt :
■ '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-numericcharacters >大写字母和数字混合
■ 'p', 'P' - returning string in any printable characters. >任意可显示字符
Otherwise the returning string is in uppercase alphacharacters. >当选项为其他字母的时候返回的内容仍将是大写字母
len :表示返回的字符串长度。
SQL> SELECT DBMS_RANDOM.STRING('u', 10) FROM DUAL
2 UNION ALL
3 SELECT DBMS_RANDOM.STRING('U', 10) FROM DUAL
4 UNION ALL
5 SELECT DBMS_RANDOM.STRING('l', 10) FROM DUAL
6 UNION ALL
7 SELECT DBMS_RANDOM.STRING('L', 10) FROM DUAL
8 UNION ALL
9 SELECT DBMS_RANDOM.STRING('a', 10) FROM DUAL
10 UNION ALL
11 SELECT DBMS_RANDOM.STRING('A', 10) FROM DUAL
12 UNION ALL
13 SELECT DBMS_RANDOM.STRING('x', 10) FROM DUAL
14 UNION ALL
15 SELECT DBMS_RANDOM.STRING('X', 10) FROM DUAL
16 UNION ALL
17 SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL
18 UNION ALL
19 SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL;
DBMS_RANDOM.STRING('U',10)
--------------------------------------------------------------------------------
XZMZMEOIDC
ZXYHCYGLUX
gbyajvsacl
wtrbzznbvq
TOxeaGftRN
zjyMaNpJze
NF2T5ZWGCX
LMPQHR6JWP
'`a%bD"J6}
X.NvIQ9s$q
10 rows selected
5.dbms_random.seed用法
语法:
DBMS_RANDOM.SEED ( val IN BINARY_INTEGER); DBMS_RANDOM.SEED ( val IN VARCHAR2);
说明:用于生成一个随机数种子,设置种子的目的是可以重复生成随机数,用于调试。否则每次不同,难以调度。
--可以设置seed来确定随机数的起始点,对于相同的seed而言,随机数的任意一次变化都将是确定的。
– 就是说,如果在某一时刻调用了seed,之后第一次产生的随机数是4,第二次是6,第三次是1,
– 那么当你再次调用相同的seed之后,一次产生的随机数还是4、6、1
– seed有两种,一种是数 型的,一种是字符型(最大长度2000)的
--session1
SELECT USERENV('SESSIONID') FROM DUAL;
USERENV('SESSIONID')
--------------------
865219
SQL> BEGIN
dbms_random.seed(100);
END;
/
PL/SQL procedure successfully completed
SQL> SELECT DBMS_RANDOM.value
FROM DUAL
CONNECT BY LEVEL < 10;
VALUE
----------
0.53801770
0.67499536
0.65362270
0.76351985
0.29859834
0.40522032
0.99551636
0.39565580
0.18074760
--SESSION 2
SQL> SELECT USERENV('SESSIONID') FROM DUAL;
USERENV('SESSIONID')
--------------------
SQL> BEGIN
dbms_random.seed(100);
END;
/
PL/SQL procedure successfully completed
SQL> SELECT DBMS_RANDOM.value FROM DUAL
CONNECT BY LEVEL < 10;
VALUE
----------
0.53801770
0.67499536
0.65362270
0.76351985
0.29859834
0.40522032
0.99551636
0.39565580
0.18074760
注意:当随机数据做为过滤条件时如下这么写:会找不到数据、多行
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
3
2
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
1
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
1
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
1
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
2
1
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
3
2
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
3
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
1
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
1
2
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
2
1
2
SQL> SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
COL
----------
3
1
2
1
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
1
1
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
3
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
1
1
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
2
2
SQL> SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
COL
----------
1
1
供参考。