CREATE OR REPLACE FUNCTION "FN_CHOSEARCH"( str in varchar2) return varchar2

is
   returnStr varchar2(100);
   cnt number := 0;
   tmpStr varchar2(10);
begin
      if str is null then
      return '';
      end if;

      cnt := length(str);


      for i in 1 .. cnt
      loop
        tmpStr := substr(str,i,1);

      returnStr := returnStr ||
      case when tmpStr < 'ㄱ'  then '1111'
      -- substr(tmpStr, 1, 1)
            when ascii('ㄱ') <= ascii(tmpStr) and ascii(tmpStr) <= ascii('ㅎ') then '2222'
            -- chr(ascii(tmpStr))
            when tmpStr < '나' then 'ㄱ'
            when tmpStr < '다' then 'ㄴ'
            when tmpStr < '라' then 'ㄷ'
            when tmpStr < '마' then 'ㄹ'
            when tmpStr < '바' then 'ㅁ'
            when tmpStr < '사' then 'ㅂ'
            when tmpStr < '아' then 'ㅅ'
            when tmpStr < '자' then 'ㅇ'
            when tmpStr < '차' then 'ㅈ'
            when tmpStr < '카' then 'ㅊ'
            when tmpStr < '타' then 'ㅋ'
            when tmpStr < '파' then 'ㅌ'
            when tmpStr < '하' then 'ㅍ'
            else 'ㅎ'
      end;
      end loop;

      return returnStr;
end;



가나다 => ㄱㄴㄷ






CREATE OR REPLACE FUNCTION FN_APARTCHR
(
    P_CHAR       IN  VARCHAR2
)
RETURN  VARCHAR2
IS
/*********************************************************************************************
    입력값      :   P_CHAR = 한글 한글자
    출력값      :   초성/중성/종성으로 분리한 문자(예,"ㄱㅏㄴ")
**********************************************************************************************/
    ExceptNoHangul      EXCEPTION;
    startHanUniDec      NUMBER;
    calHanUniDec        NUMBER;
    tmpUniDec           NUMBER;
    initUniDec          NUMBER;
    vowelUniDec         NUMBER;
    finUniDec           NUMBER;
    initStr             VARCHAR2(10);
    vowelStr            VARCHAR2(10);
    finStr              VARCHAR2(10);
BEGIN
    -- 한글인지 확인
    IF ASCIISTR(P_CHAR) NOT BETWEEN '\AC00' AND '\D7A3' THEN
        RAISE ExceptNoHangul;
    END IF;
    startHanUniDec := FN_HEX_TO_DEC('\AC00');   -- 한글 시작 유니코드 십진수값
    calHanUniDec   := FN_HEX_TO_DEC(ASCIISTR(P_CHAR)); -- 계산할 문자의 유니코드 십진수값
    tmpUniDec      := calHanUniDec - startHanUniDec;      -- 임시 계산위한 값
    -- 초성 계산
    initUniDec := FLOOR(tmpUniDec/(21*28)) + FN_HEX_TO_DEC('\1100');
    initStr    := UNISTR(FN_DEC_TO_HEX(initUniDec));
    -- 중성 계산
    vowelUniDec := FLOOR(MOD(tmpUniDec, 21*28) / 28) + FN_HEX_TO_DEC('\1161');
    vowelStr    := UNISTR(FN_DEC_TO_HEX(vowelUniDec));
    -- 종성 계산
    finUniDec := MOD(MOD(tmpUniDec, 21*28), 28) + FN_HEX_TO_DEC('\11A8') - 1;
    IF MOD(MOD(tmpUniDec, 21*28), 28) = 0 THEN
        finStr := NULL;
    ELSE
        finStr := UNISTR(FN_DEC_TO_HEX(finUniDec));
    END IF;
    RETURN initStr || vowelStr || finStr;
EXCEPTION
    WHEN ExceptNoHangul THEN
        RETURN '';
    WHEN others THEN
        RETURN '(ERROR)오류 사항 : ' || SQLERRM;
END;


CREATE OR REPLACE FUNCTION FN_DEC_TO_HEX


(
    P_DEC       IN  NUMBER
)
RETURN  VARCHAR2
IS
/*********************************************************************************************
    기능        :   10진수를 16진수로 변환(예, 44032 -> "\AC00")
    입력값      :   P_DEC = 10진수 숫자
    출력값      :   16진수 문자(예, "\AC00")
**********************************************************************************************/
    rHEX    VARCHAR2(8) := ' ';
    aStr    VARCHAR2(1);
    aNum    NUMBER;
    tmpDEC  NUMBER;
BEGIN
    IF P_DEC > POWER(2, 32) OR P_DEC < 0 THEN
        RETURN P_DEC;
    END IF;
    tmpDEC := P_DEC;
    WHILE tmpDEC > 0 LOOP
        aNum := tmpDEC MOD 16;
        IF   aNum = 10  THEN aStr := 'A';
        ELSIF aNum = 11 THEN aStr := 'B';
        ELSIF aNum = 12 THEN aStr := 'C';
        ELSIF aNum = 13 THEN aStr := 'D';
        ELSIF aNum = 14 THEN aStr := 'E';
        ELSIF aNum = 15 THEN aStr := 'F';
        ELSE aStr := TO_CHAR(aNum);
        END IF;
        tmpDEC := TRUNC(tmpDEC/16);
        rHEX := CONCAT(aStr, rHEX);
    END LOOP;
    RETURN '\' || rHEX;
EXCEPTION
    WHEN others THEN
        RETURN '(ERROR)오류 사항 : ' || SQLERRM;
END;



CREATE OR REPLACE FUNCTION FN_HEX_TO_DEC

(
    P_HEX       IN  VARCHAR2
)
RETURN  NUMBER
IS
/*********************************************************************************************
    기능        :   16진수를 10진수로 변환(예, "\AC00" -> 44032)
    입력값      :   P_HEX = 16진수 값 문자(예, "\AC00")
    출력값      :   10진수 숫자
**********************************************************************************************/
    rDEC        NUMBER := 0; -- 10진수 결과값
    aNum        NUMBER;
BEGIN
    IF P_HEX IS NULL OR SUBSTR(P_HEX, 1, 1) <> '\' THEN
        RETURN P_HEX;
    END IF;
    FOR i IN 2..LENGTH(P_HEX) LOOP
        IF    SUBSTR(P_HEX, i, 1) = 'A' THEN aNum := 10;
        ELSIF SUBSTR(P_HEX, i, 1) = 'B' THEN aNum := 11;
        ELSIF SUBSTR(P_HEX, i, 1) = 'C' THEN aNum := 12;
        ELSIF SUBSTR(P_HEX, i, 1) = 'D' THEN aNum := 13;
        ELSIF SUBSTR(P_HEX, i, 1) = 'E' THEN aNum := 14;
        ELSIF SUBSTR(P_HEX, i, 1) = 'F' THEN aNum := 15;
        ELSE aNum := TO_NUMBER(SUBSTR(P_HEX, i, 1));
        END IF;
        rDEC := rDEC + aNum * POWER (16 , LENGTH(P_HEX)-i);
    END LOOP;
    RETURN rDEC;
EXCEPTION
    WHEN others THEN
        RETURN '(ERROR)오류 사항 : ' || SQLERRM;
END;


CREATE OR REPLACE FUNCTION FN_GET_DIV_KO_CHAR (


    i_p1    IN    VARCHAR2
)
    RETURN VARCHAR2
AS
    l_rt    VARCHAR2 (4000);

BEGIN

    FOR i IN 1..LENGTH( i_p1 )
    LOOP
        l_rt := l_rt || FN_APARTCHR( SUBSTR(i_p1, i, 1) );
    END LOOP;

    RETURN l_rt;
END FN_GET_DIV_KO_CHAR;


가나다라 => ㄱㅏㄴㅏㄷㅏㄹㅏ


출처 : http://blog.naver.com/iamjun7 , http://aljjabaegi.tistory.com/220