使用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递归调用获取树节点(子树).doc`文档中,应该详细解释了这个过程,包括如何创建和执行存储过程,以及如何使用提供的测试数据。确保查看文档以获取完整的步骤和示例,以便在实际项目中成功应用这些...
iterative 存储过程是递归存储过程,负责递归调用自身以实现树形结构的查询。 在 findLChild 存储过程中,我们首先创建了一个临时表 tmp_table,以便于存储树形结构的数据。然后,我们设置了递归深度为 99,以便于...
总的来说,这个例子展示了如何在MySQL中使用存储过程实现递归调用来获取树形结构中的子树。这种方法适用于对数据库性能要求不高的情况,对于大数据量的树结构,可以考虑优化查询策略或使用其他数据结构来提高性能。
本PDF文档介绍了一种方法,通过递归调用存储过程来获取树节点及其子树。以下是对相关知识点的详细说明: 首先,我们需要一个用于存储树形数据的表。在这个例子中,表名为`treenodes`,包含三个字段:`id`(主键,...
在给定的文件中,我们看到了如何通过存储过程来实现递归调用来获取树节点(子树)的方法。下面将详细解释这个过程。 首先,创建了一个名为`treenodes`的表,用于存储树形结构的数据。表结构包含两个字段:`id`...
创建临时表,动态执行sql语句,过程的递归调用,指针循环取数,批量创建表删除表,树状结构的数据处理等】该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,...
MySQL数据库在处理涉及层次结构或递归的数据时,提供了多种方法。本压缩包中的内容主要介绍了三种实现递归查询的方法,适用于不同的需求和环境。以下是这三种方式的详细说明: ### 方式一:使用自定义函数实现 在...
- **递归调用**:存储过程和函数中可以递归地调用其他的过程或函数。 #### 六、存储过程与函数的维护 1. **删除存储过程/函数**: ```sql DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name ``` 2. **查看...
这个查询首先定义了一个递归公共表表达式(CTE),从顶层菜单开始,然后在每次递归调用中,将子菜单添加到结果集中。 Oracle数据库也支持递归查询,但使用的是`CONNECT BY`语句。对于同样的`menus`表,Oracle的查询...
4. **递归调用**:对于每个子节点,递归调用 `createChildLstOne` 存储过程,并将深度加 1。 5. **递归终止条件**:当游标没有更多数据时,即 `done` 变量值变为 1 时,递归结束。 6. **结果存储**:所有递归过程中...
综上所述,MySQL存储过程作为一种强大的工具,在提高数据处理效率和增强数据库安全性方面发挥着重要作用。通过合理设计和运用存储过程,不仅可以简化复杂的业务逻辑,还能有效提升应用程序的整体性能。
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一系列SQL语句,并将它们封装成一个可重用的程序单元。这个PDF资料很可能是关于如何创建、使用和优化MySQL存储过程的教程,这对于数据库管理员和...
MySQL则是流行的开源关系型数据库管理系统,用于存储和管理数据。在这个留言本程序中,MySQL将存储每个留言的信息,如用户名、留言内容、时间戳等。PHP通过SQL查询与MySQL进行通信,执行插入、查询等操作。 关键...
在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数来实现树型数据的遍历。 递归查询在处理层次结构数据时非常有用,例如在组织结构、文件目录或层级菜单等场景。Oracle通过`START WITH ... ...
在计算机科学中,数据结构是组织和存储数据的方式,而树是一种非常常见且重要的数据结构。树形结构模拟了现实世界中的层次关系,每个节点可以有零个或多个子节点,除了根节点之外,每个节点都有一个父节点。在处理这...
数据库目录树是对数据库中的文件和对象层次结构的可视化表示,每个节点代表一个数据库对象,如表、视图、存储过程等。在数据库管理系统中,这种结构使得用户能够更直观地浏览和管理数据。 递归显示数据库目录树通常...
这个案例中的"mysql无限级别树形菜单操作"展示了如何利用存储过程来实现这一功能,特别是在一个新闻发布系统中,这样的数据结构非常常见,用于构建层次分明的新闻分类。 首先,我们要理解无限级别树形菜单的数据...