mybatis 存储过程的写法

  (注意事项: 在使用游标的时候,不能在游标声明之前,使用crud)

  存储过程示例

CREATE DEFINER=`root`@`::1` PROCEDURE `earnings_proceduce`(out  result varchar(100))
label:BEGIN
    #收益记录的分配

    # 基本参数的定义
    # 总金额
    DECLARE _total_money BIGINT DEFAULT 0;
    # 发放配置占比
    DECLARE _deduct BIGINT;
    # 待发放金额
    DECLARE _stay_out BIGINT DEFAULT 0;
    # 用户最多保存数量
    DECLARE _num BIGINT DEFAULT 0;
    # 查询通宝币总额
    DECLARE _tb_num BIGINT DEFAULT 0;
    # 实际发放金额
    DECLARE _amount BIGINT DEFAULT 0;
    # 定时发放时间分钟
    DECLARE _time_mi BIGINT DEFAULT 0;
    # 收入统计的id
    DECLARE _newid BIGINT;

    # 判断是否遍历全部记录的标记
    DECLARE done int default 0;
    # 标识事务错误
  DECLARE err INT DEFAULT 0;

  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 = ‘0‘ GROUP BY a.id having count(a.id) <= (
    select deduct from earnings_manage where type = 4
    )) c join zxt_detail d on c.id = d.creator group by c.id;

    # 出现错误,设置为1,只要发生异常就回滚
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
    # 将结束标志绑定到游标
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    set result=‘0‘;

    # 查询总金额
    select IFNULL(sum(order_money),0) into _total_money from other_order where ISNULL(issue_id);
    # 如果为0 就退出存储过程
    if _total_money = 0 THEN
            set result=‘查询总金额为0,不进行发放‘;
            LEAVE label;
    end if;

    # 查询基本配置
    select deduct into _deduct from earnings_manage where type = 0;
    # 计算待发放金额
    set _stay_out=ROUND(_total_money * _deduct /100);
# 如果为0 就退出存储过程
    if _stay_out = 0 THEN
            set result=‘待发放金额金额为0,不进行发放‘;
            LEAVE label;
    end if;

# 查询通宝总额
    select IFNULL(sum(numbers),0) into _tb_num from zxt_detail;
    # 如果为0 就退出存储过程
    if _tb_num = 0 THEN
            set result=‘通宝总金额为0,不进行发放‘;
            LEAVE label;
    end if;

    # 定时发放的时间
    select deduct * 60 into _time_mi from earnings_manage where type = 3;

    # 开启事务
    start TRANSACTION;
    # 打开游标
    open cur;
    # 开始循环
    read_loop: LOOP
    # 提取游标的数据
    FETCH cur INTO i_id,i_num;
    # 声明结束的时候
  IF done = 1 THEN
     LEAVE read_loop;
  END IF;

    # 事务的处理
    # 获取新的id
    set _newid = REPLACE(unix_timestamp(current_timestamp(3)),‘.‘,‘‘);
    set i_num = FLOOR( _stay_out * i_num / _tb_num);
    # 添加个人收益
    IF i_num != 0 THEN
            set _amount = _amount+i_num;
            INSERT INTO `earnings_record` (`creator`, `user_id`, `status`, `amount`, `create_date`) VALUES (‘10000‘,i_id,‘0‘,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, ‘10000‘, NOW(), ‘10000‘, NOW(),_total_money - _stay_out, _total_money, _time_mi);

    # 给订单表绑定任务
    update other_order set issue_id = _newid where ISNULL(issue_id);

    # 如果事务发生错误,就进行回滚
    IF err=1 THEN
            # 如果发生回滚就表示发生发生错误
            set result=‘发生了回滚,不进行发放‘;
            ROLLBACK;
    ELSE
        commit;
    end if;
    #关闭游标
  CLOSE  cur;

END

原文地址:https://www.cnblogs.com/chengyangyang/p/10382941.html

时间: 2024-10-11 13:38:42

mybatis 存储过程的写法的相关文章

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

asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varchar(100)as select * from loginuser where name like @name ---创建一个有输入和输出参数的存储过程 create procedure proc_usertext@name varchar(20),@blog varchar(100) output

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

一.用到的实体类如下: Student.java [html] view plaincopy package com.company.entity; import java.io.Serializable; import java.util.Date; public class Student implements Serializable{ private static final long serialVersionUID = 1L; private int id; private Stri

mybatis 存储过程

MyBatis还能对存储过程进行完全支持,这节开始学习存储过程.在讲解之前,我们需要对存储过程有一个基本的认识,首先存储过程是数据库的一个概念,它是数据库预先编译好,放在数据库内存中的一个程序片段,所以具备性能高,可重复使用的特性.它定义了3种类型的参数:输入参数.输出参数.输入输出参数. •输入参数,是外界给的存储过程参数,在Java互联网中,也就是互联网系统给它的参数. •输出参数,是存储过程经过计算返回给程序的结果参数. •输入输出参数,是一开始作为参数传递给存储过程,而存储过程修改后将其

mybatis 存储过程调用

接口 UserInfoMapper.java xml   UserInfoMapper.xml 如何关联 <?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <

SqlServr分页存储过程的写法

CREATE PROCEDURE [dbo].[GetDataByPager] ( --从第几条数据取 @startIndex INT, --分页的表 @tableName VARCHAR(50), --每次取多少条 @pageSize INT=5, --条件 @condition VARCHAR(1000)='1=1', --通过Id进行排除 @key VARCHAR(20)='id' )AS BEGIN --通过主建排除法 不需要进行排序 DECLARE @TopCount INT --SE

oracle 存储过程的写法

create or replace procedure Getyc is  v_id VARCHAR2(36);  v_date VARCHAR2(4); begin  declare    begin      for i in (select           c.xqbm      from T_BAS_GCJBXX c     where c.id in (select a.id                      from T_BAS_GCJBXX a             

SQL Server 存储过程的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

MyBatis_ibatis和mybatis的区别【转】

1. ibatis3.*版本以后正式改名为mybaits,它也从apache转到了google code下:也就是说ibatis2.*,mybatis3.*. 2. 映射文件的不同 ibatis的配置文件如下 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0/