美文网首页
存储过程的测试

存储过程的测试

作者: 测试老杨 | 来源:发表于2018-07-15 10:53 被阅读52次

存储过程

数据库脚本,由SQL语句组成的。

事务

事务是由DML操作(增删改操作的集合组成了事务)组成的。
比如:张三给李四转账,往张三的账户上门扣钱,往李四的账户上面加钱。
实际上就是两个update操作,这两个update操作就组成了我们的事务。

转账案例

1)先创建一个账户表ACCOUNT,表结构信息如下:

字段名 类型 描述
accoutId varchar(50) 卡号,主键
name varchar(50) 姓名
balance numeric(10,2) 余额,约束条件为大于等于0
createTime date 开户日期

CREATE TABLE ACCOUNT(
AccountId varchar(50) primary key,
name    varchar(50) not null,
balance numeric(10,2) not null,
createTime date default getdate());

2)录入数据

--添加一个检查约束
alter table ACCOUNT 
add constraint ck_account_balance check(balance>=0);

insert into ACCOUNT values('6223000000001','张三',100.0,GETDATE());
insert into ACCOUNT values('6223000000002','李四',0.0,GETDATE());

3)写一个转账的存储过程

思路:
输入的参数:转账人的卡号,收款人的卡号,转账金额
输出的参数:@Reval
如果@Reval=200表示转账成功
如果@Reval=500表示转账失败

    UPDATE  ...
    IF(@@error <> 0)
    BEGIN
        GOTO ERR;--ERR对应的语句块里面要进行回滚操作
    END

如果@Reval=404表示账户不存在

    --转账人的卡号是否存在
    IF NOT EXISTS(SELECT 1 FROM ACCOUNT WHEERE accoutId=@Acc1)
    BEGIN 
    set @Reval=404;
    RETURN @Reval;
    END

如果@Reval=405表示转账金额错误

存储过程代码如下:

ALTER Procedure [dbo].[SP_Transfer] 
@acc1 varchar(50),  --转账人的卡号
@acc2 varchar(50),  --收款人的卡号
@amount numeric(10,2),  --转账金额
@Retval int output  --存储过程的执行结果
AS
Begin
    Set @Retval = 200;
    
    --判断转账的卡号是否存在
    IF NOT EXISTS (SELECT 1 FROM ACCOUNT WHERE AccountId=@acc1)
    Begin
            Set @Retval = 404;
            Return  @Retval;
    End
    
    --判断收款的卡号是否存在
    IF NOT EXISTS (SELECT 1 FROM ACCOUNT WHERE AccountId=@acc2)
    Begin
            Set @Retval = 404;
            Return  @Retval;
    End 
    
    --判断转账的金额是否小于等于0
    IF (@amount<=0.0)
    Begin
            Set @Retval = 405;
            Return  @Retval;        
    End
    
    Begin tran--开始事务
    
    --往收款人的账号里面加钱
    Update ACCOUNT set balance=balance+@amount where AccountId=@acc2;
    IF(@@ERROR <> 0)
    GOTO ERR;   
    
    --往转账人的账号里面扣减
    Update ACCOUNT set balance=balance-@amount where AccountId=@acc1;
    IF(@@ERROR <> 0)
    GOTO ERR;           
    
    Commit tran;--提交事务
    Return @Retval;     
    
    ERR:
    rollback tran;--回滚事务
    Set @Retval=500;
    Return @Retval;
    
End

4)对该存储过程进行测试

--声明一个变量,保存存储过程的执行结果
declare @a int;
EXEC sp_transfer '6223000000001','6223000000002',200.0,@a out;
select @a;
select * from ACCOUNT;
--声明一个变量,保存存储过程的执行结果
declare @b int;
EXEC sp_transfer '6223000000001','6223000000002',-100.0,@b out;
select @b;
select * from ACCOUNT;
--声明一个变量,保存存储过程的执行结果
declare @c int;
EXEC sp_transfer '6223000000002','0000000012345',100.0,@c out;
select @c;
select * from ACCOUNT;

相关文章

  • 存储过程的测试

    存储过程 数据库脚本,由SQL语句组成的。 事务 事务是由DML操作(增删改操作的集合组成了事务)组成的。比如:张...

  • 存储过程自动创建表分区(按时间)

    存储过程 参数说明 创建测试表 调用存储过程创建分区

  • MySQL插入一亿条数据

    创建数据表 创建用户表 创建存储过程 调用存储过程插入一亿条数据 查看表空间 插入数据测试统计 查询测试

  • Python实现MySQL 压测工具

    mysql存储过程Procedure可以循环建立1000万行的测试数据,可以参考Mysql存储过程Procedu...

  • Orcale Jobs

    一、1.创建一张测试表 2.创建存储过程 实现向测试表插入数据 3.创建job定时任务 实现自动调用存储过程(当...

  • mysql-存储函数、存储过程

    在测试数据的过程中,通过存储函数及存储过程构造数据: # 生成随机字符串 DELIMITER $$CREATE F...

  • oracle捕获并抛出异常

    写一个测试用例,用存储过程捕获异常并抛出异常,定位异常信息。 1.新建一张表 2.新新建一个测试的存储过程 调用此...

  • L2-13定义实用的测试性能指标

    建立和部署一套面向测试目标的测试过程性能指标,以测量测试过程的质量,同时也包括了测试性能指标相关的数据收集、存储和...

  • MYSQL 基本操作之11(事件调度器)

    查看是否已开启事件调度器 创建测试表 创建存储过程 调用存储过程 创建事件语法 6.创建事件 调度举例 修改语法 ...

  • kettle 另类处理存储过程

    kettle 另类处理存储过程 今有一项目需要用kettle访问存储过程,经过测试发现使用【表输入】组件是无法完成...

网友评论

      本文标题:存储过程的测试

      本文链接:https://www.haomeiwen.com/subject/ojfppftx.html