精华内容
下载资源
问答
  • plsql 存储过程 测试

    千次阅读 2018-08-14 10:09:00
    plsql 存储过程 测试 CreationTime--2018年8月14日09点54分 Author:Marydon 1.找到要运行的存储过程-->选中-->右键-->测试   2.入参赋值   3.测试  方式一:直接运行  点击窗口...
     

    plsql 存储过程 测试

    CreationTime--2018年8月14日09点54分

    Author:Marydon

    1.找到要运行的存储过程-->选中-->右键-->测试

     

    2.入参赋值

     

    3.测试

      方式一:直接运行

      点击窗口左上角运行按钮即可。

      方式二:调式模式

      可以一步一步进行调试(下图第一个蓝方块)

      点击左上角-->开始调试器-->运行

    4.查看输出结果

     

      游标的话,点击右侧的...查看输出结果详情

     

     
    展开全文
  • 存储过程测试流程--以MySQL为例

    千次阅读 2016-06-06 18:58:06
    同C/C++/Java等语言编写的代码一样,用SQL语言编写的存储过程也需要进行充分的测试。本文以实际的MySQL存储过程为例,介绍存储过程测试的整个流程。

    同C/C++/Java等语言编写的代码一样,用SQL语言编写的存储过程也需要进行充分的测试。本文以实际的MySQL存储过程为例,介绍存储过程测试的整个流程。

    在本文中,需要被测试的存储过程如下:

    drop procedure if exists pr_dealtestnum;
    delimiter //
    
    create procedure pr_dealtestnum
    (
        in    p_boxnumber    varchar(30),
        out   p_result       int,
        out   p_outusertype  int
    )
    pr_dealtestnum_label:begin
        declare   p_boxnumcount    int;
        declare   p_usertype       int;
    
        set p_boxnumcount = 0;
        set p_usertype     = 0;
        set p_outusertype  = 0;
    
        select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumber;
        if p_boxnumcount > 0 then
        begin
            select usertype into p_usertype from tb_testnum where boxnumber=p_boxnumber;
    
            set p_outusertype =  (p_usertype+1)/10*10;
    
            set p_result = 0;
        end;
        else
        begin
            set p_result = 1;
        end;
        end if;
    
        leave pr_dealtestnum_label;
    end;
    //
    delimiter ;
    select 'create procedure pr_dealtestnum ok';

    在存储过程中使用到的表tb_testnum如下:

    drop table if exists tb_testnum;
    
    create table tb_testnum
    (
        boxnumber  varchar(30)  not null,
        usertype   int          not null                                                                                  
    );
    create unique index idx1_tb_testnum on tb_testnum(boxnumber);

    其中,usertype字段的值必须要大于1。

    对存储过程进行测试大致遵循以下步骤:
    第一步,按照存储过程的输入和输出参数设置正确的调用样式。

    第二步,根据调用时的输入参数值来向相关的表中插入测试数据。

    第三步,执行第一步中的存储过程调用语句,查看执行结果是否正确,并根据该结果来修改存储过程。

    下面具体进行说明。

    第一步
    就本存储过程pr_dealtestnum而言,根据程序逻辑,我们可设置如下调用语句:

    call pr_dealtestnum('2344273520',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273521',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273522',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273523',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273524',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273525',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273526',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273527',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273528',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273529',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273530',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273531',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273532',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273533',@1,@2);select @1,@2;
    call pr_dealtestnum('2344273534',@1,@2);select @1,@2;
    call pr_dealtestnum('15696192523',@1,@2);select @1,@2;

    大家还可以设置更多的调用语句,其目的是为了对存储过程进行更加充分的测试。

    第二步
    根据第一步设置的调用语句,兼顾程序逻辑,我们可执行如下语句向表tb_testnum中插入数据:

    insert into tb_testnum(boxnumber,usertype) values('2344273520',1);
    insert into tb_testnum(boxnumber,usertype) values('2344273521',3);
    insert into tb_testnum(boxnumber,usertype) values('2344273522',4);
    insert into tb_testnum(boxnumber,usertype) values('2344273523',5);
    insert into tb_testnum(boxnumber,usertype) values('2344273524',7);
    insert into tb_testnum(boxnumber,usertype) values('2344273525',8);
    insert into tb_testnum(boxnumber,usertype) values('2344273526',9);
    insert into tb_testnum(boxnumber,usertype) values('2344273527',10);
    insert into tb_testnum(boxnumber,usertype) values('2344273528',11);
    insert into tb_testnum(boxnumber,usertype) values('2344273529',13);
    insert into tb_testnum(boxnumber,usertype) values('2344273530',14);
    insert into tb_testnum(boxnumber,usertype) values('2344273531',15);
    insert into tb_testnum(boxnumber,usertype) values('2344273532',26);
    insert into tb_testnum(boxnumber,usertype) values('2344273533',52);
    insert into tb_testnum(boxnumber,usertype) values('2344273534',87);

    第三步
    在向表tb_testnum中插入数据之后,我们开始逐条执行第一步中的存储过程调用语句,以验证存储过程代码逻辑的正确性。

    首先执行“call pr_dealtestnum(‘2344273520’,@1,@2);select @1,@2;”,结果如下:

    mysql> call pr_dealtestnum('2344273520',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    2 |
    +------+------+
    1 row in set (0.00 sec)

    我们来分析执行结果是否是我们想要的。将入参“2344273520”带入存储过程中,首先是“select count(*) into p_boxnumcount from tb_testnum where boxnumber=’2344273520’;”,此时“boxnumcount”变量的值为1(因为之前执行过语句“insert into tb_testnum(boxnumber,usertype) values(‘2344273520’,1);”);接着,程序进入“if p_boxnumcount > 0 then”分支,执行“select usertype into p_usertype from tb_testnum where boxnumber=’2344273520’;”语句,“p_usertype”变量的值为1;然后,执行“set p_outusertype = (1+1)/10*10;”语句,即“p_outusertype”变量的值为“2/10*10”,进一步计算为“0*10”,最终结果为0;最后,执行“set p_result = 0;”语句,“p_result”变量的值为0。因此,最终两个输出参数的值都应该为0。

    但是,实际的结果是,两个输出参数的值分别为0和2,是哪里出了问题呢?我们重点分析“(1+1)/10*10”的结果,将之在MySQL中单独执行,结果如下:

    mysql> select (1+1)/10*10;
    +-------------+
    | (1+1)/10*10 |
    +-------------+
    |      2.0000 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> select (1+1)/10;
    +----------+
    | (1+1)/10 |
    +----------+
    |   0.2000 |
    +----------+
    1 row in set (0.00 sec)

    我们可以看到,“(1+1)/10”的结果并不是我们预想的0,而是0.2,看来,在MySQL中,两个整数相除并不是只取结果的整数部分,而是取了小数点后面的若干位。

    那么,如果我们只想要整数部分,应该怎么办呢?此时,可以用floor()函数,即“floor((1+1)/10)”就是取了结果的整数部分,如下所示:

    mysql> select floor((1+1)/10);
    +-----------------+
    | floor((1+1)/10) |
    +-----------------+
    |               0 |
    +-----------------+
    1 row in set (0.00 sec

    现在,我们据此修改存储过程,修改之后如下所示:

    drop procedure if exists pr_dealtestnum;
    delimiter //
    
    create procedure pr_dealtestnum
    (
        in    p_boxnumber    varchar(30),
        out   p_result       int,
        out   p_outusertype  int
    )
    pr_dealtestnum_label:begin
        declare   p_boxnumcount    int;
        declare   p_usertype       int;
    
        set p_boxnumcount = 0;
        set p_usertype    = 0;
        set p_outusertype = 0;
    
        select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumber;
        if p_boxnumcount > 0 then
        begin
            select usertype into p_usertype from tb_testnum where boxnumber=p_boxnumber;
    
            set p_outusertype =  floor((p_usertype+1)/10)*10;
    
            set p_result = 0;
        end;
        else
        begin
            set p_result = 1;
        end;
        end if;
    
        leave pr_dealtestnum_label;
    end;
    //
    delimiter ;
    select 'create procedure pr_dealtestnum ok';

    再次执行“call pr_dealtestnum(‘2344273520’,@1,@2);select @1,@2;”,结果如下:

    mysql> call pr_dealtestnum('2344273520',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)

    此时的结果就是我们想要的。

    我们可以继续执行在第一步中设置的其它存储过程调用语句,结果如下:

    mysql> call pr_dealtestnum('2344273521',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273522',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273523',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273524',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273525',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |    0 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273526',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273527',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273528',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273529',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273530',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273531',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   10 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273532',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   20 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273533',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.00 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   50 |
    +------+------+
    1 row in set (0.00 sec)
    
    mysql> call pr_dealtestnum('2344273534',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.01 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    0 |   80 |
    +------+------+
    1 row in set (0.00 sec)
    mysql> call pr_dealtestnum('15696192523',@1,@2);select @1,@2;
    Query OK, 1 row affected (0.01 sec)
    
    +------+------+
    | @1   | @2   |
    +------+------+
    |    1 |    0 |
    +------+------+
    1 row in set (0.00 sec)

    可以看到,修改之后的存储过程的执行结果就是正确的了。最后一条调用语句“call pr_dealtestnum(‘15696192523’,@1,@2);select @1,@2;”中,因为输入参数中的“15696192523”对应的数据在tb_testnum表中不存在,因此程序进入了“else”分支,“p_result”变量的值就为1,而“p_outusertype”变量的值为0。

    总结
    存储过程的测试方法和用其它编程语言编写的程序的测试方法是一样的,都需要我们在充分理解程序逻辑的基础上构造完整的、多样化的测试用例,并在测试的过程中根据测试的结果来修改程序,以达到我们预期的结果,并最终满足用户的需求。

    需要强调的是,在软件开发过程中,我们测试代码的时间,很可能会多余我们编写代码的时间,大家一定要耐着性子忍受测试代码过程中的“孤独感”。

    展开全文
  • Oracle 存储过程测试

    万次阅读 2018-09-04 16:56:19
    如果过程单步执行到某行后,再单步执行的时候,存过就退出,那么错误就在该行的下一行。 代码执行到24行,在往下执行时,直接转到exception的地方,也就是异常处理的部分。 这说明我们代码中的...

    方法/步骤

     

     

    • 首先在PL/SQL的左侧资源栏中展开Procedures项(图中位置1),然后再其上面的搜索框中(图中位置2)输入存过名称的关键词,按回车键搜索要调试的存过,不停的回车,直到找到想要调试的存过。

    • 找到想要调试的存过,左键单击选中该存过(图中位置1),然后右键单击该存过,从弹出菜单中选择“Test”项(图中位置2)。

    • 单击“Test”后,PL\SQL会打开调试界面,图中位置1的按钮就是开始调试的按钮,在调试之前要填写存过的参数,位置2就是填写参数的地方,如果有多个参数,会有多行参数框,按参数名填写相应的参数即可。

    • 填写完参数,单击开始调试按钮后,调试的界面会发生一些变化。图中位置1的变化,说明存过已经处于执行状态,别人不能再编译或者执行。位置2的按钮就是执行按钮,单击这个按钮存过会执行完成或者遇到bug跳出,否则是不会停下来的,调试时不会用这个按钮的。位置3的按钮才是关键——单步执行,就是让代码一行一行的执行,位置4的按钮是跳出单步执行,等待下一个指令。

    • 单击“单步执行”,存过开始单步执行。界面中每一次执行的代码会高亮显示(图中位置1),如果想要看某个变量具体的值,就在位置2的地方输入该变量名,然后变量的值会显示在位置3的地方。

    • 调试的时候,每一次单步执行的时候要记一下执行代码的行数,图中位置3的数字就是当前执行代码的行数,就是第几行。如果过程单步执行到某行后,再单步执行的时候,存过就退出,那么错误就在该行的下一行。

    • 代码执行到24行,在往下执行时,直接转到exception的地方,也就是异常处理的部分。

    • 这说明我们代码中的错误在24和25行上,我们打开存过,浏览到24行和25行附近,发现25行和24行使用了两个变量,记住那两个变量。重新开始调试过程。

    • 单步的执行时候把刚才那两个变量名填写到变量查看框,一边观察变量值变化,一边单步执行,执行到24行的时候,发现一个变量已经有值了,而另一个变量的值为null。错误原因明朗了吧?就是变量没有赋值或者初始话,给该变量赋值后存过就不报错了。

    展开全文
  • DB2 带参数存储过程测试

    千次阅读 2006-01-04 12:27:00
    --DB2 带参数存储过程测试--彭建军--2006-1-4 9:27--建立测试环境DROP TABLE T1;DROP PROCEDURE P1;CREATE TABLE T1(C1 VARCHAR(20));CREATE PROCEDURE DB2ADMIN.P1(IN IsFirstRun INT)LANGUAGE SQLBEGIN INSERT ...

    --DB2 带参数存储过程测试
    --彭建军
    --2006-1-4 9:27

    --建立测试环境
    DROP TABLE T1;

    DROP PROCEDURE P1;

    CREATE TABLE T1(C1 VARCHAR(20));

    CREATE PROCEDURE DB2ADMIN.P1(IN IsFirstRun INT)
    LANGUAGE SQL
    BEGIN
      INSERT INTO T1(C1)
        VALUES(
                CASE IsFirstRun
                  WHEN 0 THEN 'IsFirstRun'
                  ELSE 'IsNotFirstRun'
                END
              );
    END

    --执行存储过程
    CALL P1(0);

    CALL P1(1);

    --结果集
    IsFirstRun
    IsNotFirstRun

    展开全文
  • DB2 多游标存储过程测试

    千次阅读 2006-01-04 12:28:00
    --DB2多游标存储过程测试--彭建军--2005-11-25--创建测试环境CREATE TABLE T1( C1 INT, C2 VARCHAR(10));CREATE TABLE T2( C1 INT, C2 VARCHAR(10));INSERT INTO T1 VALUES (1,TEST1),(2,TEST2),(3,TEST3),(4,...
  • 简单oracle存储过程测试

    千次阅读 2016-03-11 11:57:38
    存储过程 create or replace procedure lcd(lid in number,lname out varchar2) as lock_handler varchar2(128); request_ number; release_ number; begin dbms_lock.allocate_unique('tlcd',lock_handler,3600);
  • pl/sql中存储过程测试

    千次阅读 2012-02-10 14:24:25
    pl/sql中存储过程含有自定义数组的参数: 测试debug模式: 例子 : 存储过程 PRE_BOOKTICKET_SEND 为 :  CREATE OR REPLACE PROCEDURE "PRE_BOOKTICKET_SEND"(TICKETID VARCHAR2,  PHONES
  • 问题如何创建SQL数据库以及表结构以用来保存测试用例的输入数据和测试结果。设计编写T-SQL脚本,创建一个数据库然后创建一些表用来保存测试用例的输入数据和测试结果。如果想通过SQL认证的方式连接到上一步创建的...
  • 问题 如何测试没有返回值的存储过程。 设计 调用待测存储过程,然后计算该存储过程影响的对象的聚合校验和。把计算出来的校验和与期望的校验和进行比较。 方案 例如,设想待测存储过程要从tb1Employees表中删除...
  • 问题 如何测试返回一个out参数的存储过程。 设计 声明一个合适类型的变量,用于接受out参数,然后使用out参数调用待测存储过程。 方案 例如,设想包含待测存储的数据库有一个数据库表,这个表定义如下: create...
  • declare @d1 DateTime; set @d1=GETDATE(); Select 序号 from YH终端参数表视图_MID where 供电所编号 = '10000' and 使用属性 ... in ('','变电站应用','专用变应用','大用户应用','大用户应用(预付费)' ,'公用...
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...
  • mysql定义一个简单的存储过程测试

    千次阅读 2017-05-09 11:40:15
    mysql定义一个简单的存储过程测试
  • 存储过程

    千次阅读 2019-12-11 22:24:16
    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数...
  • MYSQL存储过程调试过程

    万次阅读 2018-07-14 11:57:00
    mysql不像oracle有plsqldevelper工具用来调试存储过程,所以有几种简单的方式追踪执行过程: 1、用一张临时表,记录调试过程; 2、直接在存储过程中,增加select xxx,在控制台查看结果: 3、把存储过程的sql复制到...
  • 步骤:1、向表中productinfo插入一条数据 2、然后查询一个多条数据插入变量中(人为制造异常) 3、执行存储过程,检查数据是否插入成功 CREATE OR REPLACE PROCEDURE p_exp_test1 --创建存储过程是,存储过程...
  • 使用DBUnit测试存储过程

    千次阅读 2006-10-25 15:07:00
    使用DBUnit测试存储过程 这两天通过对DBUnit的扩展,使得DBUnit可以进行存储过程的单元测试了。扩充了一些功能,原有的DBUnit虽然功能比较多,但是对于测试数据库应用还有一些不便之处。首先作了以下的扩充:1. ...
  • SQL存储过程使用介绍

    万次阅读 多人点赞 2017-04-25 13:54:13
    在数据库编程过程中经常会用到存储过程 , 相比 SQL 语句 , 存储过程更方便 , 快速 , 安全 ; 先将存储过程的相关介绍和使用方法总结如下 ;1. 存储过程的概念存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组...
  • mysql用存储过程创建百万级测试数据
  • 存储过程 输入输出参数

    千次阅读 2019-01-03 10:27:38
    /** 存储过程测试 **/ -- 查看数据库下的所有存储过程 SELECT NAME FROM mysql.proc WHERE db='game_info'; -- *****************创建有输入的参数 DELIMITER $$ DROP PROCEDURE IF EXISTS`test_procedure` $$ ...
  • 存储过程很方便,就像写shell脚本一样,可以帮我们把重复的命令总结成一个脚本,不用自己每次都做重复的操作, sql是不可以拼接表名的,有时候写存储过程想把表名作为...例2:以及通过存储过程自动插入批量测试数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 725,220
精华内容 290,088
关键字:

存储过程如何测试