從沒寫過mysql 存儲過程,靠着百度和之前寫oracle存儲過程的經驗寫了一個,還算順利,留個例子吧mysql
CREATE DEFINER=`west_brain`@`%` PROCEDURE `man_tree_area`( ) BEGIN -- 存儲樹狀結果處理sql變量 DECLARE var_code VARCHAR ( 1000 ); DECLARE var_pcode VARCHAR ( 1000 ); DECLARE var_name VARCHAR ( 1000 ); DECLARE var_count INT; -- 存儲的一些標記變量 DECLARE buf_parents VARCHAR ( 1000 ) DEFAULT ''; DECLARE buf_names VARCHAR ( 1000 ) DEFAULT ''; DECLARE buf_code VARCHAR ( 100 ) DEFAULT ''; DECLARE buf_update INT DEFAULT FALSE; DECLARE buf_is_leaf INT DEFAULT 0; -- 樹級別 根爲1 DECLARE buf_tree_level int DEFAULT 0; -- 是否葉子節點 0 非 1是 DECLARE buf_tree_leaf int DEFAULT 1; -- 存儲表循環遊標的變量 DECLARE vcode VARCHAR ( 64 ); DECLARE vparent VARCHAR ( 1000 ); -- 遊標結束的處理變量 DECLARE done INT DEFAULT FALSE; -- 定義表循環遊標 DECLARE mycursor CURSOR FOR ( SELECT CODE, parent FROM adm_sys_area_info ); -- 定義遊標溢出的處理操做 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打開遊標 OPEN mycursor; -- 定義遊標循環 tableloop : LOOP -- 讀取遊標的一條數據到變量裏 FETCH mycursor INTO vcode, vparent; -- 若是上步遊標操做沒有讀取到記錄,則done 會被設置爲 TRUE,退出 名稱爲myloop的循環 IF done THEN LEAVE tableloop; END IF; -- 記錄當前記錄的區域編碼 SET buf_code = vcode; -- 判斷本身是不是葉子節點 SELECT count(*) into var_count from adm_sys_area_info where parent = vcode; if var_count = 0 then update adm_sys_area_info set tree_leaf = 1 where code = vcode; else update adm_sys_area_info set tree_leaf = 0 where code = vcode; end if; set var_count = 0; -- 循環查找本身的父節點 treeloop : LOOP -- 判斷本身是否存在父節點,用count來判斷 SELECT count( * ) INTO var_count FROM adm_sys_area_info WHERE CODE = vparent; IF var_count = 0 THEN -- 沒有上級節點了,則開始處理之前找到的父節點 IF buf_update THEN-- 更新緩存的數據 -- buf_update 爲TRUE 則說明找到過父節點 -- 下面兩個記錄處理拼接的字符串末尾多的逗號的問題 IF ( length( buf_parents ) > 0 ) THEN SET buf_parents = LEFT ( buf_parents, CHAR_LENGTH( buf_parents ) - 1 ); END IF; IF ( length( buf_names ) > 0 ) THEN SET buf_names = LEFT ( buf_names, CHAR_LENGTH( buf_names ) - 1 ); END IF; -- 更新當前節點的父信息 UPDATE adm_sys_area_info SET parents = buf_parents, tree_names = buf_names ,tree_level = buf_tree_level WHERE CODE = buf_code; ELSE -- 當前記錄是根節點 update adm_sys_area_info set tree_level = 1 where code = buf_code; END IF; -- 清理變量 SET buf_parents = ''; SET buf_names = ''; SET vparent = ''; SET buf_code = ''; SET buf_update = FALSE; SET buf_tree_level = 1; -- 結束當前記錄的處理循環 LEAVE treeloop; ELSE -- 查找到了父節點 SET buf_update = TRUE; -- 查詢當前節點的父節點信息 SELECT CODE, parent, area_name INTO var_code, var_pcode, var_name FROM adm_sys_area_info WHERE CODE = vparent; -- 鏈接字符串 SET buf_parents = CONCAT_WS( ',', var_code, buf_parents ); SET buf_names = CONCAT_WS( ',', var_name, buf_names ); -- 記錄當前查找到記錄的父節點code SET vparent = var_pcode; SET buf_tree_level = buf_tree_level + 1; END IF; END LOOP; END LOOP; CLOSE mycursor; END