ORACLE SQL

ORACLE) SPLIT 함수 만들기

쩨비 2022. 8. 23. 11:03
728x90
AND EXISTS ( SELECT 1
	             FROM TABLE(FN_CLOB_SPLIT(  
                               TO_CLOB('1102110,1102112,1102115')
                           )) S
    WHERE S.COLUMN_VALUE = STORE_CD )​

FN_CLOB_SPLIT - 문자열(CLOB)을 넘겨 각각의 로우 데이터를 반환하고 그것이 존재하는지 찾는다.

 

create or replace FUNCTION FN_CLOB_SPLIT (
    P_LIST IN CLOB
,   P_GUBUN IN VARCHAR2 DEFAULT ','
) RETURN SPLIT_TBL PIPELINED
AS
    /* EXCEPTIONS */
    NONEEXISTENT_LOB_VALUE EXCEPTION;
    PRAGMA EXCEPTION_INIT(NONEEXISTENT_LOB_VALUE, -22922);
    N_ST_INDEX NUMBER := 1;
    N_END_INDEX NUMBER;
    N_RANK NUMBER := 1;
BEGIN
    IF P_LIST IS NULL THEN 
        RETURN;
    END IF;

    LOOP
    EXIT WHEN N_END_INDEX = 0;
        N_END_INDEX := INSTR( P_LIST, P_GUBUN, 1, N_RANK);
        PIPE ROW(TRIM(SUBSTR(P_LIST, N_ST_INDEX, CASE WHEN N_END_INDEX > 0 THEN N_END_INDEX - N_ST_INDEX ELSE LENGTH(P_LIST) - N_ST_INDEX + 1 END)));
        N_ST_INDEX := N_END_INDEX + LENGTH(P_GUBUN);
        N_RANK := N_RANK + 1;
    END LOOP;

    RETURN;

    EXCEPTION WHEN NONEEXISTENT_LOB_VALUE THEN RETURN;

END;

문자열에서 ,를 기준으로 나눠 여러행의 데이터로 만들어 리턴한다.