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

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

我的数据库版本为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

转载于:https://my.oschina.net/Tsybius2014/blog/693046

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值