/*

一、

1、编写存储过程实现转账过程

2、提示:

(1)涉及t_user、t_account表,新建t_transfer_log表

(2)转账金额小于100,不收手续费,在100-1000范围收取0.1%的手续费,在1000-5000收取0.3%手续费,在5000-10000收取0.5%,大于10000收取1%手续费,封顶50块。

(3)记录转账日志

*/

# 新建t_transfer_log表

create table t_transfer_log(

transfer_id int(11) primary key auto_increment comment '转账编号',

sender_id int(11) not null comment '转出人编号',

receiver_id int(11) not null comment '收款人编号',

amount double(11,2) not null default 0.00 comment '转账金额',

fee double(11,2) not null default 0.00 comment '手续费',

status char(1) not null default '0' comment '转账状态:0-开始转账;1-转账中;2-转账成功;3-转账失败',

transfer_date datetime not null default current_timestamp comment '转账时间',

update_date datetime not null default current_timestamp on update current_timestamp comment '更新时间'

)engine=innodb default charset=utf8 comment '转账记录表';

# 编写存储过程实现转账过程

CREATE PROCEDURE proc_transfer (IN in_sender_id INT, IN in_receiver_id INT, in in_amount DOUBLE, OUT out_msg VARCHAR (20))

begin

# 转出人账余额

declare v_sender_balance double default 0.00;

# 手续费

declare v_fee double default 0.00;

# 转账记录id

declare v_transfer_id int;

# 语句执行标志

declare done int default 0;

# 语句执行错误修改执行标志

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

# 获取转账记录的id

select max(transfer_id) into v_transfer_id from t_transfer_log where sender_id = in_sender_id;

# 查询转出人账户余额

select balance into v_sender_balance from t_account where user_id = in_sender_id;

# 计算转账金额

if in_amount <= 100 THEN

set v_fee = 0;

elseif in_amount > 100 and in_amount <= 1000 then

set v_fee = in_amount * 0.001;

elseif in_amount > 1000 and in_amount <= 5000 then

set v_fee = in_amount * 0.003;

elseif in_amount > 5000 and in_amount <= 10000 then

set v_fee = in_amount * 0.005;

else

set v_fee = in_amount * 0.01;

end if;

# 判断手续费是否到达50封顶

if v_fee > 50 then

set v_fee = 50;

end if;

# 创建转账日志

insert into t_transfer_log(sender_id, receiver_id, amount, fee) values (in_sender_id, in_receiver_id, in_amount, v_fee);

# 开启事务

start transaction;

# 判断账户余额是否大于或者等于转账金额+手续费

if v_sender_balance >= in_amount + v_fee THEN

# 修改转账记录的状态为转账中

update t_transfer_log set status = '1' where transfer_id = v_transfer_id;

# 转出人余额减区转账金额和手续费

update t_account set balance = balance - in_amount - v_fee where user_id = in_sender_id;

# 收款人余额减区转账金额

update t_account set balance = balance + in_amount where user_id = in_receiver_id;

# 修改转账记录的状态为转账失败

update t_transfer_log set status = '2' where transfer_id = v_transfer_id;

# 提示转账结果

set out_msg = '转账成功!';

else

# 提示转账结果

set out_msg = '余额不足,转账失败!';

# 修改转账记录的状态为转账失败

update t_transfer_log set status = '3' where transfer_id = v_transfer_id;

end if;

if done = 1 then

# 回滚事务

rollback;

# 修改转账记录的状态为转账失败

update t_transfer_log set status = '3' where transfer_id = v_transfer_id;

# 提示转账结果

set out_msg = '系统异常,转账失败!';

else

# 提交事务

commit;

end if;

end;

# 测试

set @msg = '';

call proc_transfer(1, 2, 10000, @msg);

select @msg;

MySQL转账储存过程_mysql中用存储过程实现转账过程相关推荐

  1. mysql数据库储存过程

    mysql数据库储存过程 mysql数据库的 '储存过程' 其实就是把多个select操作的语句封装起来,再给他们一个名称用来以后的调用,你可以理解为python中的函数,差不多 优点 1 通过吧处理 ...

  2. 创建MYSQL的储存过程

    创建MYAQL的存储过程 1   创建不带参数的储存过程 CREATE  PROCEDURE  过程名()  过程体 SELECT  VERSION(); 2   调用储存过程 第一种   CALL ...

  3. mysql json储存过程_SQL-mysql储存过程

    一 前言 本篇内容是关于mysql储存过程的知识,学习本篇的基础是知识追寻者之前发过的文章(公众号读者看专辑) <SQL-你真的了解什么SQL么?> <SQL-小白最佳入门sql查询 ...

  4. mysql创建过程_创建MYSQL的储存过程

    创建MYAQL的存储过程 1   创建不带参数的储存过程 CREATE  PROCEDURE  过程名()  过程体 SELECT  VERSION(); 2   调用储存过程 第一种   CALL ...

  5. mysql查询解析过程_MySQL查询执行过程详解

    查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...

  6. mysql创建储存过程 输入学生名子_mysql 创建存储过程

    1. 首先呢,我这里给出存储过程的定义,到底什么是存储过程. 存储过程是指,在大型数据库系统中,为了提高数据库操作的效率和SQL代码的封装,完成特定功能的SQL语句集, 存储在数据库中,经过第一次编译 ...

  7. mysql函数如何调用过程_MySQL调用存储过程和函数

    存储过程和存储函数都是存储在服务器端的 sql 语句集合.要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现. 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MysqL ...

  8. mysql中储存过程的作用_存储过程在数据库中的作用是什么

    存储过程在数据库中的作用:1.存储过程可接受参数.输出参数.返回单个或多个结果集及返回值:2.存储过程运行比较稳定,不会有太多的错误:3.存储过程主要是在服务器上运行,减少对客户机的压力. 存储过程在 ...

  9. mysql创建储存过程 输入学生名子_创建一个存储过程,给定某学生学号,要求查询出该学生的姓名,所选课程名和成绩.(SQL SERVER)...

    展开全部 /*创建存储过程*/ CREATE PROCEDURE proc_select--建立存储过程 @Sno char(10) output,--输入输出参数636f70793231313335 ...

最新文章

  1. Python知识点3——列表操作
  2. 预训练模型真的越大越好吗?听听他们怎么说
  3. Python常见的数据类型【数字、布尔、字符串、列表和元组、字典】
  4. 前端学习(1555):ng-app指令
  5. Linux 定时执行命令 crontab
  6. 这些解决 Bug 的套路,你都会了不?
  7. Iview的Tabs定时切换
  8. 域控计算机策略转换成用户策略,windows组策略实验-本地组策略和域控组策略
  9. STM32之FSMC的液晶使用
  10. 根据元素相对位置来控制滚动条
  11. SQL:PostgreSQL+PostGIS的安装以及C# GDAL开发环境配置
  12. 服务器中C盘的虚拟大文件,查看虚拟机的大文件系统
  13. PS2019工具介绍笔记(一)
  14. 一句话详解常见的心理学效应
  15. 支付宝登录java_支付宝登录java和android
  16. 微信企业号 sdk java_基于Java spring框架的微信企业号开发中关于js-sdk的配置
  17. 时光里,我一个人的碎碎念。
  18. 数据库技术:关系型数据库设计总结
  19. JS之父再谈JS历史(一)
  20. 苹果的教育优惠怎么弄_2020 苹果教育优惠:iPad 选购指南

热门文章

  1. Cuteftp连接虚拟机Centos7
  2. 项目案例之GitLab的数据迁移
  3. CCS11用户界面介绍2
  4. 小白重装系统教程_小白一键重装系统win8教程
  5. JVM中的新生代和老年代(Eden空间、两个Survior空间)
  6. window.scrollTo控制滚动条平滑的滚动到某个位置
  7. hdoj4550 威威猫系列故事——打地鼠(java版)
  8. elementui的使用问题
  9. W7正在锁定计算机,W7系统锁定电脑屏幕的步骤
  10. HTML人物介绍、个人设计web前端大作业、贝聿铭人物介绍(带报告3000字)