MySQL存储过程递归实现,MySql ::存储过程递归

how can I rewrite the following SP to face recursive limitation in MySQL:

CREATE DEFINER = `root`@`localhost` PROCEDURE `SP_DeleteParentDirectory`(pParentID INT,pIsFolder INT,pReferenceID INT)

BEGIN

SET @@SESSION.max_sp_recursion_depth = 255;

SET @IsFolder= NULL;

SET @ChildID= NULL;

SET @ReferenceID= NULL;

IF ( pIsFolder= 2) THEN

SELECT FileID INTO @ChildID FROM filesinfo WHERE ParentID= pParentID LIMIT 1;

WHILE (@ChildID IS NOT NULL) DO

SELECT filesinfo.IsFolder,filesinfo.ReferenceID INTO @IsFolder,@ReferenceID FROM filesinfo WHERE filesinfo.FileID = @ChildID;

CALL SP_DeleteParentDirectory(@ChildID,@IsFolder,@ReferenceID);

SELECT filesinfo.FileID INTO @ChildID FROM filesinfo WHERE ParentID= pParentID LIMIT 1;

END While;

END IF;

DELETE FROM filesinfo Where filesinfo.FileID= pParentID;

IF EXISTS( SELECT * FROM filesrefrences WHERE filesrefrences.ReferenceID = pReferenceID AND filesrefrences.RefrenceCount>1) THEN

UPDATE filesrefrences

SET RefrenceCount= RefrenceCount-1 WHERE filesrefrences.ReferenceID = pReferenceID;

ELSE

SET @ReferenceKey= NULL;

Select filesrefrences.RefrenceKey INTO @ReferenceKey FROM filesrefrences WHERE filesrefrences.ReferenceID= pReferenceID;

IF NOT EXISTS(SELECT * FROM deletefilesreferences WHERE deletefilesreferences.FileReference= @ReferenceKey) THEN

INSERT INTO deletefilesreferences (deletefilesreferences.FileReference)VALUES(@ReferenceKey);

END IF;

DELETE FROM filesrefrences where filesrefrences.ReferenceID = pReferenceID;

END IF;

-- CALL SP_DeleteFileInfo(pParentID,pReferenceID);

-- SELECT * FROM deletefilesreferences;

-- CALL SP_GetDeletedReferences();

END;

without using this sts :

"SET @@SESSION.max_sp_recursion_depth = 255;"

I mean that can interact with hierarchy data without recursion.

解决方案

Mysql allows up to 255 recursion in a PROCEDURE if you set max_sp_recursion_depth.

Its risky because there is a chance that the needed recursion depth may exceed 255 sometime in future.

So Its better you replace your function with a procedure, using an INOUT variable for the return_result.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值