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';

浙公网安备 33010602011771号