-- 建表

create table _organization(

    orgcode varchar(40) not null primary key comment \'机构编号\',

    parentcode varchar(40) comment \'父机构编号\',

    orgname varchar(100) comment \'机构名称\' ,

    banktypeid varchar(10) comment \'行别代码\' , 

    orgnumber varchar(10) comment \'机构号码\'

) comment = \'机构信息表\' ;

-- 插入数据

insert into _organization values 

(\'C1010413004153\' , \'\' , \'中国银行股份有限公司燕郊分行\'       , \'004\'       , \'0520\' ),

(\'C1010413004006\'       , \'C1010413004153\'       , \'中国银行股份有限公司三河支行\'  , \'004\'  , \'0519\' ),

(\'C1010413004017\'       , \'C1010413004006\'       , \'中国银行股份有限公司三河迎宾北路支行\'  , \'004\'  , \'0532\' ),

(\'C1010413004039\'       , \'C1010413004006\'       , \'中国银行股份有限公司三河世纪花苑支行\'  , \'004\'  , \'0534\' ),

(\'C1010413004120\'       , \'C1010413004153\'       , \'中国银行廊坊市燕郊开发区北蔡路支行\'  , \'004\'  , \'0526\' ),

(\'C1010413004175\'       , \'C1010413004153\'       , \'中国银行股份有限公司廊坊市燕郊开发区迎宾路支行\'  , \'004\'  , \'0524\' ),

(\'C1010413004186\'       , \'C1010413004153\'       , \'中国银行股份有限公司廊坊市燕郊开发区海油大街支行\'  , \'004\'  , \'0527\' ),

(\'C1010413005195\'       , \'C1010413004153\'       , \'中国银行股份有限公司廊坊市燕郊燕顺支行\'  , \'004\'  , \'0528\' ),

(\'C1010413004164\'       , \'C1010413004153\'       , \'中国银行股份有限公司廊坊市燕郊开发区市场街支行\'  , \'004\'  , \'0525\' ),

(\'C1010413005184\'       , \'C1010413004153\'       , \'中国银行股份有限公司廊坊市燕郊燕高支行\'  , \'004\'  , \'0529\' ),

(\'C1010413004051\'       , \'C1010413004040\'       , \'中国银行股份有限公司香河迎宾路支行\'  , \'004\' ,\'\' ),

(\'C1010413004062\'       , \'C1010413004040\'       , \'中国银行股份有限公司香河第一城支行\'  , \'004\' ,\'\' ),

(\'C1010413004084\'       , \'C1010413004073\'       , \'中国银行股份有限公司大厂大安街支行\'  , \'004\' ,\'\' ),

(\'C1010413004028\'       , \'C1010413004006\'       , \'中国银行股份有限公司三河泃阳西大街支行\'  , \'004\'  , \'0533\' ),

(\'C1010413004073\'       , \'C1010413004153\'       , \'中国银行股份有限公司大厂支行\'  , \'004\' ,\'\' ),

(\'C1010413004040\'       , \'C1010413004153\'       , \'中国银行股份有限公司香河支行\'  , \'004\' ,\'\' );


-- 创建存储过程

-- 实现功能:查询出机构编号为orgcode的所有下级机构(递归,利用orgcode、parentcode的关系进行递归查找)


-- 创建名为“allChildOrganization” 的存储过程

create procedure allChildOrganization(

in orgcode varchar(40)   -- 输入参数为 orgcode  类型为:varchar(40)

)

begin


declare p_done tinyint unsigned default(0); -- 下文中while循环结束的标志

declare p_depth smallint unsigned default(0); -- 记录查询的深度(循环的次数)


-- 创建临时表resultTemp,用于临时存放查询出的子孙级的机构信息

create temporary table resultTemp( 

parentcode varchar(40) ,

orgcode varchar(40) ,

depth smallint unsigned

) engine = memory;


insert into resultTemp values( null , orgcode , p_depth ); -- 先将 输入的orgcode 最为结点的最高级,插入到临时表 resultTemp中


-- 创建第二个临时表tempTab,用于存放子级或者孙级(同一级)的机构信息,然后用该临时表,去查询出下一级的机构信息

create temporary table tempTab engine = memory select * from resultTemp; 

while p_done <> 1 do  -- 循环开始

if exists(  -- 判断机构表_organization , 是否有相应的下级机构

select 1 from _organization org , tempTab  where  org.parentcode = tempTab.orgcode 

) then

    -- 根据临时表tempTab 查询出相应的下级机构信息,插入临时表resultTemp中

insert into resultTemp select org.parentcode , org.orgcode , p_depth + 1 from _organization org , tempTab where org.parentcode = tempTab.orgcode and tempTab.depth = p_depth;


set p_depth = p_depth + 1; 


truncate table tempTab; -- 清空临时表tempTab

insert into tempTab select * from resultTemp where depth = p_depth; -- 将刚查询出的子级机构信息,插入临时表tempTab中

else

set p_done = 1;

end if;

end while;

select org.orgcode , org.parentcode , org.orgname , org.banktypeid , org.orgnumber from _organization org , resultTemp re where org.orgcode = re.orgcode;


-- 删除临时表

drop temporary table if exists resultTemp; 

drop temporary table if exists tempTab;


end


-- 调用存储过程

call allChildOrganization( \'C1010413004153\');


显示出的结果:








相关文章: