热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

Oracle生成随机数字、字符串、日期、验证码及UUID的方法

这篇文章主要介绍了Oracle生成随机数字、字符串、日期、验证码及UUID的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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


推荐阅读
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  •   上一篇博客中我们说到线性回归和逻辑回归之间隐隐约约好像有什么关系,到底是什么关系呢?我们就来探讨一下吧。(这一篇数学推导占了大多数,可能看起来会略有枯燥,但这本身就是一个把之前算法 ... [详细]
  • 深入理解K近邻分类算法:机器学习100天系列(26)
    本文详细介绍了K近邻分类算法的理论基础,探讨其工作原理、应用场景以及潜在的局限性。作为机器学习100天系列的一部分,旨在为读者提供全面且深入的理解。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 随着生活节奏的加快和压力的增加,越来越多的人感到不快乐。本文探讨了现代社会中导致人们幸福感下降的各种因素,并提供了一些改善建议。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
author-avatar
忧郁王囝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有