下面是本人寫的第一個有點複雜的MySQL存儲過程,特此記錄:
-- 刪除存儲過程
DROP PROCEDURE IF EXISTS proc_update_term_group;
-- 創建存儲過程
DELIMITER //
CREATE PROCEDURE proc_update_term_group(IN tg_id VARCHAR(40),IN ag_id VARCHAR(20),IN tg_name VARCHAR(40))
BEGIN
-- 當前時間
DECLARE cur_time DATETIME DEFAULT NOW();
-- 終端編號
DECLARE t_id VARCHAR(20);
-- 賬戶編號
DECLARE a_id VARCHAR(20);
-- 賬戶密碼
DECLARE a_psw VARCHAR(40);
-- 賬戶有效期
DECLARE a_active_date DATETIME;
-- 帶寬編號
DECLARE a_bandwidth_id VARCHAR(10);
-- 計費規則名稱
DECLARE a_bill_rule_name VARCHAR(20);
-- 賬戶餘額
DECLARE a_balance NUMERIC(7, 2);
-- 循環結束標誌位
DECLARE done INT DEFAULT 0;
-- 定義遊標
DECLARE rs_cursor1 CURSOR FOR SELECT t.TERM_ID, a.ID, a.PSW, a.ACTIVE_DATE, a.BANDWIDTH_ID, a.BILL_RULE_NAME, a.BALANCE FROM TERM_ACCOUNT_INFO t, ACCOUNT_INFO a WHERE t.ACCOUNT_ID = a.ID AND t.TERM_GROUP_ID = tg_id;
DECLARE rs_cursor2 CURSOR FOR SELECT ID FROM TERM_BASIC_INFO WHERE TERM_GROUP_ID = tg_id;
DECLARE rs_cursor3 CURSOR FOR SELECT ID, PSW, ACTIVE_DATE, BANDWIDTH_ID, BILL_RULE_NAME, BALANCE FROM ACCOUNT_INFO WHERE ACCOUNT_GROUP_ID = ag_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
START TRANSACTION;
-- 刪除終端賬戶信息
DELETE FROM TERM_ACCOUNT_INFO WHERE TERM_GROUP_ID = tg_id;
-- 刪除終端賬戶下發任務信息
DELETE FROM TERM_DOWN_ACCOUNT WHERE EXISTS(SELECT 1 FROM TERM_BASIC_INFO t WHERE t.ID = TERM_ID AND t.TERM_GROUP_ID = tg_id) AND OPERATE_TYPE = 1;
COMMIT;
START TRANSACTION;
-- 打開遊標
OPEN rs_cursor1;
-- 循環
WHILE done=0 DO
-- 遊標賦值
FETCH rs_cursor1 INTO t_id, a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance;
IF NOT done THEN
-- 插入數據
INSERT INTO TERM_DOWN_ACCOUNT VALUES(UUID(), t_id, a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance, 0);
END IF;
END WHILE;
SET done=0;
CLOSE rs_cursor1;
COMMIT;
START TRANSACTION;
-- 循環結束標誌位2
-- 打開遊標
OPEN rs_cursor2;
-- 循環
WHILE done=0 DO
-- 遊標賦值
FETCH rs_cursor2 INTO t_id;
IF NOT done THEN
-- 打開遊標
OPEN rs_cursor3;
-- 循環
WHILE done=0 DO
-- 遊標賦值
FETCH rs_cursor3 INTO a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance;
IF NOT done THEN
-- 插入數據
INSERT INTO TERM_ACCOUNT_INFO VALUES(UUID(), t_id, tg_id, a_id, ag_id, cur_time);
INSERT INTO TERM_DOWN_ACCOUNT VALUES(UUID(), t_id, a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance, 0);
END IF;
END WHILE;
CLOSE rs_cursor3;
set done=0;
END IF;
END WHILE;
CLOSE rs_cursor2;
COMMIT;
START TRANSACTION;
-- 修改終端分組信息
UPDATE TERM_GROUP SET NAME = tg_name WHERE ID = tg_id;
COMMIT;
END
//
DELIMITER ;