mysql中使用游标

mysql存储过程使用递归

Error Code : 1456  Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine pro_app_rs_right_update···

树的深度不超过10,怎么可能深度出问题,于是百度了一下,网上给了解决方案,加上下面代码就ok:

 

[sql] view plain copy

  1. SET @@max_sp_recursion_depth = 100;  

下面是mysql递归调用的源代码:

 

[sql] view plain copy

  1. DROP PROCEDURE IF EXISTS pro_app_rs_right_update_role;  
  2. DELIMITER//  
  3. CREATE PROCEDURE pro_app_rs_right_update_role(  
  4.     IN uid VARCHAR(225),  
  5.     IN nCount INT)  
  6. BEGIN  
  7.       
  8.     DECLARE id VARCHAR(225);  
  9.     DECLARE nLevel INT;  
  10.     DECLARE STOP INT DEFAULT 0;  
  11.       
  12.     # 声明游标,查找id和权限水平  
  13.     DECLARE cur CURSOR FOR SELECT app_rs_right.id, app_rs_right.LEVEL FROM app_rs_right   
  14.     WHERE app_rs_right.pid = uid;  
  15.   
  16.     # 声明游标的异常处理,设置一个终止标记  
  17.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET STOP = 1;  
  18.       
  19.     SET @@max_sp_recursion_depth = 100;  
  20.     # 打开游标  
  21.     OPEN cur;  
  22.       
  23.     # 读取一行数据到游标中  
  24.     FETCH cur INTO id, nLevel;  
  25.       
  26.     # 判断是否已经到达最后一行数据  
  27.     WHILE STOP <> 1 DO   
  28.           
  29.         CALL pro_app_rs_right_update_role(id, nCount);  
  30.         UPDATE app_rs_right SET app_rs_right.level = app_rs_right.level + nCount   
  31.         WHERE app_rs_right.id = id;  
  32.           
  33.         FETCH cur INTO id, nLevel;  
  34.     END WHILE;  
  35.     CLOSE cur;  
  36. END //  
  37.   
  38. select id, level from app_rs_right where pid = '402881f53fe18bbc013fe19eda7f0003';  
  39. # call pro_app_rs_right_update_role('402881f53fe18bbc013fe19eda7f0003', 10);  

你可能感兴趣的:(数据库)