CREATE OR REPLACE FUNCTION FN_GET_SPLIT(
IN_STR IN VARCHAR2,
IN_LEVEL IN INT,
IN_DELIMETER IN VARCHAR2,
IN_DEFAULT_VAL IN VARCHAR2
)
RETURN VARCHAR2
IS
V_RETURN VARCHAR2(200);
STRVALUE VARCHAR2(4000) := IN_STR;
DEFAULT_RETURN_VAL VARCHAR2(4000) := IN_DEFAULT_VAL;
IDX INT;
ILEVEL INT := 0;
BEGIN
V_RETURN := '';
-- 문자열이 없으면 기본 리턴값 반환 후 종료
IF NVL(STRVALUE,'NO_STRING') = 'NO_STRING' THEN
RETURN DEFAULT_RETURN_VAL;
END IF;
LOOP
--구분자 인덱스 확인
IDX := INSTR(STRVALUE, IN_DELIMETER);
IF IDX > 0 THEN --구분자로 문자를 찾은경우
ILEVEL := ILEVEL + 1;
-- 현재 레벨이 원하는 레벨이면 현재 문자열 반환 AND 레벨이 -1인경우는 마지막까지 LOOP
IF ILEVEL = IN_LEVEL AND IN_LEVEL != -1 THEN
V_RETURN := SUBSTR(STRVALUE, 1, IDX-1);
EXIT;
END IF;
STRVALUE := SUBSTR(STRVALUE, IDX + LENGTH(IN_DELIMETER));
ELSE -- 구분자가 없을 경우, 문자열을 그대로 반환
IF ILEVEL = 0 THEN
--구분자가 포함이 안되었지만 레벨이 1인경우 문자 그대로 반환
IF IN_LEVEL = 1 THEN
V_RETURN := STRVALUE;
ELSE
V_RETURN := '';
END IF;
ELSE
-- 마지막 문자열일 경우
ILEVEL := ILEVEL + 1;
-- 마지막을 원하는 경우 마지막 문자열 반환 / -1은 레벨을 모를경우 구분자의 마지막 문자열 반환
IF ILEVEL = IN_LEVEL OR IN_LEVEL = -1 THEN
V_RETURN := STRVALUE;
ELSE
-- 원하는 레벨의 값이 없을 경우, 공백 반환
V_RETURN := '';
END IF;
END IF;
EXIT; --반복 탈출문
END IF;
END LOOP;
--최종결과 리턴
RETURN NVL(V_RETURN, DEFAULT_RETURN_VAL);
EXCEPTION
WHEN OTHERS THEN
RETURN SQLERRM;
END FN_GET_SPLIT;