Drop Database

문자열 중에서 숫자만 골라내서 콤마 붙이기

한알두알 2013. 6. 3. 17:14

CREATE OR REPLACE FUNCTION OP_BPSBSC.FC_BPSSB_FML_TXT (

   I_OUT_FML IN BPSSB_OPR_PLAN.OUT_FML%TYPE

)

RETURN VARCHAR2

IS


    V_RETVAL BPSSB_OPR_PLAN.OUT_FML%TYPE := '';

    

    V_CHR_CNT NUMBER := 0; --전체문자열 길이

    

    V_CHR VARCHAR2(3) := NULL; --문자 하나 잘라서 받을 변수

    

    TYPE T_ARRAY IS TABLE OF BPSSB_OPR_PLAN.OUT_FML%TYPE;  --테이블 변수타입 선언

    

    V_NUM_ARR T_ARRAY := T_ARRAY(); --테이블 변수 선언

    

    V_TXT_ARR T_ARRAY := T_ARRAY(); --테이블 변수 선언

    

    V_OUT_FML VARCHAR2(100) := '';

    

    V_LCNT NUMBER := 0;

    

    V_RVAL VARCHAR2(100) := '';

    

    V_TMP VARCHAR2(100) := '';

    

    V_RETURN VARCHAR2(100) := '';

    

    

BEGIN

    

    IF I_OUT_FML <> '' OR I_OUT_FML IS NOT NULL THEN

    

        V_OUT_FML := REPLACE(I_OUT_FML,',','');

        

        V_CHR_CNT := LENGTH(V_OUT_FML);


        FOR I IN 1..V_CHR_CNT LOOP

        

            V_CHR := SUBSTR(V_OUT_FML,I,1) ;

            V_NUM_ARR.EXTEND(1);

            V_NUM_ARR(V_NUM_ARR.COUNT):= V_CHR;

                

        END LOOP;

        

        

        FOR K IN REVERSE V_NUM_ARR.FIRST .. V_NUM_ARR.LAST LOOP

            

            IF FC_BPSSB_ISNUMBER(V_NUM_ARR(K)) = 1 THEN

                

                V_LCNT := V_LCNT + 1;

                

                IF MOD(V_LCNT,3) = 0 AND K < V_NUM_ARR.COUNT THEN

                

                    IF K > 1 AND FC_BPSSB_ISNUMBER(V_NUM_ARR(K-1)) = 1 THEN

                    

                        V_RVAL := V_RVAL || V_NUM_ARR(K) || ',' ;                

                    

                    ELSE

                    

                        V_RVAL := V_RVAL || V_NUM_ARR(K) ;

                        

                    END IF;

                

                ELSE

                    V_RVAL := V_RVAL || V_NUM_ARR(K) ;                

                

                END IF;

                

            ELSE

            

                V_LCNT := 0;

                

                V_RVAL := V_RVAL || V_NUM_ARR(K) ;

                

            END IF;   

            

        

        END LOOP;

        

        

        

        V_CHR_CNT := LENGTH(V_RVAL);


        FOR I IN 1..V_CHR_CNT LOOP

        

            V_CHR := SUBSTR(V_RVAL,I,1) ;

            V_TXT_ARR.EXTEND(1);

            V_TXT_ARR(V_TXT_ARR.COUNT):= V_CHR;

                

        END LOOP;

        

        

        FOR K IN REVERSE V_TXT_ARR.FIRST .. V_TXT_ARR.LAST LOOP

        

            V_RETURN := V_RETURN || V_TXT_ARR(K) ;  

            

        END LOOP;


    ELSE

    

        V_RETURN := '';

    

    END IF;




RETURN V_RETURN;



EXCEPTION

    WHEN OTHERS THEN

        V_RETURN := I_OUT_FML;


END FC_BPSSB_FML_TXT;