存储过程的测试

存储过程

数据库脚本,由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;

你可能感兴趣的:(存储过程的测试)