1 CREATE DEFINER = 'unisoft'@'%'
2 PROCEDURE unisoftdb.distributePoolId(IN poolNum int)
3 BEGIN
4
5 -- 遍歷公司的游標結束條件
6 DECLARE done BOOLEAN DEFAULT FALSE;
7 -- 接收游標中公司ID
8 DECLARE id_val bigint;
9 -- 接收游標中公司的POOL_ID
10 DECLARE poolId_val int;
11 -- 用于循環poolNum的循環變量
12 DECLARE i int;
13 -- 存儲每個POOL_ID對應的總記錄數 (統計本POOL_ID關聯的所有公司聯系人數量)
14 DECLARE totalSum int;
15 -- 存儲侯選的POOL_ID
16 DECLARE canPoolId bigint;
17 -- 存儲侯選的POOL_ID對應的記錄數
18 DECLARE minSum int;
19
20 -- 聲明遍歷公司的游標
21 DECLARE cursor_company_test CURSOR FOR SELECT id, pool_id FROM company_test ORDER BY ID DESC;
22 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
23
24 OPEN cursor_company_test;
25
26 read_loop: LOOP
27
28 FETCH cursor_company_test INTO id_val, poolId_val;
29
30 IF done THEN
31 CLOSE cursor_company_test;
32 LEAVE read_loop;
33 END IF;
34
35 -- 只處理POOL_ID為零的情況
36 IF poolId_val = 0 THEN
37
38 -- 重置內循環變量
39 SET i = 1;
40 SET totalSum = 0;
41 SET minSum = 0;
42 SET canPoolId = 0;
43
44 pro_loop: LOOP
45
46 -- 統計POOL_ID對應的記錄數
47 SELECT IFNULL(SUM(cp.contact_num), 0) INTO totalSum FROM company_test c INNER JOIN company_property cp ON c.id = cp.id AND c.pool_id = i;
48
49 IF i > poolNum THEN
50 LEAVE pro_loop;
51 END IF;
52
53 IF i = 1 THEN
54 SET minSum = totalSum;
55 SET canPoolId = i;
56 END IF;
57
58 IF totalSum < minSum THEN
59 SET minSum = totalSum;
60 SET canPoolId = i;
61 END IF;
62
63 SET i = i + 1;
64 END LOOP pro_loop;
65
66 -- print pool id
67 UPDATE company_test SET POOL_ID = canPoolId WHERE ID = id_val;
68 -- SELECT id_val, canPoolId;
69
70 END IF;
71
72 END LOOP read_loop;
73
74 END