MySQL——循環(雙重循環)


-- 函數

-- 設置好時區
set time_zone = '+8:00';
-- 開啟事件調度器
set GLOBAL event_scheduler = 1;
 
drop event if exists commission_ms_ever_month; 
 
# 設置分隔符為 '$$' 
DELIMITER $$ 

create event commission_ms_ever_month  
on schedule every 1 MONTH  starts '2018-07-01 03:00:00'
do 
begin 
        CALL proc_commission_ms();
end $$ 
# 將語句分割符設置回 ';' 
DELIMITER ; 




DROP PROCEDURE IF EXISTS proc_commission_ms;
CREATE PROCEDURE proc_commission_ms()  
BEGIN  
-- 1、下戶就有提成,但訂單狀態為拒單或者放款時才加入計算
-- 2、以填寫面審信息流程的第一次提交賬號為提成歸屬人
-- 3、以主管審核(風控助理操作)流程的第一次提交時間作為下戶時間;(所以要有終審節點)
-- 4、下戶時間與拒單時間,下戶時間與放款時間不能跨3個月;
-- !!! v_select_mytask_txmsxx 填寫面試信息  v_select_mytask_zgsh主管審核 v_select_mytask_zs終審 v_order_reject拒單 v_task_loaned已放款
    
    -- 定義變量 (變量名稱不能和select 接收別名一樣)
    DECLARE txTime1 datetime;  
    DECLARE orderCode1 CHAR(100);  
    DECLARE receiveId1 int(11);  
    DECLARE receiveName1 CHAR(100);
    DECLARE xhTime1 datetime;
    DECLARE submitRole1 CHAR(255);
        
    DECLARE orderCode2 CHAR(100); 
    DECLARE doneTime2 CHAR(100);
    -- 定義結束標識 並綁定游標
    DECLARE done INT DEFAULT FALSE;
    DECLARE edone INT DEFAULT FALSE; 
    -- 定義游標01 --- 沒有3個月限制的數據 以及結束標識
    DECLARE _outerForEach CURSOR FOR  
            SELECT
                MIN(tx.finish_time) AS txTime,
                tx.order_code AS orderCode,
                tx.receive_id AS receiveId,
                tx.receive_name AS receiveName,
                MIN(sh.finish_time) AS xhTime,
                tx.submit_role AS submitRole
            FROM
                v_mytask_txmsxx tx,
                v_mytask_zgsh sh
            WHERE
                tx.order_code = sh.order_code
            AND tx.order_code in(SELECT order_code FROM v_mytask_zs)
            AND 
                tx.order_code IN (
                    SELECT order_code FROM v_order_lastmonth_reject_loaned -- 上個月產生的新拒單+放款
                )
            GROUP BY
                tx.order_code;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 結束標識
    
        # 打開游標1 
    OPEN _outerForEach;  
         read_loop: LOOP  -- 循環游標開始,
            FETCH _outerForEach INTO txTime1, orderCode1, receiveId1, receiveName1, xhTime1, submitRole1;
                        IF done THEN
                            LEAVE read_loop;#跳出循環
                        END IF;
                         BEGIN
                             # 定義游標02 --- 已放款的和拒單的單子 --並 排除已經進入面審提成庫的單子
                            DECLARE _innerForEach CURSOR FOR  
                                     SELECT order_code as orderCode,finish_time AS doneTime FROM v_order_reject 
                                    WHERE order_code not in(SELECT order_code FROM commission_inquiry_collection WHERE type = 1)
                                     UNION ALL 
                                     SELECT orderCode as orderCode,finishTime AS doneTime FROM v_task_loaned
                                    WHERE orderCode not in(SELECT order_code FROM commission_inquiry_collection WHERE type = 1);  
                             DECLARE CONTINUE HANDLER FOR NOT FOUND SET edone = 1;#結束標識
                             # 打開游標2 
                             OPEN _innerForEach;
                                 inner_loop: LOOP
                                     FETCH _innerForEach INTO orderCode2,doneTime2;
                                         IF edone THEN
                                             LEAVE inner_loop;
                                         ELSE
                                        #(處理業務)訂單號一致,而且時間差3個月以內,插入統計表
                                              IF (orderCode2 = orderCode1 AND xhTime1 IS NOT NULL AND doneTime2 IS NOT NULL AND TIMESTAMPDIFF(MONTH,xhTime1,doneTime2) <= 3) THEN 
                                                 INSERT INTO `commission_inquiry_collection` (
                                                     `user_id`,
                                                     `order_code`,
                                                     `execute_time`,
                                                     `task_code`,
                                                     `count_time`,
                                                    `commission_time`,
                                                     `type`,
                                                     `submit_role`,
                                                     `city`,
                                                     `ext3`
                                                 ) VALUES (receiveId1,orderCode1,xhTime1,"T_TXMSXX_0002",NOW(),DATE_SUB(CURDATE(),INTERVAL 1 MONTH),'1',submitRole1,NULL,NULL);
                                              END IF;
                                     END IF;
                                 END LOOP;
                             CLOSE _innerForEach;-- 關閉內層游標
                            SET edone = FALSE;-- 內循環復位 以便再次循環
                         END;
            END LOOP; -- 結束循環
    CLOSE _outerForEach;-- 關閉游標
     COMMIT;
END;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM