dao层

// 调用存储过程
void callProcedureGrantEarnings(@Param("params") Map<String,Object> params);

  Xml

<select id="callProcedureGrantEarnings" statementType="CALLABLE">
{call earnings_proceduce(#{params.result,mode=OUT,jdbcType=VARCHAR})}
</select>

得到的结果就在map中的result中。

存储过程

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中存储过程的调用的更多相关文章

  1. EF中存储过程的使用

    存储过程即用来完成一个特定功能的一段代码.它的优缺点 优点 存储过程可封装,并隐藏复杂的商业逻辑. 存储过程可以回传值,并可以接受参数. 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与 ...

  2. mybatis中调用游标,存储过程,函数

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  3. MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程

    虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...

  4. PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行

    培训考试项目中,需要实现考试成绩排名:排名参考项为分数(score降序).参加日期(attendtime升序).第几次参加考试(frequency升序):并且,每个用户只保留一条数据(pid). 考试 ...

  5. Oracle之带参存储过程(存储过程中for循环调用存储过程)

    --带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...

  6. MyBatis 中如何调用 Java 的 enum (枚举) 字段

    事先作成一 enum,如下: public enum CityCode { ALL("000"), BEIJING("010"), SHANGHAI(" ...

  7. 如何在MyBatis中优雅的使用枚举

    问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举:   public enum ComputerState { OPEN(10), //开启 CLOSE( ...

  8. 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器

    前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...

  9. 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'

    在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL ...

随机推荐

  1. UIAlterController 的使用

    相对于IOS8.4之后苹果对提示框做了进一步的封装,这将与之前的提示框有很大的同. 之前的 UIAlterView  是弹出一个提示框. 而今天学习的提示框是 通过视图控制器进行弹出,这就意味着,我们 ...

  2. CSS中style用法详解

    转自:http://www.cnblogs.com/xingxingchongchong/p/6501575.html css样式表按其所在位置分三种: 1.内嵌样式表 2.内部样式表 3.外部样式表 ...

  3. Linux多台服务器间SSH免密码登录配置

    SSH实现各个服务器间的文件相互备份,如运行scp命令,可以实现免密码登录,从而可以使用SHELL脚本实现一些自动化的处理. 假如A机要免密码登录B机,具体方法如下: 1.在A机运行:"ss ...

  4. E20180403-hm

    accompany vt. 陪伴,陪同; 附加,补充; 与…共存; 为…伴奏 synchronous adj. 同时存在[发生]的,同步的 asynchronous adj. 异步的; particu ...

  5. poj2893 M*N puzzle 【n*m数码问题小结】By cellur925

    题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...

  6. Beta版本冲刺第二天!

    该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...

  7. Jquery | 基础 | 慕课网 | 元素选择器

    getElementsByTagName方法得到页面所有的<div>元素 var divs = document.getElementsByTagName('div'); 与 同样的效果, ...

  8. Caffe实战一(环境准备及CPU模式下编译)

    经过前几天的折腾,终于把Ubuntu16.04开发环境给搭建了起来,包括win10+Ubuntu双系统的安装.系统安装后的优化等等. 详见之前的文章:Ubuntu16.04.2 LTS 64bit系统 ...

  9. net 上传视频

    [HttpPost]        public ActionResult MultiUpload()        {            System.Web.HttpFileCollectio ...

  10. redis过期策略+事务+分布式锁+单redis服务器锁

    过期策略 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i ...