Oracle中如何用一条SQL快速生成10万条测试数据(转)

来源:互联网 发布:文华财经 mac 编辑:程序博客网 时间:2024/05/16 10:58

下面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的随机字符串,字符串中可以包括字符或数字。

ok,那要生成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;------------------------------------补充:-------------------------------------------------------connect by 使用详解-------------------------------------------------create table EMP(EMP_ID   NUMBER(4) PRIMARY_KEY,EMP_NAME VARCHAR2(12),MGR_ID   NUMBER(4),JOB      VARCHAR2(6),SALARY   NUMBER(9,2))/*START WITH 表示递归的种子,而 CONNECT BY 描述递归步骤,也就是如何从第 n 步发展到第 (n + 1) 步。由于在归结 name 时需要区分第 n 步和第 (n + 1) 步,因此使用 PRIOR 来表明 属于第 (n + 1) 步。*/

例:
从雇员WARD开始递归找他的管理者,找他父节点

select level,emp_name,jobfrom empstart with emp_name in ('WARD')connect by emp_id = prior mgr_id;

从雇员WARD开始递归找他的下属,找他子节点

select level,emp_name,jobfrom empstart with emp_name in ('WARD')connect by prior emp_id = mgr_id;/*LEVEL 伪列最常见的伪列是 LEVEL。这个列的作用是表明产生行的递归步骤 n 属于第几步。*//*ORDER SIBLINGS BY 表达式在 Oracle 中,ORDER SIBLINGS BY 定义返回时同一父亲下各个兄弟之间的顺序。为了使用 CONNECT BY 递归地按照薪水对所有雇员排序,查询的形式如下:*/select level,emp_name,job,salaryfrom empstart with emp_name in ('WARD')connect by prior emp_id = mgr_id;order siblings by salary asc;/*NOCYCLE 关键字NOCYCLE 防止递归进入循环。对于第 (n + 1) 步,任何在祖先中已经存在的候选行都将被忽略。*/select level,emp_name,job,salaryfrom empstart with emp_name in ('WARD')connect by nocycle prior emp_id = mgr_id;order siblings by salary asc;/*CONNECT_BY_ROOT 表达式(10g)CONNECT_BY_ROOT 作用在一个列上,并返回当前行最早的(root)祖先的值。*/select connect_by_root emp_name as root      ,emp_namefrom empstart with emp_name in ('WARD','SMITH','ADAMS')connect by emp_id = prior mgr_id;/*SYS_CONNECT_BY_PATH() 过程运行查询时一个常见的问题是:“这个元素与递归的开始有怎样的关系?”,或者换句话说,“这一行的祖先是什么?”在 Oracle 中,可以使用 SYS_CONNECT_BY_PATH() 来连接来自每个递归步骤的值,从而形成一个祖先路径。看看下面这个著名的例子,它展示了‘ADAMS’每个下属的“从属”链:它一定要和connect by子句合用!第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!*/--根据员工找审批人select SYS_CONNECT_BY_PATH(emp_name, ':') AS chain, emp_namefrom empstart with emp_name='ADAMS'connect by emp_id = prior mgr_id;--根据上级找下级select SYS_CONNECT_BY_PATH(emp_name, ':') AS chain, emp_namefrom empstart with emp_name='JONES'connect by prior emp_id = mgr_id;/*CONNECT_BY_ISCYCLE(10g)为了“标出”递归中的循环,Oracle 提供了另一个伪列,即 CONNECT_BY_ISCYCLE。如果当前行是循环的一部分,则这个列返回 1,否则返回 0。 */select emp_name      ,level      ,connect_by_iscycle as cyclefrom empstart with emp_name = 'JONES'connect by nocycle prior emp_id = mgr_id;/*CONNECT_BY_ISLEAF(10g)与 CONNECT_BY_ISCYCLE 相比,CONNECT_BY_ISLEAF 更轻量一些。这个伪列只是当一个给定行在递归中是叶子的时候返回 1。换句话说:该行不会产生任何其他的行。在这个例子中,叶子指不是经理的雇员。*/select emp_name      ,level      ,CONNECT_BY_ISLEAF AS isleaf from empstart with emp_name = 'JONES'connect by nocycle prior emp_id = mgr_id;
原创粉丝点击