1. 程式人生 > >mysql儲存過程實現遞迴查詢

mysql儲存過程實現遞迴查詢

-- 建表

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');

顯示出的結果: