DBMS_RANDOM包

DBMS_RANDOM包是一个标准的工具包,用来生产随机数或随机字符。

表1展示了DBMS_RANDOM包的子程序。

DBMS_RANDOM包子程序 说明 过程/函数
VALUE 获取随机数值 函数
STRING 获取随机字符 函数
RANDOM 获取-power(2,31)到power(2,31)之间的整数(ORACLE 11gR1中已废弃) 函数
NORMAL 生成一个符合正态分布的随机数 函数
SEED 生成随机数种子 过程
INITIALIZE 调用SEED(ORACLE 11gR1中已废弃) 过程

示例:

-- 默认生成[0.0,1.0)区间内的随机数
SELECT dbms_random.value() as dbms_random_values_result;
DBMS_RANDOM_VALUES_RESULT(numeric)      |
----------------------------------------
0.54798691802060324125971045797694856658|
总数目:1


-- 生成[1.0-5.0)区间内的随机数
SELECT dbms_random.value(1,5) as dbms_random_values_result;
DBMS_RANDOM_VALUES_RESULT(numeric)      |
----------------------------------------
2.3254120599229507078764454263209360578 |
总数目:1


-- 生成一个标准正态分布中随机数
SELECT dbms_random.normal() as dbms_random_normal_result;
DBMS_RANDOM_NORMAL_RESULT(numeric)      |
----------------------------------------
0.76004213352004465526300119573343447294|
总数目:1


-- 生成一个[-power(2,31) , power(2,31))区间内的随机数
SELECT dbms_random.random();
RANDOM(int)      |
-----------------
-2139014452      |
总数目:1


-- 参数'A'为生成大写和小写字母,'U'为大写字母,'L'为小写字母,'X'是字母和数字,'P'是可打印字符
select dbms_random.string('A', 6) UppercaseAndLowercase,dbms_random.string('U', 6) Uppercase ,dbms_random.string('L', 6) Lowercase ,dbms_random.string('X', 6) NumAndChar,dbms_random.string('P', 6) PrintableChar;
UPPERCASEANDLOWERCASE(varchar)      |UPPERCASE(varchar)      |LOWERCASE(varchar)      |NUMANDCHAR(varchar)      |PRINTABLECHAR(varchar)      |
-----------------------------------------------------------------------------------------------------------------------------------------
HXTdjq                              |OXMGNE                  |dyjhsv                  |JV7SRK                   |CQ:Bom                      |
总数目:1

-- 第一个参数忽略大小写
select dbms_random.string('a', 6) UppercaseAndLowercase,dbms_random.string('u', 6) Uppercase ,dbms_random.string('l', 6) Lowercase ,dbms_random.string('x', 6) NumAndChar,dbms_random.string('p', 6) PrintableChar;
UPPERCASEANDLOWERCASE(varchar)      |UPPERCASE(varchar)      |LOWERCASE(varchar)      |NUMANDCHAR(varchar)      |PRINTABLECHAR(varchar)      |
-----------------------------------------------------------------------------------------------------------------------------------------
RGCdCj                              |DOUDJD                  |gykeux                  |C7FJJ0                   |UQ{]yQ                      |
总数目:1

-- 当第一个参数为其他字符时返回大写字母
SELECT dbms_random.string('!',5);
STRING(varchar)      |
---------------------
QXBOU                |
总数目:1

-- 清理环境
DROP PROCEDURE RANDOM_SEED_TEST cascade;
DROP PROCEDURE RANDOM_SEED_TEST2 cascade;
DROP PROCEDURE RANDOM_SEED_TEST3 cascade;


CREATE OR REPLACE PROCEDURE RANDOM_SEED_TEST AS
BEGIN
	FOR I IN REVERSE 1..3 LOOP
	SELECT dbms_random.string('a',5);
	END LOOP;
END;

/ 

-- 未调用SEED的情况下,每次生成的随机字符都不同
EXEC RANDOM_SEED_TEST;
STRING(varchar)      |
---------------------
dsPbH                |
总数目:1
STRING(varchar)      |
---------------------
VExqq                |
总数目:1
STRING(varchar)      |
---------------------
fycZm                |
总数目:1

CREATE OR REPLACE PROCEDURE RANDOM_SEED_TEST2 AS
BEGIN
	FOR I IN REVERSE 1..3 LOOP
	dbms_random.seed(1);
	SELECT dbms_random.string('a',5);
	END LOOP;
END;

/

-- 调用SEED并赋予相同参数时,每次生成的随机字符相同
EXEC RANDOM_SEED_TEST2;
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1


CREATE OR REPLACE PROCEDURE RANDOM_SEED_TEST3 AS
BEGIN
	FOR I IN REVERSE 1..3 LOOP
	dbms_random.initialize(1);
	SELECT dbms_random.string('a',5);
	END LOOP;
END;

/

-- INITIALIZE实际就是调用一次SEED
EXEC RANDOM_SEED_TEST3;
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1
STRING(varchar)      |
---------------------
nsSAd                |
总数目:1


-- SEED参数也可以是字符
CREATE OR REPLACE PROCEDURE RANDOM_SEED_TEST4 AS
BEGIN
	FOR I IN REVERSE 1..3 LOOP
	dbms_random.seed('!');
	SELECT dbms_random.string('a',5);
	END LOOP;
END;

/

EXEC RANDOM_SEED_TEST4;
STRING(varchar)      |
---------------------
yfnOB                |
总数目:1
STRING(varchar)      |
---------------------
yfnOB                |
总数目:1
STRING(varchar)      |
---------------------
yfnOB                |
总数目:1
-- initialize不支持字符参数
EXEC dbms_random.initialize('!');
ERROR, Bad numeric input format '!'

-- 清理环境
DROP PROCEDURE RANDOM_SEED_TEST;
DROP PROCEDURE RANDOM_SEED_TEST2;
DROP PROCEDURE RANDOM_SEED_TEST3;
DROP PROCEDURE RANDOM_SEED_TEST4;