• [转]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

  • 相关阅读:
    Git push 出错 [The remote end hung up unexpectedly]
    [Git高级教程(二)] 远程仓库版本回退方法
    git分支与版本管理、版本回退、冲突解决记录
    上传本地代码到gitHub过程详解
    如何用git将项目代码上传到github
    Git pull 强制覆盖本地文件
    Git忽略规则.gitignore梳理
    composer本地安装文档
    服务器通过微信公众号Token验证测试的代码(Python版)
    转载自lanceyan: 一致性hash和solr千万级数据分布式搜索引擎中的应用
  • 原文地址:https://www.cnblogs.com/shengs/p/4592706.html
Copyright © 2020-2023  润新知