mybatis 存储过程的写法
(注意事项: 在使用游标的时候,不能在游标声明之前,使用crud)
存储过程示例
CREATE DEFINER=`root`@`::` PROCEDURE `earnings_proceduce`(out result varchar())
label:BEGIN
#收益记录的分配 # 基本参数的定义
# 总金额
DECLARE _total_money BIGINT DEFAULT ;
# 发放配置占比
DECLARE _deduct BIGINT;
# 待发放金额
DECLARE _stay_out BIGINT DEFAULT ;
# 用户最多保存数量
DECLARE _num BIGINT DEFAULT ;
# 查询通宝币总额
DECLARE _tb_num BIGINT DEFAULT ;
# 实际发放金额
DECLARE _amount BIGINT DEFAULT ;
# 定时发放时间分钟
DECLARE _time_mi BIGINT DEFAULT ;
# 收入统计的id
DECLARE _newid BIGINT; # 判断是否遍历全部记录的标记
DECLARE done int default ;
# 标识事务错误
DECLARE err INT DEFAULT ; DECLARE i_id BIGINT;
DECLARE i_num BIGINT; # 使用游标将数据存储到数据库中,并进行实际发放金额的统计
DECLARE cur CURSOR FOR
select c.id,sum(d.numbers) from
( select a.id from sys_user a LEFT JOIN earnings_record b ON a.id = b.user_id and b.status = '' GROUP BY a.id having count(a.id) <= (
select deduct from earnings_manage where type =
)) c join zxt_detail d on c.id = d.creator group by c.id; # 出现错误,设置为1,只要发生异常就回滚
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=;
# 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = ;
set result=''; # 查询总金额
select IFNULL(sum(order_money),) into _total_money from other_order where ISNULL(issue_id);
# 如果为0 就退出存储过程
if _total_money = THEN
set result='查询总金额为0,不进行发放';
LEAVE label;
end if; # 查询基本配置
select deduct into _deduct from earnings_manage where type = ;
# 计算待发放金额
set _stay_out=ROUND(_total_money * _deduct /);
# 如果为0 就退出存储过程
if _stay_out = THEN
set result='待发放金额金额为0,不进行发放';
LEAVE label;
end if; # 查询通宝总额
select IFNULL(sum(numbers),) into _tb_num from zxt_detail;
# 如果为0 就退出存储过程
if _tb_num = THEN
set result='通宝总金额为0,不进行发放';
LEAVE label;
end if; # 定时发放的时间
select deduct * into _time_mi from earnings_manage where type = ; # 开启事务
start TRANSACTION;
# 打开游标
open cur;
# 开始循环
read_loop: LOOP
# 提取游标的数据
FETCH cur INTO i_id,i_num;
# 声明结束的时候
IF done = THEN
LEAVE read_loop;
END IF; # 事务的处理
# 获取新的id
set _newid = REPLACE(unix_timestamp(current_timestamp()),'.','');
set i_num = FLOOR( _stay_out * i_num / _tb_num);
# 添加个人收益
IF i_num != THEN
set _amount = _amount+i_num;
INSERT INTO `earnings_record` (`creator`, `user_id`, `status`, `amount`, `create_date`) VALUES ('',i_id,'',i_num, NOW());
end if;
end LOOP read_loop; # 添加总收益
INSERT INTO `earnings_issue` (`id`, `stay_out`, `amount`, `other_id`, `updater`, `update_date`, `creator`, `create_date`, `deduct`, `earnings_sum`, `time_out`) VALUES (_newid, _stay_out, _amount, NULL, '', NOW(), '', NOW(),_total_money - _stay_out, _total_money, _time_mi); # 给订单表绑定任务
update other_order set issue_id = _newid where ISNULL(issue_id); # 如果事务发生错误,就进行回滚
IF err= THEN
# 如果发生回滚就表示发生发生错误
set result='发生了回滚,不进行发放';
ROLLBACK;
ELSE
commit;
end if;
#关闭游标
CLOSE cur; END
mybatis 存储过程的写法的更多相关文章
- asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)
asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...
- Oracle的存储过程基本写法
转: Oracle的存储过程基本写法 目录 1.1,Oracle存储过程简介: 1.2,创建存储过程的语法: 2.0,游标的使用.看到的一段解释很好的概念,如下: 回到顶部 1.1,Oracle存储过 ...
- MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...
- mysql+mybatis+存储过程+事务 + 多并发流水号获取
数据库存储过程 drop PROCEDURE generate_serial_number; CREATE PROCEDURE generate_serial_number( ), IN param_ ...
- MyBatis 存储过程
From<MyBatis从入门到精通> <!-- 6.2 存储过程 6.2.1 第一个存储过程 delimiter ;; create procedure 'select_user_ ...
- mybatis 存储过程与游标的使用
MyBatis还能对存储过程进行完全支持,这节开始学习存储过程.在讲解之前,我们需要对存储过程有一个基本的认识,首先存储过程是数据库的一个概念,它是数据库预先编译好,放在数据库内存中的一个程序片段,所 ...
- Mybatis(二) Mybatis通用的写法
2.1 用来循环容器的标签forEach,查看例子 foreach元素的属性主要有item,index,collection,open,separator,close. item:集合中元素迭代时 ...
- 判断同名股票是否存在的MyBatis查询函数写法
在A股中,除非股票退市,六位的股票代号是永不变化的,而名称则可能变化,比如更换主业,更换金主,因经营不善而戴帽等,这时名称都会改变. 因此,从网页上爬取的实时股票信息,需要常常与存在本地数据库里的信息 ...
- 关于sql server 2005存储过程的写法
打开数据库的SQL Server Managerment Studio---->数据库----->打开数据库会看见"可编程行"------->打开有存储过程--- ...
随机推荐
- May Challenge 2017
Chef and his daily routine 分析:水题,设置优先级,判断如果后面小于前面就输出no #include "iostream" #include " ...
- Java必知必会:异常机制详解
一.Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的. 1.Throwable(可抛出):异常类的最终父类,它有两个子类,Error与 ...
- web_html-day1
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...
- 安装Tomcat(windows系统和linux系统)
Tomcat不管是windows还是Linux版本,都是解压后就再配置一下就可以使用.安装Tomcat前必须先安装JDK,一般我们可以在eclipse中加入Tomcat来开发. 什么是Tomcat? ...
- 任务30:RoutingMiddleware介绍以及MVC引入
任务30:RoutingMiddleware介绍以及MVC引入 前面讲到app.Map的方式,它也可以实现路由 当我们的url是task的时候,就会执行里面的context的输出内容 app.Map( ...
- emacs编辑c文件时,大括号的跳转(转载)
转自:http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=26701 `C-M-n' Move forward over a parenthetic ...
- python __builtins__ credits类 (15)
15.'credits', 信用 class _Printer(builtins.object) | interactive prompt objects for printing the licen ...
- 项目中java异常处理
一.java异常类介绍. Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类. 有一篇比较好的blog ...
- GCD = XOR(GCD XOR )
首先没看懂XOR(于是百度了一下):异或,英文为exclusive OR,或缩写成xor.同时还有一个OR,于是一起看了一眼: 大意: 输入一个整数n,在1~n内,有多少对整数(a,b)满足GCD(a ...
- SQL SUM函数内使用CASE函数
- 实例 - 在这个表里进行查询: 查询出如下结果(统计每天的输赢次数): - 开始查询 - 首先创建测试表: CREATE TABLE info( date ), result ) ); 插入测试数 ...