• 在Oracle中创建测试数据需要用到的七个脚本
  • 发布于 2天前
  • 53 热度
    0 评论
一.准备环境
1.1创建测试用户和表空间
创建表空间
CREATE TABLESPACE cjc DATAFILE '/oradata/cjc01.dbf' SIZE 100M AUTOEXTEND ON;
创建用户并授权
CREATE USER c##cjc IDENTIFIED BY "a" DEFAULT TABLESPACE cjc;
GRANT CONNECT, RESOURCE, CREATE VIEW TO c##cjc;
1.2创建测试表
CONNECT c##cjc/a
CREATE TABLE t1 (
    id         NUMBER PRIMARY KEY,
    name       VARCHAR2(50),
    salary     NUMBER(8,2),
    email      VARCHAR2(80),
    birth_date DATE,
    join_date  DATE
);
二.生成10万条测试数据
2.1:基本CONNECT BY
INSERT INTO t1
SELECT 
    LEVEL AS id,
    'User_' || LPAD(LEVEL, 6, '0') AS name,
    ROUND(DBMS_RANDOM.VALUE(3000, 20000), 0) AS salary, 
    DBMS_RANDOM.STRING('A', 8) || '@example.com' AS email,
    TO_DATE('1980-01-01', 'YYYY-MM-DD') + DBMS_RANDOM.VALUE(0, 14600) AS birth_date,
    SYSDATE - DBMS_RANDOM.VALUE(0, 3650) AS create_date
FROM DUAL
CONNECT BY LEVEL <= 100000;
COMMIT;
耗时0.82秒;
2.2:笛卡尔积突破限制
INSERT /*+ APPEND */ INTO t1
SELECT
    ROWNUM AS id,
    'User_' || LPAD(ROWNUM, 6, '0'),
    ROUND(3000 + DBMS_RANDOM.VALUE(0, 17000)),
    DBMS_RANDOM.STRING('X', 10) || '@mail.com',
    ADD_MONTHS(SYSDATE, -12*DBMS_RANDOM.VALUE(20, 50)),
    SYSDATE - DBMS_RANDOM.VALUE(0, 365*5)
FROM
    (SELECT 1 FROM DUAL CONNECT BY LEVEL <= 316) a,
    (SELECT 1 FROM DUAL CONNECT BY LEVEL <= 316) b  -- 316*316≈100,000
WHERE ROWNUM <= 100000;
COMMIT;
耗时3.64秒;

2.3:存储过程方法生成10万行
简单循环
CREATE OR REPLACE PROCEDURE gen_data_loop AS
BEGIN
  FOR i IN 1..100000 LOOP
    INSERT INTO t1 VALUES (
      i,
      'User_' || LPAD(i, 6, '0'),
      ROUND(3000 + DBMS_RANDOM.VALUE(0, 17000)),
      DBMS_RANDOM.STRING('A', 5) || i || '@corp.com',
      SYSDATE - DBMS_RANDOM.VALUE(365*20, 365*40),
      SYSDATE - DBMS_RANDOM.VALUE(0, 1800)
    );
  END LOOP;
  COMMIT;
END;
/
执行
SET TIMING ON
EXEC gen_data_loop;
耗时2.27秒;
三.scott示例用户数据:
. . imported "C##CJC"."DEPT"                             5.929 KB       4 rows
. . imported "C##CJC"."EMP"                              8.562 KB      14 rows
. . imported "C##CJC"."SALGRADE"                         5.859 KB       5 rows
. . imported "C##CJC"."BONUS"                                0 KB       0 rows

使用SQL Developer导出成sql格式:
CREATE TABLE "EMP" 
   ( "EMPNO" NUMBER(4,0), 
"ENAME" VARCHAR2(10), 
"JOB" VARCHAR2(9), 
"MGR" NUMBER(4,0), 
"HIREDATE" DATE, 
"SAL" NUMBER(7,2), 
"COMM" NUMBER(7,2), 
"DEPTNO" NUMBER(2,0)
   ) ;

REM INSERTING into EMP
SET DEFINE OFF;

Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-12月-80','DD-MON-RR'),800,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-2月 -81','DD-MON-RR'),1600,300,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-2月 -81','DD-MON-RR'),1250,500,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-4月 -81','DD-MON-RR'),2975,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-9月 -81','DD-MON-RR'),1250,1400,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7698,'BLAKE','MANAGER',7839,to_date('01-5月 -81','DD-MON-RR'),2850,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,'CLARK','MANAGER',7839,to_date('09-6月 -81','DD-MON-RR'),2450,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,'SCOTT','ANALYST',7566,to_date('19-4月 -87','DD-MON-RR'),3000,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,'KING','PRESIDENT',null,to_date('17-11月-81','DD-MON-RR'),5000,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,'TURNER','SALESMAN',7698,to_date('08-9月 -81','DD-MON-RR'),1500,0,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,'ADAMS','CLERK',7788,to_date('23-5月 -87','DD-MON-RR'),1100,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,'JAMES','CLERK',7698,to_date('03-12月-81','DD-MON-RR'),950,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,'FORD','ANALYST',7566,to_date('03-12月-81','DD-MON-RR'),3000,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('23-1月 -82','DD-MON-RR'),1300,null,10);

CREATE UNIQUE INDEX "PK_EMP" ON "EMP" ("EMPNO") ;
ALTER TABLE "EMP" ADD CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX  ENABLE;
ALTER TABLE "EMP" ADD CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ENABLE;
CREATE TABLE "DEPT" 
   ( "DEPTNO" NUMBER(2,0), 
"DNAME" VARCHAR2(14), 
"LOC" VARCHAR2(13)
   ) ;

REM INSERTING into DEPT
SET DEFINE OFF;

Insert into DEPT (DEPTNO,DNAME,LOC) values (10,'ACCOUNTING','NEW YORK');
Insert into DEPT (DEPTNO,DNAME,LOC) values (20,'RESEARCH','DALLAS');
Insert into DEPT (DEPTNO,DNAME,LOC) values (30,'SALES','CHICAGO');
Insert into DEPT (DEPTNO,DNAME,LOC) values (40,'OPERATIONS','BOSTON');

CREATE UNIQUE INDEX "PK_DEPT" ON "DEPT" ("DEPTNO") ;
ALTER TABLE "DEPT" ADD CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") USING INDEX  ENABLE;
CREATE TABLE "BONUS" 
   ( "ENAME" VARCHAR2(10), 
"JOB" VARCHAR2(9), 
"SAL" NUMBER, 
"COMM" NUMBER
   ) ;

REM INSERTING into BONUS
SET DEFINE OFF;
CREATE TABLE "SALGRADE" 
   ( "GRADE" NUMBER, 
"LOSAL" NUMBER, 
"HISAL" NUMBER
   ) ;

REM INSERTING into SALGRADE
SET DEFINE OFF;

Insert into SALGRADE (GRADE,LOSAL,HISAL) values (1,700,1200);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values (2,1201,1400);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values (3,1401,2000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values (4,2001,3000);
Insert into SALGRADE (GRADE,LOSAL,HISAL) values (5,3001,9999);

用户评论