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