/*,创建一个获取树节点及其子节点的函数,并以,节点id1、,节点id2 的形式返回,*/DROP PROCEDURE  IF EXISTS  get_tree_node; CREATE , PROCEDURE get_tree_node (node_id 拷贝,INT, OUT result VARCHAR (2000)) BEGIN ,,,,, ,,,DECLARE nodeid INT (50);,, DECLARE 才能done INT  DEFAULT 0;,, ,,,,DECLARE cur CURSOR FOR SELECT id 得到treenodes WHERE pid =, node_id; ,,,DECLARE CONTINUE HANDLER FOR NOT found SET done =,真的; #才能,这一句非常重要,,他可以保证存储过程至少会返回一个根节点id、调用,CONCAT_WS 函数时就不会出错了 SELECT 才能id INTO  result 得到treenodes WHERE id=, node_id; OPEN 才能,坏蛋; ,重复 ,,,,,,,,,,,FETCH cur INTO nodeid;,,,,,,,,,,,,,,,,,,,,, ,,,,,#,避免多一条记录 ,,,,,IF done & lt;祝辞,1,THEN ,,,,,,,,,,,,,,, ,,,,,,,#,调用递归函数获取节点下的子节点 ,,,,,,,CALL get_tree_node (nodeid, @ temp);,,,,,,,,,,,, ,,,,,,,#,合并父节点和子节点的id ,,,,,,,,,,,,,,,SELECT CONCAT_WS(结果”、“,,,,@ temp), INTO 结果; ,,,,,,,,,,,最终获得;如果; ,,,UNTIL done 最终获得重复;,, #,才能关闭光标 ,,,CLOSE 坏蛋; 结束;
/*,删除一个节点及其附属节点,*/DROP PROCEDURE  IF EXISTS  delete_tree_node; CREATE PROCEDURE  delete_tree_node (node_id 拷贝;int) 开始 ,,,SET , max_sp_recursion_depth =, 10; ,,,CALL get_tree_node (@result node_id也); ,,,DELETE 得到treenodes WHERE FIND_IN_SET (id, @result); ,,,DELETE 得到books WHERE FIND_IN_SET (id, @result);
结束这里注意max_sp_recursion_depth这个msyql参数和FIND_IN_SET函数。
max_sp_recursion_depth控制可以执行递归的层数,
FIND_IN_SET函数的作用,会将@result先变为一个字符串列的表,再查找复合条件的值。这里若用在关键字的话,将得不到任何结果