递归打平

总体思路:

把一个有递归关系的原表的递归关系整理成递归字符串放到另外一表中

本实例:原表t_property_co 整理后的表t_property_co_ex

 

1.递归存储过程

CREATE DEFINER=`TowerCrane`@`%` PROCEDURE `sp_property_tree_ex_str`(i_dept_id INT,i_tree_ex_str VARCHAR(100))

BEGIN

 /*created by ChenXuDong at 2012-10-31*/

 DECLARE done INT DEFAULT 0;

 

 DECLARE v_dept_id   INT;

 DECLARE v_tree_ex_str VARCHAR(100);

 

 DECLARE cur1 CURSOR FOR SELECT dept_id FROM t_property_co WHERE parent_id = i_dept_id;

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

 

 SET @@max_sp_recursion_depth = 100;

 

 SET v_tree_ex_str = CONCAT(IFNULL(i_tree_ex_str,''),i_dept_id,'-');

 

 INSERT INTO tmp_property_co_ex(dept_id,tree_ex_str)

 VALUES(i_dept_id,v_tree_ex_str);

 

 OPEN cur1;

 

 FETCH cur1 INTO v_dept_id;

 WHILE done=0 DO

    

   CALL sp_property_tree_ex_str(v_dept_id,v_tree_ex_str);

     

   FETCH cur1 INTO v_dept_id;

 

 END WHILE;

 

 CLOSE cur1;

END

 

2.调用递归存储过程整理递归关系到表t_property_co_ex

CREATE DEFINER=`TowerCrane`@`%` PROCEDURE `sp_property_co_ex`(i_dept_id INT, i_parent_id INT)

BEGIN

   /* Created by ChenXuDong at 2012-10-30 */  

   DECLARE v_tree_ex_str VARCHAR(100) DEFAULT NULL;

   

   /* 找部门的节点的扩展字符串 */

          SELECT tree_ex_str INTO v_tree_ex_str FROM t_property_co_ex WHERE dept_id = i_parent_id;

  

    /*临时表不存在就创建 */

   CREATE TEMPORARY TABLE IF NOT EXISTS tmp_property_co_ex

                   (

                            dept_id INT,

                            tree_ex_str varchar(100)

                   );

  

    /* 删除临时表记录*/

    DELETE FROM tmp_property_co_ex;

 

    CALL sp_property_tree_ex_str(i_dept_id,v_tree_ex_str);

 

    UPDATE t_property_co_ex a, tmp_property_co_ex b

    SET a.tree_ex_str   = b.tree_ex_str

    WHERE a.dept_id = b.dept_id

         /*AND a.status ='1'*/ ;

 

END

 

3.建立触发器添加修改删除时掉用上面的存储过程sp_property_co_ex

 

 

CREATE TRIGGER `trg_insert_property_ex` AFTER INSERT ON `t_property_co` FOR EACH ROW BEGIN

     INSERT INTO t_property_co_ex

      (    dept_id,dept_name,pinyin,parent_id,principal,mobile,phone,email,pca_code,address,

             status,description,update_time,update_object,create_time,create_object

       )

      SELECT NEW.dept_id,NEW.dept_name,NEW.pinyin,NEW.parent_id,NEW.principal,NEW.mobile,NEW.phone,NEW.email,NEW.pca_code,NEW.address,

             NEW.status,NEW.description,NEW.update_time,NEW.update_object,NEW.create_time,NEW.create_object;

 

    CALL  sp_property_co_ex(NEW.dept_id,NEW.parent_id);

END;

 

CREATE TRIGGER `trg_modify_t_property_ex` AFTER UPDATE ON `t_property_co` FOR EACH ROW BEGIN 

          UPDATE t_property_co_ex A

          SET

              A.dept_id            = NEW.dept_id, 

              A.parent_id         = NEW.parent_id,

              A.dept_name       = NEW.dept_name,

              A.pinyin          = NEW.pinyin,

              A.principal       = NEW.principal,

              A.mobile          = NEW.mobile,

              A.phone           = NEW.phone,

              A.email           = NEW.email,

              A.pca_code     = NEW.pca_code,

              A.address         = NEW.address,

              A.status          = NEW.status,

              A.description    = NEW.description,

              A.update_time    = NEW.update_time,

              A.update_object  = NEW.update_object,

              A.create_time    = NEW.create_time,

              A.create_object  = NEW.create_object

          WHERE A.dept_id = NEW.dept_id;

 

      IF NOT (IFNULL(NEW.dept_id,'')=IFNULL(OLD.dept_id,'') AND IFNULL(NEW.parent_id,'')=IFNULL(OLD.parent_id,'')) THEN

         CALL sp_property_co_ex(NEW.dept_id,NEW.parent_id);

      END IF;

END;

 

CREATE TRIGGER `trg_delete_property_co_ex` AFTER DELETE ON `t_property_co` FOR EACH ROW BEGIN

    /*此处是物理删除不负责层次关系,直接就删除了*/

    DELETE FROM t_property_co_ex  WHERE dept_id = OLD.dept_id;

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11745285/viewspace-751812/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11745285/viewspace-751812/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值