String으로부터 table얻기위한 방법
SELECT RT_SEQ, RT_VALUE FROM TABLE(FT_SPLIT_ARRAY(av_str_mail ,'|'));
CREATE OR REPLACE FUNCTION FT_SPLIT_ARRAY ( av_str IN VARCHAR2 , av_split IN VARCHAR2 ) RETURN PIPE_FT_SPLIT_ARRAY_TAB PIPELINED IS /********************************************************************************* PROCEDURE NAME : FT_SPLIT_ARRAY DESCRIPTION : av_str 로 넘어온 문자열을 av_split으로 자른다음 문자열을 붙여서 반환한다. an_num에 값이 있을때는 그 값에 해당하는 자른 문자열을 반환한다. ex> SELECT FN_SPLIT( '123-456-789', '-', NULL ) FROM dual; RETURN 123456789; SELECT FN_SPLIT( '123-456-789', '-', 2 ) FROM dual; RETURN 456; RETURN TYPE : TABLE RETURN VALUE : COMMENT : ● 빈값일 때는 ' ' 스페이스를 인수로 받아야 함 **********************************************************************************/ --변수선언부 n_len NUMBER := 0; v_RtValue VARCHAR2(100 BYTE); BEGIN IF av_str IS NOT NULL THEN BEGIN -- 문자열에 해당 구분자가 몇개 있는지 구한다. SELECT LENGTH( av_str ) - LENGTH( REPLACE( av_str, av_split, '' ) ) INTO n_len FROM DUAL; EXCEPTION WHEN NO_DATA_FOUND THEN n_len := 0; WHEN OTHERS THEN n_len := 0; END; END IF; IF n_len IS NULL THEN BEGIN n_len := 0; END; END IF; FOR i IN 0..n_len LOOP --해당문자열 갯수만큼 FOR문을 돌면서 값을 구한다. SELECT NVL( REGEXP_SUBSTR( av_str, '[^'|| av_split ||']+', 1, ( i + 1 ) ), '' ) INTO v_RtValue FROM DUAL ; PIPE ROW(PIPE_FT_SPLIT_ARRAY_TYPE(I+1,v_RtValue)); END LOOP; END;
CREATE OR REPLACE TYPE PIPE_FT_SPLIT_ARRAY_TYPE AS OBJECT ( RT_SEQ NUMBER, RT_VALUE VARCHAR2(100) )
CREATE OR REPLACE TYPE PIPE_FT_SPLIT_ARRAY_TAB AS TABLE OF PIPE_FT_SPLIT_ARRAY_TYPE