设为首页 收藏本站
查看: 622|回复: 0

[经验分享] mysql存储过程递归调用产生树数据

[复制链接]
发表于 2016-10-22 01:29:48 | 显示全部楼层 |阅读模式
使用finereport的树下拉框时,要求提供有层次结构的数据。例如:一级001,二级001001,三级001001001 等。而我们一般的递归表是这样的,定义一个id和一个pid,id和pid在长度上没有父子关系。这样的数据,finereport是不认的。故只能通过存储过程进行转换。
代码如下:

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `t_tlm_tree`
-- ----------------------------
DROP TABLE IF EXISTS `t_tlm_tree`;
CREATE TABLE `t_tlm_tree` (
`id`  varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' ,
`pid`  varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
`nodename`  varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
`fast`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_unicode_ci
;
-- ----------------------------
-- Records of t_tlm_tree
-- ----------------------------
BEGIN;
INSERT INTO `t_tlm_tree` VALUES ('10000', '-1', '中国', '1'), ('10001', '10000', '浙江', '1'), ('10002', '10000', '河南', '1'), ('10003', '10001', '杭州', '1'), ('10004', '10001', '温州', '1'), ('10005', '10002', '郑州', '1'), ('10006', '10002', '信阳', '1'), ('10007', '10006', '息县', '1'), ('10008', '10003', '滨江', '1'), ('10009', '10003', '西湖', '1'), ('10010', '10003', '上城', '1'), ('10011', '10006', '罗山', '1');
COMMIT;
-- ----------------------------
-- Procedure structure for `p_create_tree_node`
-- ----------------------------
DROP PROCEDURE IF EXISTS `p_create_tree_node`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_create_tree_node`(IN `in_pid` varchar(100))
BEGIN
DECLARE v_has_child INT default 0;
DECLARE v_rows INT default 0;
DECLARE v_id VARCHAR(100) default '';
DECLARE v_pid VARCHAR(100) default '';
DECLARE v_nodename VARCHAR(100) default '';
DECLARE v_tree_id VARCHAR(100) default '';
DECLARE v_tree_pid VARCHAR(100) default '';
DECLARE v_done INT default 0;
DECLARE v_cur CURSOR FOR SELECT id,pid,nodename from t_tlm_tree where `fast`=1 and pid=in_pid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done=1;
SET @@max_sp_recursion_depth = 100;
OPEN v_cur;
loop_tag:LOOP  
FETCH v_cur INTO v_id,v_pid,v_nodename;
IF v_done=1 THEN
LEAVE loop_tag;
END IF;
IF STRCMP(in_pid,'-1')=0 THEN
insert into t_tlm_device_tree(id,pid,nodename,oid) values('001',null,v_nodename,v_id);
ELSE
select id into v_tree_pid from t_tlm_device_tree where oid = in_pid;
set v_rows = v_rows+1;
set v_tree_id = concat('000',v_rows);
set @len = LENGTH(v_tree_id)-2;
set v_tree_id = SUBSTR(v_tree_id FROM @len);
set v_tree_id = concat(v_tree_pid,v_tree_id);
insert into t_tlm_device_tree(id,pid,nodename,oid) values(v_tree_id,v_tree_pid,v_nodename,v_id);
END IF;
set v_has_child = f_has_child_by_pid(v_id);
IF v_has_child =1 THEN
call p_create_tree_node(v_id);
END IF;
END LOOP loop_tag;
CLOSE v_cur;
END
;;
DELIMITER ;
-- ----------------------------
-- Procedure structure for `p_get_device_tree`
-- ----------------------------
DROP PROCEDURE IF EXISTS `p_get_device_tree`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_get_device_tree`()
BEGIN
DECLARE v_pid VARCHAR(100) default '-1';
DROP TEMPORARY TABLE IF EXISTS t_tlm_device_tree;
CREATE TEMPORARY TABLE t_tlm_device_tree (
id varchar(100),
pid varchar(100),
nodename varchar(100),
oid int(100),
PRIMARY KEY (id)
);
call p_create_tree_node(v_pid);
select * from t_tlm_device_tree;
TRUNCATE TABLE t_tlm_device_tree;
DROP TEMPORARY TABLE IF EXISTS t_tlm_device_tree;
END
;;
DELIMITER ;
-- ----------------------------
-- Function structure for `f_has_child_by_pid`
-- ----------------------------
DROP FUNCTION IF EXISTS `f_has_child_by_pid`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `f_has_child_by_pid`(`f_pid` varchar(100)) RETURNS int(11)
BEGIN
DECLARE v_ret int default 0;
select count(1) into @num from t_tlm_tree where  pid=f_pid and `fast`=1;
IF @num >0 THEN
set v_ret = 1;
END IF;
return v_ret;
END
;;
DELIMITER ;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289411-1-1.html 上篇帖子: mysql 删除大量数据后 释放空间 下篇帖子: MySQl 子查询,左右连接,多表连接学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表