===== String to Table =====
String으로부터 table얻기위한 방법
==== Table 얻기 ===
SELECT RT_SEQ, RT_VALUE
FROM TABLE(FT_SPLIT_ARRAY(av_str_mail ,'|'));
==== FT_SPLIT_ARRAY ====
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;
==== PIPE_FT_SPLIT_ARRAY_TYPE ====
create or replace TYPE PIPE_FT_SPLIT_ARRAY_TYPE AS OBJECT
(
RT_SEQ NUMBER,
RT_VALUE VARCHAR2(100)
)
==== PIPE_FT_SPLIT_ARRAY_TAB ====
create or replace TYPE PIPE_FT_SPLIT_ARRAY_TAB AS TABLE OF PIPE_FT_SPLIT_ARRAY_TYPE