您现在的位置是:群英 > 数据库 > 关系型数据库
Oracle中生成随机数字、字符串、日期和记录的方法是什么
Admin发表于 2022-07-08 17:46:301583 次浏览
这篇文章分享给大家的内容是关于Oracle中生成随机数字、字符串、日期和记录的方法是什么,本文介绍得很详细,内容很有参考价值,希望可以帮到有需要的小伙伴,接下来就让小编带领大家一起了解看看吧。

 


在日常生活中,随机数对于我们而言并不陌生,例如手机短信验证码就是一个随机的数字字符串;对于统计分析、机器学习等领域而言,通常也需要生成大量的随机数据用于测试、数据抽样、算法验证等。那么今天我们就来谈谈如何在 Oracle 数据库中生成随机数据。

计算机生成的都是伪随机数,并不是真正的物理随机数。

生成随机数字

Oracle 提供了一个系统程序包 DBMS_RANDOM,可以用于生成随机数据,例如随机数字、随机字符串等。

生成 0 到 1 之间的随机数

DBMS_RANDOM.VALUE 函数可以用于生成一个大于等于 0 小于 1 的随机数字。例如:

SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.82366672879802619203358096665727275462|

SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.47093028485681981896753470853250955607|

DBMS_RANDOM.VALUE 函数返回的数据包含 38 位小数,每次返回不同的数据。

有时候,例如测试时,我们想要确保每次运行时生成相同的随机数。这种情况下,我们可以使用存储过程 DBMS_RANDOM.SEED 设置一个随机数种子,然后再创建随机数就可以返回固定的数值。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.75096444209816859425547820733985992585|

CALL dbms_random.seed(1);
SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.75096444209816859425547820733985992585|

从结果可以看出,相同的种子返回了相同的随机数。每次运行随机数函数之前,都需要执行一次 DBMS_RANDOM.SEED 过程。

除了整数类型的种子数之外,也可以使用字符串作为随机数的种子。

生成指定范围内的随机数

DBMS_RANDOM.VALUE 函数也可以接收两个输入参数:

DBMS_RANDOM.VALUE(
 low IN NUMBER,
 high IN NUMBER)
RETURN NUMBER;

这种形式的函数将会返回一个大于等于 low,小于 high 的随机数。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.value(10, 20) FROM dual;
DBMS_RANDOM.VALUE(10,20)  |
----------------------------------------|
17.5096444209816859425547820733985992585|

以上示例返回了一个大于等于 10,小于 20 的数字。

如果想要生成某个范围内的随机整数,可以利用 DBMS_RANDOM.VALUE 加上 TRUNC 函数实现。例如:

CALL dbms_random.seed(1);
SELECT trunc(dbms_random.value(10, 20)) v FROM dual;
V |
--|
17|

 

注意,以上语句返回的是大于等于 10,小于等于 19(不是 20)的整数。

生成 6 位数字手机验证码

以下语句可以用于生成一个由 6 位数字字符组成的验证码:

CALL dbms_random.seed(0);
SELECT lpad(trunc(dbms_random.value(0, 1000000)),6,'0') captcha FROM dual;
CAPTCHA|
-------|
063365 |

lpad 函数可以确保数据不够 6 位时在前面补足 0。

生成标准正态分布随机数

DBMS_RANDOM.VALUE 函数生成的是一个均匀分布的随机数,而 DBMS_RANDOM.NORMAL 函数可以用于返回一个遵循标准正态分布(期望值为 0,标准差为 1)的随机数。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.normal FROM dual;
NORMAL     |
------------------------------------------|
0.4116858715102697161411270380245532257962|

生成随机字符串

生成固定长度的随机字符串

除了随机数字之外,DBMS_RANDOM.STRING 函数可以用于产生一个随机字符串:

DBMS_RANDOM.STRING
 opt IN CHAR,
 len IN NUMBER)
 RETURN VARCHAR2;

其中,参数 opt 可以指定返回字符串的类型:

  • ‘u', ‘U',返回由大写字母组成的字符串;
  • ‘l', ‘L',返回由小写字母组成的字符串;
  • ‘a', ‘A',返回由大小写混合字母组成的字符串;
  • ‘x', ‘X',返回由大写字母和数字组成的字符串;
  • ‘p', ‘P',返回由任意可打印字符组成的字符串;
  • 其他参数,返回由大写字母组成的字符串。

参数 len 表示返回字符串的长度。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.string('p', 10) FROM dual;
DBMS_RANDOM.STRING('P',10)|
--------------------------|
gqB!U5t^a6  |

以上示例返回了一个长度为 10,由任意可打印字符组成的随机字符串。

生成可变长度的随机字符串

那么,怎么返回一个长度可变的随机字符串呢?很简单,将 DBMS_RANDOM.STRING 和 DBMS_RANDOM.VALUE 函数结合一下就可以了。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.string('p', trunc(dbms_random.value(10,21))) AS random_string FROM dual;
RANDOM_STRING |
------------------|
qB!U5t^a6ZFUoIw|O^|

以上示例返回了一个随机长度大于等于 10 且小于等于 20,由任意可打印字符组成的随机字符串。

生成随机日期

将指定日期或者时间戳增加一个随机的数字,就可以得到随机的日期和时间戳。例如:

CALL dbms_random.seed(1);
SELECT trunc(date '2020-01-01'+dbms_random.value(0,31)) rand_date,
 timestamp '2020-01-01 00:00:00'+dbms_random.value(0,31) rand_ts
FROM dual;
RAND_DATE  |RAND_TS  |
-------------------|-------------------|
2020-01-24 00:00:00|2020-01-27 16:07:37|

以上示例返回了 2020 年 1 月中的某个随机日期和时间戳。

获取随机记录

对于查询语句,如果返回多行数据,DBMS_RANDOM 程序包中的函数会返回不同的随机数据。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.value FROM employee;
VALUE     |
----------------------------------------|
0.75096444209816859425547820733985992585|
0.86038577935739084599473227591041135085|
0.36531856164744564910966598428812048036|
...

利用这个特性,我们可以从表中返回随机的数据行。例如:

CALL dbms_random.seed(1);
SELECT emp_id, emp_name
FROM employee 
ORDER BY dbms_random.value
FETCH FIRST 5 ROWS ONLY;
EMP_ID|EMP_NAME |
------|---------|
 10|廖化 |
 24|简雍 |
 20|蒋琬 |
 6|魏延 |
 4|诸葛亮 |

以上示例从 employee 表中返回了随机的 5 行数据。

另外,Oracle 还提供了一个 SAMPLE 子句,可以用于返回按照百分比指定的随机抽样数据。例如:

SELECT emp_id, emp_name
FROM employee sample (10) seed(1);
EMP_ID|EMP_NAME |
------|---------|
 4|诸葛亮 |
 5|黄忠 |
 16|周仓 |

以上示例返回了 employee 表中抽样 10% 的随机数据(employee 表共计有 25 条数据),seed 用于设置随机抽样的种子。

️SAMPLE 子句是一种基于数据库统计信息的预估,如果统计数据不准确,查询结果可能会存在较大偏差。

生成 UUID

UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。

Oracle 提供了一个系统函数 SYS_GUID(),可以用于生成 GUID。例如:

SELECT rawtohex(sys_guid()) FROM dual;
RAWTOHEX(SYS_GUID())  |
--------------------------------|
ACCDB38D17FA1103E05579D90B3808D7|

如果想要生成带中划线(-)的 UUID,可以创建以下自定义函数:

CREATE OR REPLACE FUNCTION new_guid
RETURN varchar2
AS
 lv_guid varchar(32);
BEGIN
 lv_guid:=rawtohex(sys_guid());
 RETURN substr(lv_guid,1,8) || '-'
 ||substr(lv_guid,9,4) || '-'
 ||substr(lv_guid,13,4)|| '-'
 ||substr(lv_guid,17,4)|| '-'
 ||substr(lv_guid,21,12);
END;
/

new_guid 函数只是基于系统函数 sys_guid 返回的结果增加了 4 个中划线。试用一下:

SELECT new_guid() FROM dual;
NEW_GUID()    |
------------------------------------|
ACCDB38D-17FD-1103-E055-79D90B3808D7|

总结

本文总结了在 Oracle 数据库中使用系统程序包 DBMS_RANDOM 生成随机数据的方法,包括随机数字、验证码、随机字符串以及随机日期和时间等,同时还介绍了如何从表中返回随机记录,以及如何生成 UUID。


以上就是关于Oracle中生成随机数字、字符串、日期和记录的方法是什么的介绍啦,需要的朋友可以参考上述内容,希望对大家有帮助,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-05-17 14:28:53 
摘要:mysql将字符串转为数字的方法:1、利用“+”运算符,语法“'字符串' + 0”;2、利用cast()函数,语法“cast('字符串' as 数值类型)”;3、利用convert()函数,语法“convert('字符串', 数值类型)”。
2022-07-12 17:56:43 
摘要:这篇文章主要介绍了Oracle体系结构的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-05-09 18:00:20 
摘要:在mysql中,外键是用于建立和加强两个表数据之间的链接的一列或多列,它表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参照完整性。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部