oracle快速生成上千万条测试数据

话不多说直接上代码

insert into student
(ID,XM,ZJH,ZL,DJSJ,XYSJ)
select rownum as ID,
              dbms_random.string('x',2) as XM,
              trunc(dbms_random.value(100000000000000000,999999999999999999)) as ZJH,
              decode(trunc(dbms_random.value(1,3)),1,'11111111',
                                                   2, 'abcdefg',
                                                   3,'返回值可以是数字,字符串,汉字等'
                                                   )as ZL,
              to_char(sysdate+rownum/24/3600,'yy-mm-dd hh24:mi:ss') as DJSJ,
              systimestamp as XYSJ
from xmltable('1 to 10000000')

上面SQL是利用了Oracle数据库语法的几个实用小技巧实现的:
1、利用xmltable(在10g开始支持XML后可用),如本例中的from xmltable(‘1 to 10000000’)即表示生成1000万条数据,也可以利用Oracle特有的“connect by”树形连接语法生成测试记录,只是将

from xmltable(‘1 to xx’)
换成
from dual
connect by level <= xx;

例“level <= 10”表示要生成10记录,但是connect by level有上限,如果超出上限,系统会报,"connect by level"内存不足,我试过100万条数据可以,但是再多就不行了,
2、利用rownum虚拟列生成递增的整数数据;
3、利用sysdate函数加一些简单运算来生成日期数据,本例中是每条记录的时间加1秒;
4、利用dbms_random.value函数生成随机的数值型数据,然后用trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去,本例中是生成100000000000000000到999999999999999999之间的随机整数;
5、利用dbms_random.string函数生成随机的字符型数据,本例中是生成长度为2的随机字符串,字符串中可以包括字符或数字。
6、to_char(sysdate + rownum, ‘yyyy-mm-dd hh24:mi:ss’) 这里是转换为字符串,如果该字段的类型为TimeStamp时间戳,那这里可以改写一下方法,转换为时间戳 to_timestamp(sysdate + rownum, ‘yyyy-mm-dd hh24:mi:ss’)
7、使用了decode函数,decode函数的格式为:decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值),使用trunc(dbms_random.value(1,3))随机产生数字1,2,3,再分别对应不同的返回值(返回值可以是数字,字符串,汉字等),即可实现随机插入汉字列。
8、systimestamp函数返回本机数据库上当前系统日期和时间(包括微秒和时区)。
转载请注明出处:

你可能感兴趣的:(数据库相关,oracle)