2013. 2. 20. 10:23

오라클 split 함수

 
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;