递归打平的方法

总体思想:

把一有递归关系的表递归关系变成一个字符串

一下实例是把表T_GOV_DEPT的递归关系整理打平后更新到表T_GOV_DEPT_EX

以后递归查询就可以使用 where tree_ex_str like 字符串%where tree_ex_str like fn_get_gov_tree_ex_str(i_get_gov_dept_id)||’%’

 

1.建表 T_GOV_DEPT

-- Create table

create table T_GOV_DEPT

(

  gov_dept_id      INTEGER not null,

  dept_name        NVARCHAR2(30),

  dept_code        VARCHAR2(20),

  gov_dept_parent  INTEGER,

  contact          NVARCHAR2(50),

  phone            VARCHAR2(20),

  mobile           VARCHAR2(20),

  fax              VARCHAR2(20),

  email            VARCHAR2(30),

  address_id       INTEGER,

  default_map_area NVARCHAR2(200),

  status           VARCHAR2(1),

  description      NVARCHAR2(100),

  create_time      DATE,

  create_user      VARCHAR2(10),

  update_time      DATE,

  update_user      VARCHAR2(10),

  address_detail   NVARCHAR2(100),

  longitude        NUMBER,

  latitude         NUMBER

)

 

 

1.建表 T_GOV_DEPT_EX

-- Create table

create table T_GOV_DEPT_EX

(

  gov_dept_id      INTEGER not null,

  dept_name        NVARCHAR2(30),

  dept_code        VARCHAR2(20),

  gov_dept_parent  INTEGER,

  tree_ex_str      VARCHAR2(100),

  contact          NVARCHAR2(50),

  phone            VARCHAR2(20),

  mobile           VARCHAR2(20),

  fax              VARCHAR2(20),

  email            VARCHAR2(30),

  address_id       INTEGER,

  default_map_area NVARCHAR2(200),

  status           VARCHAR2(1),

  description      NVARCHAR2(100),

  create_time      DATE,

  create_user      VARCHAR2(10),

  update_time      DATE,

  update_user      VARCHAR2(10),

  address_detail   NVARCHAR2(100),

  longitude        NUMBER,

  latitude         NUMBER

)

 

 

2.建立一个函数根据id获得其递归字符串

CREATE OR REPLACE FUNCTION fn_get_gov_tree_ex_str(i_get_gov_dept_id INT)

  RETURN VARCHAR2 IS

  --create by Given 2012/11/26

   --功能:根据政府部门id 获得其递归字符串

  v_tree_ex_str VARCHAR2(100);

  v_row_cnt     INT;

BEGIN

 

  SELECT COUNT(1)

    INTO v_row_cnt

    FROM t_gov_dept_ex

   WHERE gov_dept_id = i_get_gov_dept_id;

 

  IF v_row_cnt > 0 THEN

    SELECT tree_ex_str

      INTO v_tree_ex_str

      FROM t_gov_dept_ex

     WHERE gov_dept_id = i_get_gov_dept_id;

  ELSE

    v_tree_ex_str := '@@@@@@@@@@@@@@@@@@@@';

  END IF;

 

  RETURN v_tree_ex_str;

END;

 

3.建立一个存储过程整理递归字符串

CREATE OR REPLACE PROCEDURE sp_gov_dept_compute_tree(i_dept_id   INT,

                                                     i_parent_id INT DEFAULT NULL) IS

  v_tree_ex_str VARCHAR2(100);

BEGIN

  /* Created by ChenXuDong at 2012-11-24 */

 

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

  v_tree_ex_str := fn_get_gov_tree_ex_str(i_parent_id);

 

  IF v_tree_ex_str = '@@@@@@@@@@@@@@@@@@@@' THEN

    v_tree_ex_str := NULL;

  END IF;

 

  --更新t_gov_dept_ex表的tree字符串

  UPDATE t_gov_dept_ex a

  SET tree_ex_str = ( SELECT b.tree_ex_str

                         FROM (

                                   SELECT gov_dept_id,

                                         nvl(v_tree_ex_str,'') || ltrim(sys_connect_by_path(gov_dept_id, '-'), '-') || '-' AS tree_ex_str

                                   FROM t_gov_dept_ex

                                   START WITH gov_dept_id = i_dept_id

                                   CONNECT BY nocycle PRIOR gov_dept_id = gov_dept_parent

                               ) b

                         WHERE b.gov_dept_id = a.gov_dept_id

                        )

  WHERE EXISTS(SELECT 1

               FROM (

                       SELECT gov_dept_id

                       FROM t_gov_dept_ex

                       START WITH gov_dept_id = i_dept_id

                       CONNECT BY nocycle PRIOR gov_dept_id = gov_dept_parent

                      ) b

                WHERE b.gov_dept_id = a.gov_dept_id

               );

END;

 

 

4.建立触发器

  当添加删除或者递归关系有变化时调用存储过程(sp_gov_dept_compute_tree)进行整理

CREATE OR REPLACE TRIGGER trg_gov_dept_change

  AFTER INSERT OR UPDATE OR DELETE ON t_gov_dept

  FOR EACH ROW

BEGIN

   /* Created by ChenXuDong at 2012-11-24 */

  IF inserting THEN

    --INSERT触发

 

    INSERT INTO t_gov_dept_ex

      (gov_dept_id,

       dept_name,

       dept_code,

       gov_dept_parent,

       contact,

       phone,

       mobile,

       fax,

       email,

       address_id,

       default_map_area,

       status,

       description,

       create_time,

       create_user,

       update_time,

       update_user,

       address_detail,

       longitude,

       latitude)

    VALUES

      (:new.gov_dept_id,

       :new.dept_name,

       :new.dept_code,

       :new.gov_dept_parent,

       :new.contact,

       :new.phone,

       :new.mobile,

       :new.fax,

       :new.email,

       :new.address_id,

       :new.default_map_area,

       :new.status,

       :new.description,

       :new.create_time,

       :new.create_user,

       :new.update_time,

       :new.update_user,

       :new.address_detail,

       :new.longitude,

       :new.latitude);

 

    sp_gov_dept_compute_tree(:new.gov_dept_id, :new.gov_dept_parent);

 

  ELSIF updating THEN

    --UPDATE触发

    UPDATE t_gov_dept_ex

       SET gov_dept_id      = :new.gov_dept_id,

           gov_dept_parent  = :new.gov_dept_parent,

           dept_name        = :new.dept_name,

           dept_code        = :new.dept_code,

           contact          = :new.contact,

           phone            = :new.phone,

           mobile           = :new.mobile,

           fax              = :new.fax,

           email            = :new.email,

           address_id       = :new.address_id,

           default_map_area = :new.default_map_area,

           status           = :new.status,

           description      = :new.description,

           create_time      = :new.create_time,

           create_user      = :new.create_user,

           update_time      = :new.update_time,

           update_user      = :new.update_user,

           address_detail   = :new.address_detail,

           longitude        = :new.longitude,

           latitude         = :new.latitude

     WHERE gov_dept_id = :new.gov_dept_id;

 

    IF NOT (NVL(:new.gov_dept_id,-1) = NVL(:old.gov_dept_id,-1) AND NVL(:new.gov_dept_parent,-1) = NVL(:old.gov_dept_parent,-1)) THEN

        sp_gov_dept_compute_tree(:new.gov_dept_id, :new.gov_dept_parent);

    END IF;

   

  ELSIF deleting THEN

    --DELETE触发

    DELETE FROM t_gov_dept_ex WHERE gov_dept_id = :old.gov_dept_id;

 

  END IF;

END;

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值