Oracle dbms_random函数用法快速生成多条测试数据

做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了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;

以上代码中并没有插入数据库中,若要插入只需要对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)
时间: 2024-11-05 04:13:18

Oracle dbms_random函数用法快速生成多条测试数据的相关文章

[转]Oracle dbms_random函数用法快速生成多条测试数据

做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法. 首先模拟一下100条的随机数据 [sql] view plaincopyprint? select rownum as id, to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime, trunc(dbms_rand

MySQL快速生成100W条测试数据

https://blog.csdn.net/qq_16946803/article/details/81870174 1.生成思路利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中 2.创建普通表及内存表普通表CREATE TABLE `vote_record` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NOT NULL, `vote_id` INT (11

mysql 快速生成百万条测试数据

转  https://blog.csdn.net/gooooa/article/details/54691590 1.生成思路 利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中 2.创建内存表及普通表 CREATE TABLE `vote_record_memory` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NOT NULL, `vote_id` INT

oracle trim函数用法详解

在oracle数据库中,trim一般都是用在删除字符串两边的空格.实际上,trim也可以用来删除字符串两边的指定字符.并且trim指定删除的字符串只能是单个字符Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识. 如果提到Oracle TRIM函数,最简单的功能就是使用它来去除字符串的行首和行尾的空格,这个功能也是大家使用频率最高的一种.然而Oracle TRIM函数其实是具有删除“任意指定”字

[转载]Oracle ltrim() 函数用法

前面有说到过LPAD和RPAD这两个函数用法的文章,今天发现与之相反意义的另外两个函数,那就是LTRIM() RTRIM(). 这次就挑LTRIM() 这一函数来讲讲: 具体的语法格式如下: LTRIM(c1,[,c2]) [功能]删除左边出现的字符串 [参数]C1 字符串,c2 追加字符串,默认为空格 [返回]字符型 接下来看看几个例子: [sql] view plain copy select ltrim('abcddee','abc') from dual; ----------输出结果

Oracle substr函数用法

oracle的substr函数的用法  取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] )  如:      substr('This is a test', 6, 2)     would return 'is'      substr('This is a test', 6)     would return 'is a test'      substr('TechOnTheNet', -3, 3)     

oracle decode函数用法

DECODE函数是ORACLE PL/SQL是功能强大的函数之中的一个,眼下还仅仅有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能.DECODE有什么用途 呢? 先构造一个样例,如果我们想给智星职员加工资,其标准是:工资在8000元下面的将加20%:工资在8000元以上的加15%.通常的做法是.先选出记录 中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else

oracle wm_concat函数用法

wmsys.wm_concat函数,它的作用是以','链接字符 例子如下: SQL> create table idtable (id number,name varchar2(30)); Table created SQL> insert into idtable values(10,'ab'); 1 row inserted SQL> insert into idtable values(10,'bc'); 1 row inserted SQL> insert into idt

oracle trunc()函数用法-1

1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去.忽略它则由最近的日期截去 下面是该函数的使用情况: TRUNC(TO_DATE('24-Nov-1999 08:00 pm','dd-mon-yyyy hh:mi am')) ='24-Nov-1999 12:00:00 am'