文档章节

使用Oracle存储过程批量生成测试数据

北风其凉
 北风其凉
发布于 2016/06/16 17:29
字数 619
阅读 341
收藏 4

在做性能测试等场景时需要生成大量的仿真数据,使用存储过程可以快速解决此问题。

我的数据库版本为Oracle11g,PL/SQL版本为7.0.1.1066,操作系统版本为Win7旗舰版。

首先有一个表player_info结构如下:

-- 创建表 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 ;

这个表一共有5列:player_id(玩家标识)、player_name(玩家名称)、oper_mark(操作分数)、input_date(插入日期)、input_time(插入时间)。

在插入测试数据的时候,数据的来源可能有以下四种:

1、使用SEQUENSE或从其他PROCUDURE或FUNCTION中获取的值插入(如player_id)

2、使用测试人员制定的值插入(如player_name)

3、使用随机数生成器生成并插入(如出)

4、使用默认值(如input_date和input_time)

我们在制造测试数据的时候,应支持对这四类数据的生成。下面的存储过程gen_player_info_for_test解决了这一问题:

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

第一类数据player_id用Sequence的NextVal加入,第二类数据player_name通过参数传入存储过程并插入,第三类数据player_name通过dbms_random.random生成并加工后插入,第四类数据input_date和input_time不用处理,直接使用DEFAULT值即可。

使用此存储过程时,只需要先在命令窗口中执行此存储过程,执行后就可以在PL/SQL内浏览器中的Procedures目录下找到这个存储过程了,用鼠标右键单击新加入的存储过程(gen_player_info_for_test)并进入“测试”(Test)窗口,设定输入的变量,点击“开始调试器(F9)”即可执行此存储过程。

注意执行完毕后不要忘记按“提交”按钮。

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 116
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
Oracle + Mybatis实现批量插入、更新和删除示例代码

前言 Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据...

一看就喷亏的小猿
2018/11/22
0
0
POSTGRESQL存储过程的问题

在POSTGRESQL中写存储过程,感觉几个问题 1)定义类型 不能像ORACLE那样,直接就可以在存储过程中定义,非要预先在存储过程外定义好类型,才能使用,比较麻烦,缺乏灵活性,因为很多类型,只是...

tony_trh
2014/01/09
1K
1
oracle常用小技巧

■对象列表 ① 从对象列表中更改表名称 以前要修改表名称时我们还要通过SQL语句修改,现在通过Object Browser的图形化界面我们很容易就可 以做到,只需要选中要修改的对象,点击左键你就可以在输...

海尼
2013/09/02
984
0
mysql批量插入500条数据

表格结构如下 需求name和password字段,生成如下格式: 总共批量生成500个。 解决思路: 可以用mysql 存储过程 如果linux环境下可以用shell 我们先测试第一种,用存储过程。 DELIMITER ;; #...

am2012
2017/08/12
0
0
SQL 存储过程的使用对数据的操作(整理思绪补基础)

什么是存储过程? 存储过程是SQL语句和控制语句的 预编译集合 ,保存在数据库里,可由应用程序调用执行,而且容许用户声明变量,逻辑控制语句及其他强大的编程功能。而且允许用户声明变量、有...

SLoan_
2016/11/24
19
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云vpc、快照、镜像、重置密码_重启_关机、磁盘扩容

VPC 专有网络VPC(Virtual Private Cloud)是用户基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,用户可以在自己创建的专有网络内创建和管理云产品实例,比如ECS、负载均...

李超小牛子
18分钟前
1
0
阿里高级技术专家:研发效能的追求永无止境

背景 大约在5年前,也就是2013年我刚加入阿里的时候,那个时候 DevOps 的风刚吹起来没多久,有家公司宣称能够一天发布几十上百次,这意味着相比传统软件公司几周一次的发布来说,他们响应商业...

阿里云官方博客
47分钟前
1
0
Android 的 ViewModel 机制源码解析

Android ViewModel 的好处是会随 Activity 销毁调用它的 clear() 方法。 我们分析一下它是怎么做到的。 1. 例子使用: a、 创建类 TestMvvmViewModel 继承 ViewModel,重写 onCleared() ,把...

亭子happy
57分钟前
2
0
WEB 开发总结

事务处理 事务的4个基本特征 1.Atomic(原子性),事务中包含的操作被看做是一个整体的业务单元,这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分成功,部分失败的场景。 2....

北漂的我
今天
3
0
thinkphp5 利用七牛云 将amr格式语音文件转为mp3

$card_id 是我的本地的文件 将问价名字的后缀名去掉注意access_token的有效期public function ceshi1($card_id){ $mediaid = substr($card_id, 0, -4); $accessKey = ...

小小小壮
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部