-- 建表
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\');
显示出的结果: