MySQL存儲過程樣例

下面是本人寫的第一個有點複雜的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 ;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章