mybatis中存储过程的调用

  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`@`::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/10382910.html

时间: 2024-08-28 19:59:10

mybatis中存储过程的调用的相关文章

Postgresql中存储过程(函数)调用存储过程(函数)时应用注意的问题

在postgresql中我们在执行存储过程中往往会使用select 存储过程,但是如果存储过程中再调用 存储过程时,就不能这样用了,应该用perform 存储过程,来看看官方文档的说明 ===================================================================== 执行一个没有结果的表达式或者命令 有时候我们希望计算一个表达式或者一个命令,但是却丢弃其结果(通常因为我们经常调用一些存在有用的副作用但是不存在有用结果值的函数). 要在 P

MyBatis学习总结(六)——调用存储过程(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(六)--调用存储过程 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男");

MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动成批地帮助我们根据这些接口生成DAO对象(),然后我们再使用Spring把这些DAO对象注入到业务逻辑层的对象(Service类的对象).因此,在这种情况下的DAO层,我们几乎不用编写代码,而且也没有地方编写,因为只有接口.这固然方便,不过如果我们需要在DAO层写一些代码的话,这种方式就无能为力了.此时,MyBatis-Spring提供给我们的SqlSessionDaoSupport类

MyBatis中的OGNL教程

MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索OGNL相关的内容,通常的结果都是和Struts有关的,你肯定搜不到和MyBatis有关的,虽然和Struts中的用法类似但是换种方式理解起来就有难度. MyBatis常用OGNL表达式 e1 or e2 e1 and e2 e1 == e2,e1 eq e2 e1 != e2,e1 neq e2

sqlserver 中存储过程的基础知识记录

1.什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 2.为什么要用存储过程? 1)存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2)当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用. 3)存储过程可以重复使用,可减少数据库开发人员的工作量. 4)安全性高,可设定

Mybatis中的resultType和resultMap 区别

Mybatis中的resultType和resultMap 是mybatis 中返回类型一定用到的,但不会同时出现.mybatis返回类型肯定是map结构,然后根据返回类型是map还是对象类型,再转换. 在给对象设置属性的时候,两个方法肯定会调用. private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException { final ResultLoaderMap lazyLoader

MSSQL中存储过程的可选参数的定义和使用

可选参数的存在,可以极大的降低代码的重复冗余.在数据库开发中,也是如此.现在针对MSSQL中存储过程的可选参数的定义和使用进行基本的介绍,留作备忘. #准备工作: 在db_test中建立一张测试表T_test: USE db_test; CREATE TABLE dbo.T_test ( Id  INT  IDENTITY(1,1) NOT NULL ,Name  NVARCHAR(20)  NOT NULL ,Sex  BIT  DEFAULT(0) ); 插入一些数据: INSERT INT

mybatis 中#与$的区别

MyBatis/Ibatis中#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,

mybatis 中mapper 的namespace有什么用

原文:http://zhidao.baidu.com/link?url=ovFuTn7-02s7Qd40BOnwHImuPxNg8tXJF3nrx1SSngNY5e0CaSP1E4C9E5J6Xv5fI9P_dTMqHeBRGOID9bk9IcY1o9h6O21l6rHRAwj_Km3 ----------------------------------------------------------------------------------------------------------