(注意事项: 在使用游标的时候,不能在游标声明之前,使用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 存储过程的写法的更多相关文章

  1. asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)

    asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...

  2. Oracle的存储过程基本写法

    转: Oracle的存储过程基本写法 目录 1.1,Oracle存储过程简介: 1.2,创建存储过程的语法: 2.0,游标的使用.看到的一段解释很好的概念,如下: 回到顶部 1.1,Oracle存储过 ...

  3. MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多

    一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...

  4. mysql+mybatis+存储过程+事务 + 多并发流水号获取

    数据库存储过程 drop PROCEDURE generate_serial_number; CREATE PROCEDURE generate_serial_number( ), IN param_ ...

  5. MyBatis 存储过程

    From<MyBatis从入门到精通> <!-- 6.2 存储过程 6.2.1 第一个存储过程 delimiter ;; create procedure 'select_user_ ...

  6. mybatis 存储过程与游标的使用

    MyBatis还能对存储过程进行完全支持,这节开始学习存储过程.在讲解之前,我们需要对存储过程有一个基本的认识,首先存储过程是数据库的一个概念,它是数据库预先编译好,放在数据库内存中的一个程序片段,所 ...

  7. Mybatis(二) Mybatis通用的写法

    2.1 用来循环容器的标签forEach,查看例子   foreach元素的属性主要有item,index,collection,open,separator,close. item:集合中元素迭代时 ...

  8. 判断同名股票是否存在的MyBatis查询函数写法

    在A股中,除非股票退市,六位的股票代号是永不变化的,而名称则可能变化,比如更换主业,更换金主,因经营不善而戴帽等,这时名称都会改变. 因此,从网页上爬取的实时股票信息,需要常常与存在本地数据库里的信息 ...

  9. 关于sql server 2005存储过程的写法

    打开数据库的SQL Server Managerment Studio---->数据库----->打开数据库会看见"可编程行"------->打开有存储过程--- ...

随机推荐

  1. c++11实现DLL帮助类

    用过DLL的人都会发现,在C++中调用dll中的函数有点繁琐,调用过程如下:在加载dll后还要定义一个对应的函数指针类型,接着调用GetProcAddress获取函数地址,再转成函数指针,最后调用函数 ...

  2. bzoj2616

    树形dp+笛卡尔树+单调栈 这道题跟树形dp有什么关系? 事实上,我们对矩形建立笛卡尔树,先找出最矮的矩形,向两边区间最矮的矩形连边,这样就构成了一棵二叉树,因为只有一个矮的区间会对高的区间造成影响, ...

  3. Start Developing Mac Apps -- App Design 应用程序设计

    App Design Apps do not exist on their own. They not only interact seamlessly with their environment, ...

  4. linux中fork对打开文件的处理

    1 子进程复制父进程的数据段.BBS段.代码段.堆空间.栈空间和文件描述符 2 对于文件描述符采用共享的方式 后面这个例子可以清晰的看出 #include <sys/types.h> #i ...

  5. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时10

    课时10 神经网络训练细节part1(上) 没有大量的数据也不会有太多影响,只需要找一个经过预训练的卷积神经网络然后进行调整 从数据集中抽样一小批数据, 将数据运入卷积神经网络中来计算损失值 通过反向 ...

  6. 模板 - 字符串 - Manacher

    求最长回文子串. #include<bits/stdc++.h> using namespace std; #define ll long long ; ]; ]; int Manache ...

  7. hihoCoder搜索二·骑士问题

    #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...

  8. 【UVA - 540】Team Queue (map,队列)

    Team Queue Descriptions: Queues and Priority Queues are data structures which are known to most comp ...

  9. Udp实现省略编码

    class My_Socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = encoding super ...

  10. UWP 剪贴板

    一:剪贴板 一般的复制,用户自己光标选中文本,crtl +c复制就可以了.但是有时候也需求有一个复制的按钮,当用户点击复制按钮,就可以把当前的某些内容复制到剪贴板里. 这里就用到了DataPackag ...