ORACLE
Oracle 초/중/종성 분리
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
댓글 쓰기
0 댓글