其实生成测试数据这种单子经常做,做的多了就做出经验来了。 所有随机数中稍微比较复杂的应该是随机生成地址,之前的做法是找一些真实的地址 然后通过正则把数字替换成随机值。其实这样的方法不说担心数据安全,工作量也不小。 通过存储过程,一劳永逸的生成测试数据比较好。 这是通过存储过程随机生成名字、性别、电话、住址,已经非常接近真实数据了。
我们用Oracle写随机函数都基于DBMS_RANDOM
包
SELECT DBMS_RANDOM.RANDOM FROM DUAL;
每次查询生成一个-power(2,31) <= random < power(2,31)
范围的数
SELECT DECODE(ABS(MOD(DBMS_RANDOM.RANDOM, 2))
,1
,'男'
,'女') AS SEX
FROM DUAL;
下面两种方法都可以
--随机生成电话号码
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;
或者用DBMS_RANDOM.VALUES
生成的值来切片
SELECT '13' || SUBSTR(DBMS_RANDOM.VALUE(1, 2), 3, 9) AS PHONE
FROM DUAL;
把随机数放在变量里面,是因为子查询中Where
条件有随机数会出现还没生成随机数就查完了,有执行顺序的问题。
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;
生成地址的时候是用了两个表 一个是省份地区表LOCATION
一个是街道表STREET
虽然数据量不大但是生成随机地址是完全足够了 也有1700*400= 68W种组合了
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;
生成姓名和生成地址很类似需要两个辅助表 Xing
表和Ming
表做组合 目前的数据大概是130*290=3W7种组合,当然可以再加数据
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;
SELECT DBMS_RANDOM.STRING('X', 32) FROM DUAL
'u',' U':只使用大写字母 'l',' I':只使用小写字母 'a',' A':只包含字母字符(大小写混合) 'x',' X':任何字母-数字字符(上) 'p',' P':任何可打印字符
上文提到的表数据已上传,需要自取
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/12/21 12:49:53