Welcome 微信登录

首页 / 数据库 / MySQL / MySQL存储过程递归调用

有分类表tb_system_category,结构如下:
  1. CREATE TABLE `tb_system_category` (  
  2.   `id` int11) NOT NULL AUTO_INCREMENT,  
  3.   `c_parent_id` int11) NOT NULL,  
  4.   `c_name` varchar(50) NOT NULL,  
  5.   `c_full_name` varchar(200) DEFAULT NULL,  
  6.   `c_code` varchar(50) NOT NULL,  
  7.   `c_describe` text,  
  8.   PRIMARY KEY (`id`)  
  9. ) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8;  
        要求使用存储过程“根据父分类代号(c_code)取得所有子分类及孙子分类”。         使用以下存储过程:        1. 主存储过程,作用是创建临时表,并操作其他存储过程或函数实现需求,其中临时表的作用是存储每个子分类的代号。流程:创建临时表——调用存储过程(category_findCodesByParentCode_queryAndInsert)取得所有子分类及孙子分类的代码并存入临时表中——调用函数(category_generateResult)生成结果字符串——删除临时表数据——返回生成的字符串。
  1. CREATE PROCEDURE category_findCodesByParentCode(in cCode varchar(200))  
  2. begin  
  3. -- 调用的函数或存储过程:category_findCodesByParentCode_queryAndInsert、category_generateResult  
  4. -- 被调用于函数或存储过程:无  
  5.     declare cRand varchar(50) default RAND();  
  6.     declare result varchar(4000);  
  7.   
  8.     create temporary table if not exists tb_system_temp_category_categoryTree(  
  9.         c_result varchar(4000),  
  10.         c_rand varchar(50)  
  11.     );  
  12.   
  13.     set max_sp_recursion_depth  = 100;  
  14.   
  15.     call category_findCodesByParentCode_queryAndInsert_zh(cCode, cRand);  
  16.       
  17.     set result = category_generateResult(cRand);  
  18.   
  19.     set @mySql = CONCAT("delete from tb_system_temp_category_categoryTree where c_rand = "",cRand,""");  
  20.     prepare stmt from @mySql;  
  21.     execute stmt;  
  22.   
  23.     set @mySql = CONCAT("select "", result, "" from tb_system_user limit 0,1");  
  24.     prepare stmt from @mySql;  
  25.     execute stmt;  
  26. end  
        2. 递归取得所有子分类及孙子分类并存储到临时表中。流程:根据父分类代号查询下级子分类代号,并通过指针迭代之——在迭代过程中,将子分类的代号存入临时表——调用函数(category_findChildrenCountByCode)检查子分类是否有下级分类,若无不管之;若有则递归调用存储过程(category_findCodesByParentCode_queryAndInsert)取得孙子分类。
  1. CREATE PROCEDURE category_findCodesByParentCode_queryAndInsert(in cCode varchar(200), in cRand varchar(50))  
  2. begin  
  3. -- 调用的函数或存储过程:category_findChildrenCountByCode、category_findCodesByParentCode_queryAndInsert  
  4. -- 被调用于函数或存储过程:category_findCodesByParentCode  
  5.     declare finished int default 0;  
  6.     declare thisCode varchar(200);  
  7.     declare cur cursor for select c_code from tb_system_category where c_parent_id in (select id from tb_system_category where c_code = cCode);  
  8.     declare continue handler for not found set finished = 1;  
  9.     open cur;  
  10.     fetch cur into thisCode;  
  11.     while finished = 0 do  
  12.         set @mySql = CONCAT("insert into tb_system_temp_category_categoryTree(c_result,c_rand) values("",thisCode,"","",cRand,"")");  
  13.         prepare stmt from @mySql;  
  14.         execute stmt;  
  15.   
  16.         if category_findChildrenCountByCode(thisCode) > 0 then  
  17.             call category_findCodesByParentCode_queryAndInsert(thisCode, cRand);  
  18.         end if;  
  19.   
  20.         fetch cur into thisCode;  
  21.     end while;  
  22.     close cur;  
  23.       
  24. end        
  • 1
  • 2
  • 下一页
Linux RAC修改配置LOCK_SGAOracle实验:用BBED恢复误删记录的全过程相关资讯      MySQL存储过程 
  • MySQL将表名称修改成大写的存储过  (08月13日)
  • MySQL存储过程及触发器  (12/15/2015 10:44:33)
  • MySQL存储过程以及在Java中的程序  (08/03/2015 14:02:11)
  • MySQL创建存储过程实例  (03月08日)
  • MySQL 存储过程学习  (08/24/2015 19:55:43)
  • MySQL存储过程权限检查主要点  (06/06/2013 19:42:04)
本文评论 查看全部评论 (0)
表情: 姓名: 字数

版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图