前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle生成随机测试数据

Oracle生成随机测试数据

作者头像
overme
发布2022-01-17 08:04:31
1.3K0
发布2022-01-17 08:04:31
举报
文章被收录于专栏:数据开发笔记

Oracle

背景

其实生成测试数据这种单子经常做,做的多了就做出经验来了。 所有随机数中稍微比较复杂的应该是随机生成地址,之前的做法是找一些真实的地址 然后通过正则把数字替换成随机值。其实这样的方法不说担心数据安全,工作量也不小。 通过存储过程,一劳永逸的生成测试数据比较好。 这是通过存储过程随机生成名字、性别、电话、住址,已经非常接近真实数据了。

开始

我们用Oracle写随机函数都基于DBMS_RANDOM

代码语言:javascript
复制
SELECT DBMS_RANDOM.RANDOM FROM DUAL;

每次查询生成一个-power(2,31) <= random < power(2,31)范围的数

随机生成性别
代码语言:javascript
复制
SELECT DECODE(ABS(MOD(DBMS_RANDOM.RANDOM, 2))
             ,1
             ,'男'
             ,'女') AS SEX
FROM DUAL;
随机生成电话号码

下面两种方法都可以

代码语言:javascript
复制
--随机生成电话号码
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生成的值来切片

代码语言:javascript
复制
SELECT '13' || SUBSTR(DBMS_RANDOM.VALUE(1, 2), 3, 9) AS PHONE
FROM DUAL;
随机生成地址

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

代码语言:javascript
复制
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种组合了

随机生成姓名
代码语言:javascript
复制
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种组合,当然可以再加数据

随机生成货物名、货物数量、货物价格
代码语言:javascript
复制
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;
随机生成密钥
代码语言:javascript
复制
SELECT DBMS_RANDOM.STRING('X', 32) FROM DUAL

'u',' U':只使用大写字母 'l',' I':只使用小写字母 'a',' A':只包含字母字符(大小写混合) 'x',' X':任何字母-数字字符(上) 'p',' P':任何可打印字符

测试数据

上文提到的表数据已上传,需要自取

本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/12/21 12:49:53

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 开始
      • 随机生成性别
      • 随机生成电话号码
      • 随机生成地址
      • 随机生成姓名
      • 随机生成货物名、货物数量、货物价格
    • 随机生成密钥
      • 测试数据
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档