사용자 도구

사이트 도구


oracle:split_to_table

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
oracle:split_to_table [2018/10/04 08:19] taekguoracle:split_to_table [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 ===== String to Table ===== ===== String to Table =====
 String으로부터 table얻기위한 방법 String으로부터 table얻기위한 방법
 +
 +==== Table 얻기 ===
 <code sql> <code sql>
-SELECT *+SELECT RT_SEQ, RT_VALUE
   FROM TABLE(FT_SPLIT_ARRAY(av_str_mail ,'|'));   FROM TABLE(FT_SPLIT_ARRAY(av_str_mail ,'|'));
 +</code>
 +==== FT_SPLIT_ARRAY  ====
 +<code sql>
 +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;
 +
 +</code>
 +
 +==== PIPE_FT_SPLIT_ARRAY_TYPE ====
 +<code sql>
 +create or replace TYPE PIPE_FT_SPLIT_ARRAY_TYPE AS OBJECT
 +(
 +RT_SEQ       NUMBER,
 +RT_VALUE    VARCHAR2(100)
 +)
 </code> </code>
  
 +==== PIPE_FT_SPLIT_ARRAY_TAB ====
 <code sql> <code sql>
 +create or replace TYPE PIPE_FT_SPLIT_ARRAY_TAB AS TABLE OF PIPE_FT_SPLIT_ARRAY_TYPE
 </code> </code>
oracle/split_to_table.1538641170.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)