2013-01-14 4 views
3

내가 MySQL의에서 재귀 한계에 직면 다음 SP를 다시 작성하는 방법 :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; 

을이 STS를 사용하지 않고 :

"SET @@ SESSION.max_sp_recursion_depth = 255; " 재귀없이 계층 구조 데이터와 상호 작용할 수 있습니다.

답변

1

max_sp_recursion_depth를 설정하면 Mysql에서 PROCEDURE에서 재귀를 최대 255 회까지 허용합니다.

미래에 필요한 재귀 깊이가 언젠가 255를 초과 할 가능성이 있기 때문에 위험합니다.

그래서 함수를 프로 시저로 대체하는 것이 좋습니다. INOUT return_result 변수를 사용하는 것이 좋습니다.

관련 문제