Oracle/PL/SQL2012. 6. 22. 11:24

한글 자소를 분리하는 함수를 작성해보자.

 

아래와 같이 함수를 작성하자. 알고리즘은 인터넷을 참고하였다. i_p2에 X를 입력하면 Hex 값이 반환된다.

CREATE OR REPLACE FUNCTION f1 (
    i_p1    IN    VARCHAR2,
    i_p2    IN    VARCHAR2 DEFAULT NULL
)
    RETURN VARCHAR2
IS
    l_rt    VARCHAR2 (4000);

    FUNCTION f1_1 (
        i_p1    IN    VARCHAR2
      , i_p2    IN    VARCHAR2 DEFAULT NULL
    )
        RETURN VARCHAR2
    IS
        l_p1    PLS_INTEGER     := ASCII (UNISTR (i_p1));
        l_i0    PLS_INTEGER     := l_p1 - TO_NUMBER ('AC00', 'XXXX');
        l_i1    PLS_INTEGER     := TO_NUMBER ('1100', 'XXXX') + FLOOR (l_i0 / (21 * 28));
        l_i2    PLS_INTEGER     := TO_NUMBER ('1161', 'XXXX') + FLOOR (MOD (l_i0, (21 * 28)) / 28);
        l_i3    PLS_INTEGER     := TO_NUMBER ('11A7', 'XXXX') + FLOOR (MOD (l_i0, 28));
        l_rt    VARCHAR2 (4000);
    BEGIN
        CASE
            WHEN l_p1 BETWEEN TO_NUMBER ('AC00', 'XXXX') AND TO_NUMBER ('D7A3', 'XXXX')
            THEN
                l_rt :=    NCHR (l_i1)
                        || CASE WHEN l_i2 <> 4519 THEN NCHR (l_i2) END
                        || CASE WHEN l_i3 <> 4519 THEN NCHR (l_i3) END;
                l_rt := CASE WHEN i_p2 = 'X' THEN REPLACE (ASCIISTR (l_rt), '\', '0x') ELSE l_rt END;
            ELSE
                l_rt := CASE WHEN i_p2 = 'X' THEN '0x' || TO_CHAR (ASCII (UNISTR (i_p1)), 'FM0XXX') ELSE i_p1 END;
        END CASE;

        RETURN l_rt;
    END f1_1;
BEGIN
    FOR i IN 1 .. LENGTH (i_p1)
    LOOP
        l_rt := l_rt || f1_1 (SUBSTR (i_p1, i, 1), i_p2);
    END LOOP;

    RETURN l_rt;
END f1;

 

아래는 함수를 수행한 결과다. 

SELECT f1 ('오라클 11gR2') AS c1, f1 ('오라클 11gR2', 'X') AS c2 FROM DUAL;

C1                   C2
-------------------- ------------------------------------------------------------------------------
ㅇㅗㄹㅏㅋㅡㄹ 11gR2 0x31470x31570x31390x314F0x314B0x31610x31390x00200x00310x00310x00670x00520x0032

1개의 행이 선택되었습니다.


'Oracle > PL/SQL' 카테고리의 다른 글

DBMS_UTILITY.EXPAND_SQL_TEXT 프로시저  (0) 2014.04.19
REFERENCE CURSOR 예제  (0) 2013.09.01
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 예제  (0) 2012.05.11
LONG 타입을 VARCHAR2 타입으로 변환  (0) 2012.05.10
EXECUTE IMMEDIATE 예제  (0) 2012.04.30
Posted by 정희락_