在Oracle数据库的日常开发和测试工作中,生成随机数据是常见需求,dbms_random是Oracle内置的随机数生成程序包,提供了多种生成随机数据的函数,能够满足不同场景下的随机数据生成要求。

dbms_random包基础说明
dbms_random是Oracle数据库自带的一个PL/SQL包,不需要额外安装,默认情况下所有用户都可以调用。它的核心功能是生成不同类型的随机数据,包括随机数字、随机字符串、正态分布随机数等。在使用前不需要特别的初始化操作,直接调用包内的函数即可。
核心函数用法详解
1. value函数:生成随机数字
value函数是dbms_random中最常用的函数,用于生成随机数值,有两种重载形式:
- 无参形式:生成大于等于0且小于1的随机浮点数
- 带参形式:value(low, high),生成大于等于low且小于high的随机数字
下面是具体的使用示例:
-- 生成0到1之间的随机浮点数 SELECT dbms_random.value FROM dual; -- 生成10到20之间的随机整数 SELECT TRUNC(dbms_random.value(10, 21)) AS random_int FROM dual; -- 生成10到20之间的随机浮点数,保留2位小数 SELECT ROUND(dbms_random.value(10, 20), 2) AS random_float FROM dual;
2. string函数:生成随机字符串
string函数用于生成指定类型和长度的随机字符串,语法为dbms_random.string(type, length),其中type参数指定字符串类型,可选值如下:
- u:大写字母组成的字符串
- l:小写字母组成的字符串
- a:大小写字母混合的字符串
- x:大写字母和数字混合的字符串
- p:任意可打印字符组成的字符串
使用示例:
-- 生成长度为8的大写字母随机字符串
SELECT dbms_random.string('u', 8) AS upper_str FROM dual;
-- 生成长度为10的数字和大写字母混合随机字符串
SELECT dbms_random.string('x', 10) AS mix_str FROM dual;
3. normal函数:生成正态分布随机数
normal函数用于生成符合正态分布的随机数,返回的数值均值为0,标准差为1。如果需要生成指定均值和标准差的正态分布随机数,可以通过公式转换实现。
使用示例:
-- 生成标准正态随机数 SELECT dbms_random.normal FROM dual; -- 生成均值为100,标准差为15的正态分布随机数 SELECT 100 + 15 * dbms_random.normal AS custom_normal FROM dual;
4. random函数:生成随机整数
random函数用于生成随机整数,返回值的范围是-2^31到2^31-1之间的整数,不需要传入参数。
-- 生成随机整数 SELECT dbms_random.random FROM dual;
随机种子设置
默认情况下,dbms_random每次调用生成的随机数序列都是不同的,如果需要生成可重复的随机序列,可以通过dbms_random.seed函数设置随机种子。设置相同的种子后,后续生成的随机数序列会完全一致,方便测试场景使用。
seed函数有两种重载形式:
- seed(num):传入数值类型的种子
- seed(str):传入字符串类型的种子
使用示例:
-- 设置数值种子
BEGIN
dbms_random.seed(123);
END;
/
-- 设置字符串种子
BEGIN
dbms_random.seed('test_seed');
END;
/
-- 两次执行下面的查询会得到相同的随机结果
SELECT dbms_random.value FROM dual;
常见使用场景
1. 随机排序查询结果
在查询中使用ORDER BY dbms_random.value可以实现结果的随机排序,适合需要随机展示数据的场景。
-- 随机排序员工表数据 SELECT empno, ename, job FROM emp ORDER BY dbms_random.value;
2. 随机抽样数据
结合value函数和where条件可以实现数据的随机抽样,比如抽取表中10%的数据。
-- 抽取emp表中10%的随机数据 SELECT * FROM emp WHERE dbms_random.value < 0.1;
3. 批量生成测试数据
在构造测试数据时,可以使用dbms_random生成随机的姓名、年龄、分数等字段,避免使用重复的固定数据。
-- 批量插入100条随机测试数据
INSERT INTO test_user (id, name, age, score)
SELECT level,
dbms_random.string('u', 5),
TRUNC(dbms_random.value(18, 61)),
ROUND(dbms_random.value(0, 100), 1)
FROM dual CONNECT BY level <= 100;
注意事项
- dbms_random生成的随机数是伪随机数,不是真正的随机数,设置相同种子会得到相同序列
- value函数生成的范围是两个参数的前闭后开区间,比如value(1,10)不会生成10
- 在批量生成随机数据时,不要频繁调用seed函数,否则可能导致随机性下降
- 如果需要更安全的随机数,可以考虑使用dbms_crypto包的相关函数,但dbms_random的性能更高,适合普通场景使用
dbms_randomOracle随机函数PL_SQL随机数生成修改时间:2026-07-02 07:21:16