MySQL存储过程递归调用


有分类表tb_system_category,结构如下:
  1. CREATE TABLE `tb_system_category` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `c_parent_id` int(11) 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(50default 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
  • 下一页

相关内容