MySQL存储过程样例


下面是本人写的第一个有点复杂的MySQL存储过程,特此记录:

  1. -- 删除存储过程  
  2. DROP PROCEDURE IF EXISTS proc_update_term_group; 
  3. -- 创建存储过程  
  4. DELIMITER // 
  5. CREATE PROCEDURE proc_update_term_group(IN tg_id VARCHAR(40),IN ag_id VARCHAR(20),IN tg_name VARCHAR(40)) 
  6. BEGIN 
  7.     -- 当前时间  
  8.     DECLARE cur_time DATETIME DEFAULT NOW(); 
  9.     -- 终端编号  
  10.     DECLARE t_id VARCHAR(20); 
  11.     -- 账户编号  
  12.     DECLARE a_id VARCHAR(20); 
  13.     -- 账户密码  
  14.     DECLARE a_psw VARCHAR(40); 
  15.     -- 账户有效期  
  16.     DECLARE a_active_date DATETIME; 
  17.     -- 带宽编号  
  18.     DECLARE a_bandwidth_id VARCHAR(10); 
  19.     -- 计费规则名称  
  20.     DECLARE a_bill_rule_name VARCHAR(20); 
  21.     -- 账户余额  
  22.     DECLARE a_balance NUMERIC(7, 2); 
  23.     -- 循环结束标志位  
  24.     DECLARE done INT DEFAULT 0; 
  25.     -- 定义游标  
  26.     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; 
  27.     DECLARE rs_cursor2 CURSOR FOR SELECT ID FROM TERM_BASIC_INFO WHERE TERM_GROUP_ID = tg_id; 
  28.     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; 
  29.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
  30.  
  31.     START TRANSACTION
  32.     -- 删除终端账户信息  
  33.     DELETE FROM TERM_ACCOUNT_INFO WHERE TERM_GROUP_ID = tg_id; 
  34.     -- 删除终端账户下发任务信息  
  35.     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; 
  36.     COMMIT
  37.  
  38.     START TRANSACTION
  39.     -- 打开游标  
  40.     OPEN rs_cursor1;   
  41.     -- 循环  
  42.     WHILE done=0 DO 
  43.         -- 游标赋值  
  44.         FETCH rs_cursor1 INTO t_id, a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance; 
  45.         IF NOT done THEN 
  46.         -- 插入数据  
  47.         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); 
  48.         END IF; 
  49.     END WHILE; 
  50.     SET done=0; 
  51.     CLOSE rs_cursor1; 
  52.     COMMIT
  53.  
  54.     START TRANSACTION
  55.     -- 循环结束标志位2  
  56.      
  57.     -- 打开游标  
  58.     OPEN rs_cursor2;   
  59.     -- 循环  
  60.     WHILE done=0 DO 
  61.         -- 游标赋值  
  62.         FETCH rs_cursor2 INTO t_id; 
  63.         IF NOT done THEN 
  64.             -- 打开游标  
  65.             OPEN rs_cursor3;   
  66.             -- 循环  
  67.             WHILE done=0 DO 
  68.             -- 游标赋值  
  69.             FETCH rs_cursor3 INTO a_id, a_psw, a_active_date, a_bandwidth_id, a_bill_rule_name, a_balance; 
  70.             IF NOT done THEN 
  71.                 -- 插入数据  
  72.                 INSERT INTO TERM_ACCOUNT_INFO VALUES(UUID(), t_id, tg_id, a_id, ag_id, cur_time); 
  73.                 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); 
  74.             END IF; 
  75.             END WHILE; 
  76.             CLOSE rs_cursor3; 
  77.             set done=0; 
  78.         END IF; 
  79.     END WHILE; 
  80.     CLOSE rs_cursor2; 
  81.     COMMIT
  82.      
  83.     START TRANSACTION
  84.     -- 修改终端分组信息  
  85.     UPDATE TERM_GROUP SET NAME = tg_name WHERE ID = tg_id; 
  86.     COMMIT
  87. END 
  88. // 
  89. DELIMITER ; 

相关内容