zoukankan      html  css  js  c++  java
  • [转]Oracle dbms_random函数用法快速生成多条测试数据

    Java 随机生成中文姓名,手机号,邮编,住址:http://blog.csdn.net/xiaokui_wingfly/article/details/45913885

    Java 批量随机生成身份证号码:http://blog.csdn.net/xiaokui_wingfly/article/details/45893791

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

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

    1. select rownum as id,  
    2.        to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,  
    3.        trunc(dbms_random.value(0, 100)) as random_id,  
    4.        dbms_random.string('$', 20) random_string  
    5.   from dual  
    6. 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.函数中的参数介绍

      1. -- ****************************************  随机数字  ***************************************************  
      2. select decode(trunc(dbms_random.value(0, 2)),'0','女','1','男') from dual  
      3. select length(dbms_random.random) from dual;  -- 产生一个任意长度为9,10,11位的数字  
      4. select abs(mod(dbms_random.random,100)) from dual;  -- 产生一个100以内的随机数  
      5. select trunc(10+90*dbms_random.value) from dual;  -- 产生10~100之间的任意2位随机整数(包含10,不包含100)  
      6. select dbms_random.value from dual;   -- 产生一个大于0小于1的随机数小数(小数点后37或38位长度)  
      7. select dbms_random.value(10,20) from dual;   -- 产生一个大于10小于20的随机数小数(小数点后38位)  
      8. select dbms_random.normal from dual;  -- normal函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。  
      9.   
      10.   
      11. -- ****************************************  随机日期  ***************************************************  
      12. select to_date(trunc(dbms_random.value(to_number(to_char(sysdate-10, 'J')), to_number(to_char(sysdate, 'J')))), 'J') from dual;  -- 在过去10天内取随机日期  
      13. select (sysdate - 1 / 24 / 60 * 30) + dbms_random.value (1, 1800) / 3600 / 24 from dual;    -- 在过去30分钟内取随机时间  
      14. select to_date(to_char(to_date('2015-01-01', 'yyyy-MM-dd'), 'J') + trunc(DBMS_RANDOM.VALUE(0, 365)), 'J') from dual;   -- 查询2015年中的任意日期  
      15. -- 在指定日期范围内取随机时间  
      16. select to_date(trunc(dbms_random.value(to_number(to_char(to_date('20150501', 'yyyymmdd'),'J')),  
      17.                                        to_number(to_char(to_date('20150531', 'yyyymmdd') + 1, 'J')))  
      18.                     ), 'J') + dbms_random.value(1, 3600) / 3600 prize_time  
      19.        from dual;  
      20.          
      21. -- 从现在开始到过去的100年之间的任意时刻  
      22. select to_date(trunc(dbms_random.value(  
      23.                        to_number(to_char(add_months(sysdate,-100 * 12),'J')),  
      24.                        to_number(to_char(sysdate + 1, 'J')))  
      25.                     ), 'J') + dbms_random.value(1, 3600) / 3600 from dual;  
      26.   
      27.   
      28. -- ****************************************  随机字符(产生任意长度为20的字符串)  ***************************************************  
      29. select dbms_random.string('u', 20) from dual  -- 'u', 'U' 返回全是大写的字符串(uppercase) 测算发现,只要参数不是一个中文或全角字符,返回数据均是大写  
      30. select dbms_random.string('l', 20) from dual  -- 'l', 'L' - 返回全是小写的字符串(lowercase)  
      31. select dbms_random.string('a', 20) from dual  -- 'a', 'A' - 返回大小写结合的字符串(mixed case)  
      32. select dbms_random.string('x', 20) from dual  -- 'x', 'X' - 返回全是大写和数字的字符串(uppercase,alpha&numeric)  
      33. select dbms_random.string('p', 20) from dual  -- 'p', 'P' - 返回键盘上出现字符的随机组合(any printable char)  
      34. 那要生成10万条测试记录表可以用如下SQL:
        create table myTestTable as 
        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('x', 20) random_string
                  from dual
                connect by level <= 100000;
      35. DBMS_RANDOM.STRING用法:

        1)选项'u', 'U' - returning string in uppercase alpha characters
        2)选项'l', 'L' - returning string in lowercase alpha characters
        3)选项'a', 'A' - returning string in mixed case alpha characters
        4)选项'x', 'X' - returning string in uppercase alpha-numeric characters
        5)选项'p', 'P' - returning string in any printable characters.
        6)选项 Otherwise the returning string is in uppercase alpha characters.

        例子:

        生成由大写字母和数字组成的8位密码

        sys@ora11g>select dbms_random.string('x',8) "x_8_password" from dual;

        x_8_password

        ----------------------------------------------

        TT3ISGUV

  • 相关阅读:
    To select the file to upload we can use the standard HTML input control of type
    Cascading Menu Script using Javascript Explained
    网站首页head区代码规范
    轻松掌握 Java 泛型
    JDK 5.0 中的泛型类型学习
    如何在firefox下获取下列框选中option的text
    是同步方法还是 synchronized 代码? 详解多线程同步规则
    javascript select option对象总结
    Select的动态取值(Text,value),添加,删除。兼容IE,FireFox
    javascript在ie和firefox下的一些差异
  • 原文地址:https://www.cnblogs.com/shengs/p/4592706.html
Copyright © 2011-2022 走看看