`
hideto
  • 浏览: 2677919 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL的存储过程不支持递归

阅读更多
-- FUNCTION check_asset_group_mirror_relationship

DROP FUNCTION IF EXISTS check_asset_group_mirror_relationship;
DELIMITER |
CREATE FUNCTION check_asset_group_mirror_relationship(group_id bigint(20)) RETURNS int
BEGIN
    DECLARE group_type varchar(255);
    DECLARE mirror_flag int default 0;
	DECLARE parent_flag int default 0;
	DECLARE parent_group_id bigint(20);
	DECLARE done int default 0;
	DECLARE parent_group_ids CURSOR FOR select agr.parent_asset_group_id from asset_group_relation agr where agr.child_asset_group_id = group_id;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
	select asset_group_type into group_type from asset_group ag
		where ag.id=group_id;
    IF group_type = 'GROUP' THEN
        SET group_type = 'ASSET_GROUP';
    END IF;
    select count(1) into mirror_flag from mirror_relationship mr
        where mr.group_type = group_type and mr.group_id = group_id;
    IF mirror_flag = 0 THEN
        select count(1) into parent_flag from asset_group_relation agr
            where agr.child_asset_group_id = group_id;
        IF parent_flag > 0 THEN
            OPEN parent_group_ids;
            REPEAT
                FETCH parent_group_ids INTO parent_group_id;
                IF NOT done THEN
                    IF mirror_flag = 0 THEN
                        SET mirror_flag = check_asset_group_mirror_relationship(parent_group_id);
                    END IF;
                END IF;
            UNTIL done END REPEAT;
            CLOSE parent_group_ids;
        END IF;
    END IF;
    RETURN mirror_flag;
END|
DELIMITER ;


然后去调用check_asset_group_mirror_relationship(2),MySQL报Error 1424: Recursive stored functions and triggers are not allowed.
分享到:
评论
2 楼 hideto 2008-03-07  
需要返回值的时候就可以给stored functions的参数类型设置为OUT,其他为IN,有点类似于传值和传引用的意思
1 楼 hideto 2008-03-07  
结果发现MySQL的报错很有意思Recursive stored functions and triggers are not allowed.,但Store Procedure应该支持,结果试了一下,果然支持,不过要记得设置max_sp_recursion_depth.

后来又出现数据不对的问题,发现没法调试,老邓给我的意见是创建临时表然后insert变量进去来手工调试,结果还真发现了问题。

另外一个tip是写递归存储过程时可以多加一个变量count一下递归次数,次数过大就不再递归了,免得由于死循环等问题将MySQL挂掉。

相关推荐

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    mysql递归存储过程

    包括两个存储过程,一个是建立临时表用来存储需要的数据,另一个利用临时表进行操作。

    Mysql存储过程和函数

    ### MySQL存储过程与函数详解 #### 一、概述 MySQL是一种广泛使用的开源关系型数据库管理系统,在数据管理和存储方面提供了强大的支持。其中,存储过程和函数是MySQL提供的两种重要的编程特性,它们可以帮助开发者...

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

    资源包中囊括了MySQL数据库中的存储过程的...该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,问大家要10分是不过分的,用过就知道了,欢迎大家下载参考及使用

    MySQL递归查询

    该方法是使用 MySQL 的存储过程来实现递归查询。首先,创建一个函数 `getChildLst`,该函数将返回一个由所有子节点号组成的字符串。该函数使用 WHILE 循环来递归地查找所有子节点,并使用 `FIND_IN_SET` 函数来判断...

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

    通过编写存储过程或函数,我们可以定义一个递归逻辑来遍历层次结构。例如,如果我们有一个员工树结构,每个员工可能有下属,我们可以通过递归函数来获取整个组织结构。 ```sql CREATE FUNCTION get_subordinates...

    两种mysql递归tree查询效率-mysql递归tree

    ### 两种MySQL递归Tree查询效率分析 #### 一、背景与目的 在数据库操作中,经常需要处理具有层级结构的数据。例如,在处理组织结构、文件系统或是地区划分时,通常会采用递归的方式来查询这些层级关系。MySQL作为...

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

    在MySQL中,由于不直接支持递归查询,我们通常使用自连接或者存储过程来解决这个问题。这里,我们重点介绍使用存储过程的方法。存储过程可以接受参数,比如我们要获取的根节点ID,然后递归地查询所有子节点。 下面...

    MySQL多种递归查询方法.docx

    - 创建临时表存储递归结果。 - 使用`UNION ALL`结合`JOIN`操作实现递归。 - 示例略。 - **存储过程法**: - 创建存储过程,使用循环结构和条件判断来实现递归。 - 示例略。 **结论**: 虽然MySQL没有提供类似于...

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

    ### MySQL存储过程:数据库编程的高级艺术 #### 引言:存储过程的魔力 存储过程作为数据库领域中的一种高级特性,在提升数据处理效率及增强安全性方面扮演着至关重要的角色。MySQL作为广受青睐的关系型数据库管理...

    MySQL 存储过程(PDF资料)

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

    mysql递归查询.txt

    MySQL 中进行递归查询有两种常见的方式:一种是使用存储过程,另一种则是利用 SQL 函数来实现递归。 #### 二、通过存储过程实现递归查询 ##### 方法一:存储过程实现递归查询 **存储过程定义:** ```sql CREATE ...

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

    Oracle数据库也支持递归查询,但使用的是`CONNECT BY`语句。对于同样的`menus`表,Oracle的查询可能如下: ```sql SELECT id, parent_id, name, level as depth FROM menus START WITH parent_id IS NULL CONNECT ...

    mysql 树形结构查询

    在 MySQL 中,树形结构查询可以使用递归存储过程来实现。递归存储过程是一种特殊的存储过程,可以递归调用自身,以实现树形结构的查询。递归存储过程可以根据需要设置递归深度,以控制查询的深度。 在上面的例子中...

    SQL2005动态表无限级分类存储过程

    总的来说,这些存储过程的核心是通过动态生成SQL语句来处理无限级分类的增删改查操作,它们利用了SQL Server 2005的特性和功能,如递归查询、事务管理等,确保了在复杂的数据结构中的数据完整性和一致性。...

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

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

    mysql递归查询.doc

    MySQL 递归查询实现多分类查询 MySQL 递归查询是指在 MySQL 数据库中使用递归函数来实现树形结构数据的查询,例如部门表中某个部门的所有下属部分或者某个部分的所有上级部门。 在 MySQL 中实现递归查询需要使用...

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

    然而,在MySQL中,由于不支持CTE,实现递归查询需要转换思路。可以通过将递归转换为迭代的方式,即使用循环和条件控制来替代递归。在递归深度已知且较浅的情况下,可以通过多次自关联的方式来平面化递归过程,但当...

Global site tag (gtag.js) - Google Analytics