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;