Oracle创建测试数据

方法1

-- 创建表
create table TestTable 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 <= 1000000;

-- 追加数据
insert into TestTable
  (ID, INC_DATETIME,RANDOM_ID,RANDOM_STRING)
  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 <= 100;

方法2

使用的函数

1.values方法

-- 无参数时生成38位精度的数值,范围0-1
-- 有参数时,第一个数字为下限,是二个数字为上限
SELECT DBMS_RANDOM.VALUE() FROM DUAL;
SELECT DBMS_RANDOM.VALUE(20,30) FROM DUAL;

2.normal方法

--生成一个符合正态分布的随机数,此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间, 95%介于-2与+2之间,99%介于-3与+3之间。
SELECT DBMS_RANDOM.NORMAL FROM DUAL;

3.random方法

--返回值的范围为: [-2^31, 2^31),返回的是整数。
SELECT DBMS_RANDOM.RANDOM() FROM DUAL;

4.string方法

-- 'u'或'U',仅返回大写字母
-- 'l'或'L',仅返回小写字母
-- 'a'或'A',返回大小写字母混合
-- 'x'或'X',返回大写字母和数字混合
-- 'p'或'P',返回任意可显示字符
select dbms_random.string('u',10) from dual;
select dbms_random.string('L',10) from dual;
select dbms_random.string('a',10) from dual;
select dbms_random.string('X',10) from dual;
select dbms_random.string('X',10) from dual;
select dbms_random.string('p',10) from dual;

测试语句

--建表语句
CREATE TABLE ORDER_TABLE
(
ORDER_ID NUMBER
,USER_CODE VARCHAR2(256)
,GOODS_NAME VARCHAR2(256)
,ORDER_DATE DATE
,CITY VARCHAR2(256)
,ORDER_NUM NUMBER
);
COMMENT ON TABLE ORDER_TABLE IS '订单表 ';
COMMENT ON COLUMN ORDER_TABLE.ORDER_ID IS '订单ID';
COMMENT ON COLUMN ORDER_TABLE.USER_CODE IS '下单用户ID';
COMMENT ON COLUMN ORDER_TABLE.GOODS_NAME IS '商品名称';
COMMENT ON COLUMN ORDER_TABLE.ORDER_DATE IS '下单日期';
COMMENT ON COLUMN ORDER_TABLE.CITY IS '下单城市';
COMMENT ON COLUMN ORDER_TABLE.ORDER_NUM IS '订单数量';

--创建自增序列
CREATE SEQUENCE SE_ORDER_ID  --序列名称
MINVALUE 1001 --最小值
;

--创建循环插入1000条记录的存储过程
CREATE OR REPLACE PROCEDURE SP_CREATE_DATA IS
BEGIN
    FOR X IN 1..1000
        LOOP
            INSERT INTO ORDER_TABLE
            VALUES ( se_order_id.nextval --引用自增序列
                   , DBMS_RANDOM.STRING('x', 8) --获取8位随机数字加字母
                   , CASE TRUNC(DBMS_RANDOM.VALUE(1, 6)) --随机选取5个枚举值
                         when 1 then '零食大礼包A'
                         when 2 then '零食大礼包B'
                         when 3 then '零食大礼包C'
                         when 4 then '零食大礼包D'
                         when 5 then '零食大礼包E'
                         END
                   , TO_DATE(TO_CHAR(TO_DATE('20210101', 'yyyymmdd'), 'J') -
                             TRUNC(DBMS_RANDOM.VALUE(1, TO_DATE('20210101', 'yyyymmdd') -
                                                        ADD_MONTHS(TO_DATE('20210101', 'yyyymmdd'), -12))
                                 - 1), 'J')
                       -- to_char(sysdate, 'J') 自公元前 4712 年1月1日到指定日期的总天数
                   , CASE TRUNC(DBMS_RANDOM.VALUE(1, 6)) --随机选取5个枚举值
                         when 1 then '北京'
                         when 2 then '上海'
                         when 3 then '广州'
                         when 4 then '深圳'
                         when 5 then '杭州'
                         END
                   , TRUNC(DBMS_RANDOM.VALUE(1, 11)) --获取1-10的随机整数
                   );
        END LOOP;
    COMMIT;
END SP_CREATE_DATA;

--创建存储过程循环上一个存储过程500次
CREATE OR REPLACE PROCEDURE SP_500 IS
BEGIN
  FOR X IN 1..500 LOOP
    SP_CREATE_DATA;
END LOOP;
END;

--调用存储过程  生成50w条数据
BEGIN
    SP_500;
end;

--查看表数据
SELECT * FROM ORDER_TABLE;

方法3

说明

随机生成性别

SELECT DECODE(ABS(MOD(DBMS_RANDOM.RANDOM, 2))
             ,1
             ,'男'
             ,'女') AS SEX
FROM DUAL;

随机生成电话号码

--方法1
SELECT '13' || ABS(MOD(DBMS_RANDOM.RANDOM, 9)) ||
       RPAD(ABS(MOD(DBMS_RANDOM.RANDOM, 9999)), 4, '0') ||
       RPAD(ABS(MOD(DBMS_RANDOM.RANDOM, 9999)), 4, '0') AS PHONE
FROM DUAL;

--方法2
SELECT '13' || SUBSTR(DBMS_RANDOM.VALUE(1, 2), 3, 9) AS PHONE
FROM DUAL;

随机生成地址

把随机数放在变量里面,是因为子查询中Where条件有随机数会出现还没生成随机数就查完了,有执行顺序的问题

生成地址的时候是用了两个表 一个是省份地区表LOCATION 一个是街道表STREET 虽然数据量不大但是生成随机地址是完全足够了 也有1700*400= 68W种组合了

DECLARE
  DQ_NAME  VARCHAR2(100);
  LOCTION  NUMBER;
  STRR     NUMBER;
BEGIN
  STRR    := ABS(MOD(DBMS_RANDOM.RANDOM, 1700))+ 1;
  LOCTION := ABS(MOD(DBMS_RANDOM.RANDOM, 399))+ 1;
  SELECT (SELECT MAX(T.ADNAME)
          FROM LOCATION T
          WHERE T.ID = STRR) ||
         (SELECT MAX(T.SRR_NAME)
          FROM STREET T
          WHERE T.ID = LOCTION) ||
         ABS(MOD(DBMS_RANDOM.RANDOM, 1000)) || '号'
  INTO DQ_NAME1
  FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(DQ_NAME);
END;

随机生成姓名

生成姓名和生成地址很类似需要两个辅助表 Xing表和Ming表做组合 目前的数据大概是130*290=3W7种组合,当然可以再加数据

DECLARE
  NAME1     VARCHAR2(100);
  RAND_MING NUMBER;
  RAND_XING NUMBER;
BEGIN
  --随机数用于生成名
  RAND_MING := ABS(MOD(DBMS_RANDOM.RANDOM, 290));
  --随机数用于生成姓
  RAND_XING := ABS(MOD(DBMS_RANDOM.RANDOM, 130));
  SELECT (SELECT MAX(T.NAME)
          FROM XING T
          WHERE T.ID = RAND_XING) ||
         (SELECT MAX(T.NAME)
          FROM MING T
          WHERE T.ID = RAND_MING)
  INTO NAME1
  FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(NAME1);
END;

随机生成货物名、货物数量、货物价格

DECLARE
  GOOD_NAME    VARCHAR2(100);
  RANDOM_GOODS NUMBER;
  RANDOM_COUNT NUMBER;
  RANDOM_PRICE NUMBER;
BEGIN
  --随机数用于生成货物
  RANDOM_GOODS := ABS(MOD(DBMS_RANDOM.RANDOM, 600));
  --随机数用于生成货物数量
  RANDOM_COUNT := ABS(MOD(DBMS_RANDOM.RANDOM, 9999));
  --随机数用于生成货物价格
  RANDOM_PRICE := ROUND(DBMS_RANDOM.value(20,1000),2);
  SELECT MAX(T.NAME)
  INTO GOOD_NAME
  FROM GOODSES T
  WHERE ID = RANDOM_GOODS;
  DBMS_OUTPUT.PUT_LINE('货品名:'||GOOD_NAME);
  DBMS_OUTPUT.PUT_LINE('货品数量:'||RANDOM_COUNT);
  DBMS_OUTPUT.PUT_LINE('货品价格:'||RANDOM_PRICE);
END;

随机生成密钥

'u',' U':只使用大写字母

'l',' I':只使用小写字母

'a',' A':只包含字母字符(大小写混合)

'x',' X':任何字母-数字字符(上)

'p',' P':任何可打印字符

SELECT DBMS_RANDOM.STRING('X', 32) FROM DUAL

完整语句

见方法3文件夹

方法4

-- 建立表 PLAYER_INFO
CREATE TABLE PLAYER_INFO
(
    player_id number(12, 0) PRIMARY KEY,
    player_name varchar2(20) NOT NULL,
    oper_mark number(12, 0),
    input_date number(10,0) DEFAULT to_number(to_char(sysdate,'yyyymmdd')),
    input_time number(10,0) DEFAULT to_number(to_char(sysdate,'hh24miss'))
);

-- 建立序列 SEQ_PLAYER_INFO
CREATE SEQUENCE SEQ_PLAYER_INFO
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999999999999999
CYCLE 
CACHE 20 ;


--测试存储过程
CREATE OR REPLACE PROCEDURE gen_player_info_for_test(
       p_player_name       VARCHAR2,      -- 玩家名称
       p_gen_count         NUMBER,        -- 生成条目数
       p_error_no          OUT NUMBER,    -- 错误号
       p_error_info        OUT VARCHAR2,  -- 错误提示
       p_error_id          OUT NUMBER,    -- 错误序号
       p_error_sysinfo     OUT VARCHAR2   -- 系统错误信息
       ) AS
  
  p_curr_value NUMBER := 0;
  p_end_value NUMBER := 0;
  
BEGIN
  dbms_output.put_line('----------- PROCUDURE START -----------');
  
  p_curr_value := 0;
  p_end_value := p_gen_count;
  WHILE p_curr_value < p_end_value
  LOOP 
      p_curr_value := p_curr_value + 1;

      INSERT INTO player_info
          (player_id,
           player_name,
           oper_mark)
      VALUES
          (seq_player_info.nextval,
           p_player_name,
           60 + abs(mod(dbms_random.random, 40)));
  
  END LOOP;
  
  dbms_output.put_line('----------- PROCUDURE END -----------');
  p_error_no      := 0;
  p_error_info    := 'EXECUTE SUCCESS';
  p_error_id      := SQLCODE;
  p_error_sysinfo := SQLERRM;
EXCEPTION
  WHEN OTHERS THEN
    p_error_no      := 999;
    p_error_info    := '存储过程执行错误';
    p_error_id      := SQLCODE;
    p_error_sysinfo := SQLERRM;
END gen_player_info_for_test;
/

方法5:持续写入

create or replace procedure p_test01 is 
begin 
execute immediate 'select count(*) from test01'; 
for i in 1 ..1000 loop 
insert into test01(id,name) values(i,sysdate); 
commit; 
end loop; 
execute immediate 'select count(*) from test01'; 
end p_test01; 
/

begin 
p_test01; 
end; 
/ 
select count(*) from test01; 
select * from test01 where id>990; 
conn test02/test02 
create or replace procedure p_test02 is 
begin 
execute immediate 'select count(*) from test02'; 
for i in 1 ..2000 loop 
insert into test02(id,name) values(i,sysdate); 
commit; 
end loop; 
execute immediate 'select count(*) from test02'; 
end p_test02; 
/ 
begin 
p_test02; 
end; 
/ 


--创建存储过程:
create or replace procedure p_time
is
i number; --定义变量;
begin
i:=0; --初始化为0;
--循环
for i in 1..10000 loop
--插入数据到表中.
insert into time values('id'||i,'edu','Entrytime',sysdate);
end loop;
--提交.
commit;
end p_time;
/

--调用存储过程
Sql 代码
begin
   p_time;
end ;
/

案例

create table TestTable(
ID number, INC_DATETIME date ,RANDOM_ID number ,RANDOM_STRING varchar(100)
);
insert into TestTable
  (ID, INC_DATETIME,RANDOM_ID,RANDOM_STRING)
  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 <= 1000;
commit;



create table t_test(
id nvarchar2(200), 
name nvarchar2(200), 
age integer, 
password nvarchar2(200)
);

-- 插入600w的模拟数据

INSERT INTO t_test (id, name, age, password)
SELECT
    'id'||FLOOR(DBMS_RANDOM.value(0, 10000)),  -- 生成随机的ID
    'User'||FLOOR(DBMS_RANDOM.value(0, 10000)),  -- 生成随机的用户名
    FLOOR(DBMS_RANDOM.value(18, 118)),  -- 生成随机的年龄 (18-117)
    'user'||FLOOR(DBMS_RANDOM.value(0, 10000)) ||'@example.com'-- 生成随机的邮箱地址
FROM
    dual
CONNECT BY LEVEL <=6000000;

在某个schema下创建n个表

create user test_user identified by test_user;

BEGIN
   FOR i IN 1..100 LOOP
      EXECUTE IMMEDIATE 'CREATE TABLE test_user.test_t' || i || ' (id int, col1 varchar(100))';
   END LOOP;
END;
/

-- 查询结果
select OWNER,TABLE_NAME,TABLESPACE_NAME from all_tables where OWNER='TEST_USER';
posted @ 2025-05-17 10:10  kahnyao  阅读(100)  评论(0)    收藏  举报