音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

Oracle生成随机数字、字符串、日期、验证码及 UUID的方法
日期:2021-02-04 11:17:48   来源:脚本之家

在日常生活中,随机数对于我们而言并不陌生,例如手机短信验证码就是一个随机的数字字符串;对于统计分析、机器学习等领域而言,通常也需要生成大量的随机数据用于测试、数据抽样、算法验证等。那么今天我们就来谈谈如何在 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生成随机数字、字符串、日期、验证码及 UUID的方法的文章就介绍到这了,更多相关Oracle生成随机数UUID内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    MsSqlMysqloracleMariaDBSQLiteDB2