Blog

Mysql, MariaDB WITH RECURSIVE 구문을 함수에서 사용하는 방법

2024-07-23

create
    definer = root@`%` function FnGetProjectStatusCountByDepartment(p_COMPANY_UID varchar(50), p_DEPT_CODE varchar(50),
                                                                    p_PROJ_STATUS varchar(50),
                                                                    p_PROJECT_YEAR varchar(50)) returns int
BEGIN


	DECLARE v_RETURN_RESULT INT;
    SET v_RETURN_RESULT=0;


	#저장 프로시저 호출하여 결과를 임시 테이블에 삽입
    WITH RECURSIVE HIERARCHY_DATA AS
    (
        SELECT
            DEPT_CODE,
            DEPT_PARENT_CODE,
            DEPT_NAME
        FROM department
        WHERE COMPANY_UID=p_COMPANY_UID AND DEPT_CODE=p_DEPT_CODE

        UNION ALL

        SELECT
            DE.DEPT_CODE,
            DE.DEPT_PARENT_CODE,
            DE.DEPT_NAME
        FROM department DE
        JOIN HIERARCHY_DATA AS HD
            ON DE.DEPT_PARENT_CODE = HD.DEPT_CODE
    )

    
	SELECT
	    IFNULL(SUM(CASE FnGetProjectTaskIndicatorByGantt(MT.TASK_PCT_COMP, MT.TASK_START_DATE, MT.TASK_FINISH_DATE)
            WHEN p_PROJ_STATUS THEN 1 ELSE 0 END), 0) INTO v_RETURN_RESULT
	FROM project MP
	JOIN project_task AS MT
            ON MP.PROJ_UID = MT.PROJ_UID AND MT.TASK_ID = 0 AND MT.TASK_UID=MT.PROJ_UID
    WHERE MP.COMPANY_UID=p_COMPANY_UID AND MP.PROJ_TYPE='PROJECT' AND
          MP.DEPT_CODE IN (SELECT DEPT_CODE FROM HIERARCHY_DATA) AND
        (
            p_PROJECT_YEAR='' OR
            (p_PROJECT_YEAR BETWEEN YEAR( MT.TASK_START_DATE) AND YEAR( MT.TASK_FINISH_DATE))
        );


	#리턴 밸류
	RETURN v_RETURN_RESULT;


End;

인클루드웹 솔루션이 궁금하신가요?

건설관리, 프로젝트관리, 영업관리 솔루션 도입을 무료로 상담해 드립니다.