• mysql 存储过程


    DELIMITER $$
    
    USE `elephant`$$
    
    DROP PROCEDURE IF EXISTS `procs_cal_order_overdue`$$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `procs_cal_order_overdue`()
    BEGIN
          DECLARE order_code VARCHAR(50);
          DECLARE overdue_status INT;
          DECLARE max_overdue_days INT;
          DECLARE user_id INT;
          DECLARE current_overdue_status INT;
          DECLARE overdue_amount DOUBLE;
          DECLARE current_max_overdue_days INT;
          
          DECLARE done INT DEFAULT FALSE;
          DECLARE i INT DEFAULT 0;
          
          DECLARE cur CURSOR FOR 
          (
            SELECT 
            t1.order_code order_code, 
            CASE WHEN SUM(t1.everoverdue)>0 THEN 1 ELSE 0 END overdue_status,
            MAX(t1.overdays) max_overdue_days,
            t1.user_id user_id,
            CASE WHEN SUM(t1.cover)>0 THEN 1 ELSE 0 END current_overdue_status,
            ROUND(SUM(t1.overamount),2) overdue_amount,
            MAX(t1.coverdays) current_max_overdue_days
            FROM 
            (
            SELECT 
            a.order_code,
            CASE WHEN b.repayment_status='2' THEN d.overdue_days WHEN b.repayment_status='3' THEN c.overdue_days ELSE 0 END overdays,
            CASE WHEN b.repayment_status IN ('2','3') THEN 1 ELSE 0 END everoverdue,
            a.user_id,
            CASE WHEN b.repayment_status='2' THEN 1 ELSE 0 END cover,
            CASE WHEN b.repayment_status IN ('2','5') THEN d.overdue_amount ELSE 0 END overamount,
            CASE WHEN b.repayment_status='2' THEN d.overdue_days ELSE 0 END coverdays
            FROM t_am_bystages_order a
            LEFT JOIN t_am_repayment_plan b ON a.order_id=b.order_id
            LEFT JOIN t_am_repayment_detail c ON b.id=c.repayment_plan_id
            LEFT JOIN t_report_plan_overdue_status d ON b.id=d.plan_id
            WHERE a.status IN ('1','3')
            ) t1
            GROUP BY t1.order_code
          );
          
          DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
          
          SET @exesql = "";      
          SET @exedata = "";      
          
          OPEN cur;
          myloop :LOOP
            FETCH cur INTO order_code,overdue_status,max_overdue_days,user_id,current_overdue_status,overdue_amount,current_max_overdue_days;
            IF i!=0 AND i%1000=0 THEN
               SET @exedata = SUBSTRING(@exedata, 2);
               SET @exesql = CONCAT("REPLACE into t_report_order_overdue_status(order_code,overdue_status,max_overdue_days,user_id,create_time,current_overdue_status,overdue_amount,current_max_overdue_days) values ", @exedata);   
               PREPARE stmt FROM @exesql;
               EXECUTE stmt;
               DEALLOCATE PREPARE stmt;
               SET @exedata = "";
            END IF;        
            IF done THEN 
                 IF i!=0 THEN 
                 SET @exedata = SUBSTRING(@exedata, 2);
                 SET @exesql = CONCAT("REPLACE into t_report_order_overdue_status(order_code,overdue_status,max_overdue_days,user_id,create_time,current_overdue_status,overdue_amount,current_max_overdue_days) values ", @exedata);          
                 PREPARE stmt FROM @exesql;
                 EXECUTE stmt;
                 DEALLOCATE PREPARE stmt;
                 END IF;
               LEAVE myloop;
            END IF;
            SET @exedata = CONCAT(@exedata, ",('",order_code,"',",overdue_status,",",max_overdue_days,",",user_id,",'",NOW(),"',",current_overdue_status,",",overdue_amount,",",current_max_overdue_days,")");
            SET i=i+1;       
            /*REPLACE into t_report_plan_overdue_status (plan_id,overdue_days,overdue_amount,create_time,user_id,order_code,order_id,bs_code) values 
            (planId,overdueDays,overdueAmount,now(),userId,orderCode,orderId,bsCode);*/
          END LOOP;
          CLOSE cur;      
          
        END$$
    
    DELIMITER ;


    主要就是从多张表汇总数据到一张表,涉及到了sql拼接,游标遍历,分批提交

  • 相关阅读:
    五,系统操作命令说明
    三,linux系统的由来
    二,服务器磁盘阵列(raid)
    一服务器硬件介绍
    四,元组类型
    集合类型
    字典类型
    三,列表类型
    二,字符串类型
    一,数字类型
  • 原文地址:https://www.cnblogs.com/younldeace/p/6934541.html
Copyright © 2020-2023  润新知