• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

mysql存储过程递归调用发作树数据

mysql 搞代码 4年前 (2022-01-09) 33次浏览 已收录 0个评论

mysql存储过程递归调用产生树数据 使用finereport的树下拉框时,要求提供有层次结构的数据。例如:一级001,二级001001,三级001001001 等。而我们一般的递归表是这样的,定义一个id和一个pid,id和pid在长度上没有父子关系。这样的数据,finereport是不认的。

mysql存储过程递归调用产生树数据

使用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=InnoDBDEFAULT 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 I
本文来源gaodai.ma#com搞##代!^码@网*
F; 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 ;

?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql存储过程递归调用发作树数据
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址