oracle dbms_random重复可能性,Oracle dbms_random函数用法快速生成多条测试数据

本文详细介绍了如何在Oracle数据库中利用SQL语句快速生成大量测试数据,包括使用rownum、sysdate、dbms_random等函数,以创建随机的ID、日期、数字和字符串。这些技巧对于数据库开发者在进行测试和性能调优时能显著提高效率。
摘要由CSDN通过智能技术生成

做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法。

首先模拟一下100条的随机数据

select rownum as id,

to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,

trunc(dbms_random.value(0, 100)) as random_id,

dbms_random.string('$', 20) random_string

from dual

connect by level <= 100;

0818b9ca8b590ca3270a3433284dd417.png

以上代码中并没有插入数据库中,若要插入只需要对sql上增加create table 表 as  或 insert into select方式

上面SQL是利用了Oracle数据库语法的几个实用小技巧实现的:

1、利用Oracle特有的“connect by”树形连接语法生成测试记录,“level <= 10”表示要生成10记录;

2、利用rownum虚拟列生成递增的整数数据;

3、利用sysdate函数加一些简单运算来生成日期数据,本例中是每条记录的时间加1秒;

4、利用dbms_random.value函数生成随机的数值型数据,本例中是生成0到100之间的随机整数;

5、利用dbms_random.string函数生成随机的字符型数据,本例中是生成长度为20的随机字符串,字符串中可以包括字符或数字。

dbms_random.函数中的参数介绍

-- **************************************** 随机数字 ***************************************************

select decode(trunc(dbms_random.value(0, 2)),'0','女','1','男') from dual

select length(dbms_random.random) from dual; -- 产生一个任意长度为9,10,11位的数字

select abs(mod(dbms_random.random,100)) from dual; -- 产生一个100以内的随机数

select trunc(10+90*dbms_random.value) from dual; -- 产生10~100之间的任意2位随机整数(包含10,不包含100)

select dbms_random.value from dual; -- 产生一个大于0小于1的随机数小数(小数点后37或38位长度)

select dbms_random.value(10,20) from dual; -- 产生一个大于10小于20的随机数小数(小数点后38位)

select dbms_random.normal from dual; -- normal函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

-- **************************************** 随机日期 ***************************************************

select to_date(trunc(dbms_random.value(to_number(to_char(sysdate-10, 'J')), to_number(to_char(sysdate, 'J')))), 'J') from dual; -- 在过去10天内取随机日期

select (sysdate - 1 / 24 / 60 * 30) + dbms_random.value (1, 1800) / 3600 / 24 from dual; -- 在过去30分钟内取随机时间

select to_date(to_char(to_date('2015-01-01', 'yyyy-MM-dd'), 'J') + trunc(DBMS_RANDOM.VALUE(0, 365)), 'J') from dual; -- 查询2015年中的任意日期

-- 在指定日期范围内取随机时间

select to_date(trunc(dbms_random.value(to_number(to_char(to_date('20150501', 'yyyymmdd'),'J')),

to_number(to_char(to_date('20150531', 'yyyymmdd') + 1, 'J')))

), 'J') + dbms_random.value(1, 3600) / 3600 prize_time

from dual;

-- 从现在开始到过去的100年之间的任意时刻

select to_date(trunc(dbms_random.value(

to_number(to_char(add_months(sysdate,-100 * 12),'J')),

to_number(to_char(sysdate + 1, 'J')))

), 'J') + dbms_random.value(1, 3600) / 3600 from dual;

-- **************************************** 随机字符(产生任意长度为20的字符串) ***************************************************

select dbms_random.string('u', 20) from dual -- 'u', 'U' 返回全是大写的字符串(uppercase) 测算发现,只要参数不是一个中文或全角字符,返回数据均是大写

select dbms_random.string('l', 20) from dual -- 'l', 'L' - 返回全是小写的字符串(lowercase)

select dbms_random.string('a', 20) from dual -- 'a', 'A' - 返回大小写结合的字符串(mixed case)

select dbms_random.string('x', 20) from dual -- 'x', 'X' - 返回全是大写和数字的字符串(uppercase,alpha&numeric)

select dbms_random.string('p', 20) from dual -- 'p', 'P' - 返回键盘上出现字符的随机组合(any printable char)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值