`
lbyzx123
  • 浏览: 477944 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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=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 ;

 

分享到:
评论

相关推荐

    mysql递归调用获取树节点(子树)

    在提供的`mysql递归调用获取树节点(子树).doc`文档中,应该详细解释了这个过程,包括如何创建和执行存储过程,以及如何使用提供的测试数据。确保查看文档以获取完整的步骤和示例,以便在实际项目中成功应用这些...

    mysql 树形结构查询

    iterative 存储过程是递归存储过程,负责递归调用自身以实现树形结构的查询。 在 findLChild 存储过程中,我们首先创建了一个临时表 tmp_table,以便于存储树形结构的数据。然后,我们设置了递归深度为 99,以便于...

    mysql递归调用获取树节点(子树)[参考].pdf

    总的来说,这个例子展示了如何在MySQL中使用存储过程实现递归调用来获取树形结构中的子树。这种方法适用于对数据库性能要求不高的情况,对于大数据量的树结构,可以考虑优化查询策略或使用其他数据结构来提高性能。

    mysql递归调用获取树节点(子树).pdf

    本PDF文档介绍了一种方法,通过递归调用存储过程来获取树节点及其子树。以下是对相关知识点的详细说明: 首先,我们需要一个用于存储树形数据的表。在这个例子中,表名为`treenodes`,包含三个字段:`id`(主键,...

    mysql递归调用获取树节点(子树)借鉴.pdf

    在给定的文件中,我们看到了如何通过存储过程来实现递归调用来获取树节点(子树)的方法。下面将详细解释这个过程。 首先,创建了一个名为`treenodes`的表,用于存储树形结构的数据。表结构包含两个字段:`id`...

    MySQL存储过程完整版使用代码示例

    创建临时表,动态执行sql语句,过程的递归调用,指针循环取数,批量创建表删除表,树状结构的数据处理等】该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,...

    MySQL实现递归查询的三种方式.rar

    MySQL数据库在处理涉及层次结构或递归的数据时,提供了多种方法。本压缩包中的内容主要介绍了三种实现递归查询的方法,适用于不同的需求和环境。以下是这三种方式的详细说明: ### 方式一:使用自定义函数实现 在...

    Mysql存储过程和函数

    - **递归调用**:存储过程和函数中可以递归地调用其他的过程或函数。 #### 六、存储过程与函数的维护 1. **删除存储过程/函数**: ```sql DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name ``` 2. **查看...

    递归查询菜单树,支持mysql,oracle

    这个查询首先定义了一个递归公共表表达式(CTE),从顶层菜单开始,然后在每次递归调用中,将子菜单添加到结果集中。 Oracle数据库也支持递归查询,但使用的是`CONNECT BY`语句。对于同样的`menus`表,Oracle的查询...

    mysql递归查询.txt

    4. **递归调用**:对于每个子节点,递归调用 `createChildLstOne` 存储过程,并将深度加 1。 5. **递归终止条件**:当游标没有更多数据时,即 `done` 变量值变为 1 时,递归结束。 6. **结果存储**:所有递归过程中...

    MySQL存储过程:数据库编程的高级艺术

    综上所述,MySQL存储过程作为一种强大的工具,在提高数据处理效率和增强数据库安全性方面发挥着重要作用。通过合理设计和运用存储过程,不仅可以简化复杂的业务逻辑,还能有效提升应用程序的整体性能。

    MySQL 存储过程(PDF资料)

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一系列SQL语句,并将它们封装成一个可重用的程序单元。这个PDF资料很可能是关于如何创建、使用和优化MySQL存储过程的教程,这对于数据库管理员和...

    PHP MYSQL 用递归写的留言本核心程序

    MySQL则是流行的开源关系型数据库管理系统,用于存储和管理数据。在这个留言本程序中,MySQL将存储每个留言的信息,如用户名、留言内容、时间戳等。PHP通过SQL查询与MySQL进行通信,执行插入、查询等操作。 关键...

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数来实现树型数据的遍历。 递归查询在处理层次结构数据时非常有用,例如在组织结构、文件目录或层级菜单等场景。Oracle通过`START WITH ... ...

    树父节点递归获取树子节点

    在计算机科学中,数据结构是组织和存储数据的方式,而树是一种非常常见且重要的数据结构。树形结构模拟了现实世界中的层次关系,每个节点可以有零个或多个子节点,除了根节点之外,每个节点都有一个父节点。在处理这...

    递归显示数据库目录树+BBS

    数据库目录树是对数据库中的文件和对象层次结构的可视化表示,每个节点代表一个数据库对象,如表、视图、存储过程等。在数据库管理系统中,这种结构使得用户能够更直观地浏览和管理数据。 递归显示数据库目录树通常...

    mysql无限级别树形菜单操作(附加JSP新闻发布系统)

    这个案例中的"mysql无限级别树形菜单操作"展示了如何利用存储过程来实现这一功能,特别是在一个新闻发布系统中,这样的数据结构非常常见,用于构建层次分明的新闻分类。 首先,我们要理解无限级别树形菜单的数据...

Global site tag (gtag.js) - Google Analytics