한글 자소를 분리하는 함수를 작성해보자.
아래와 같이 함수를 작성하자. 알고리즘은 인터넷을 참고하였다. 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 |