티스토리 뷰

프로그래밍

[DB] ORACLE 채번 함수 만들기

ReturnToHome 2016. 12. 24. 21:00

** ASCII 코드의 값 범위

45217 ~ 51454         -- 한글

48 ~ 57             -- 숫자

65 ~ 90             -- 대문자

97 ~ 122        -- 소문자

 

 

** 예제는 3자리수

 

 

 

** 규칙

    규칙1. 채번 우선순위는 숫자->알파벳대문자 : 0 ~ Z

        EX) XX0, XX1, XX2 ... XX8, XX9, XXA, XXB, XXC, ...

        

    규칙2. 마지막 자리 부터 채워져 나간다

        EX) 000, 001, 002, ... 00Y, 00Z, 010, 011, 012, ...

 

 

 

** 예제        

    예1)

        MAX CODE : DV3 -> DV4

    예2)

        MAX CODE : DZZ -> E00

      

 

    

** FUNCTION

 

CREATE OR REPLACE FUNCTION FUNC_ASC_NUMBER

 

RETURN VARCHAR IS

 

REAL_1 NUMBER(2);

REAL_2 NUMBER(2);

REAL_3 NUMBER(2);

 

TEMP_1 NUMBER(2);

TEMP_2 NUMBER(2);

TEMP_3 NUMBER(2);

 

LAST_CODE VARCHAR2(3);

 

BEGIN

 

REAL_1 := 0;

REAL_2 := 0;

REAL_3 := 0;

 

TEMP_1 := 0;

TEMP_2 := 0;

TEMP_3 := 0;

 

SELECT MAX(CODE_COLUMN) INTO LAST_CODE FROM CUSTOM_CODE_TABLE;

 

    // 문자를 -> ASCII 코드로 변환.

REAL_1 := ASCII(SUBSTR(LAST_CODE, 1, 1));

REAL_2 := ASCII(SUBSTR(LAST_CODE, 2, 1));

REAL_3 := ASCII(SUBSTR(LAST_CODE, 3, 1));

 

    -- 3번째 자리가 10진수 0 ~ 8 일 시 9로

IF (REAL_3 > 47) AND (REAL_3 < 57) THEN --NUM + 0 ~ 8

REAL_3 := REAL_3+1;

        

    -- 3번째 자리가 10진수 9 또는 특수문자 :, ;, <, =, >, ?, @ 일 시 대문자 A 로.

ELSIF (REAL_3 > 56) AND (REAL_3 < 65) THEN --

REAL_3 := 65;

        

    -- 3번째 자리가 A ~ Y 일 시 Z 로

ELSIF (REAL_3 > 64) AND (REAL_3 < 90) THEN --ALPABAT +

REAL_3 := REAL_3+1;

        

    -- 위의 3가지 조건이 아닐 시

ELSE

        -- 3 번째 자리는 0

        -- TEMP_2 의 변수 값 1로 --> 2 번째 자리수를 컨트롤 하기 위해.

REAL_3 := 48;

TEMP_2 := 1;

        

END IF;

 

      

IF TEMP_2 > 0 THEN

        -- 2번째 자리가 10진수 0 ~ 8 일 시 9로

IF (REAL_2 > 47) AND (REAL_2 < 57) THEN --NUM +

REAL_2 := REAL_2+1;

            

        -- 2번째 자리가 10진수 9 또는 특수문자 :, ;, <, =, >, ?, @ 일 시 대문자 A 로.

ELSIF (REAL_2 > 56) AND (REAL_2 < 65) THEN

REAL_2 := 65;

            

        -- 2번째 자리가 A ~ Y 일 시 Z 로

ELSIF (REAL_2 > 64) AND (REAL_2 < 90) THEN --ALPABAT +

REAL_2 := REAL_2+1;

            

        -- 위의 3가지 조건이 아닐 시

ELSE

            -- 2 번째 자리는 0

            -- TEMP_1 의 변수 값 1로 --> 1 번째 자리수를 컨트롤 하기 위해.

REAL_2 := 48;

TEMP_1 := 1;

            

END IF;

END IF;

 

 

IF TEMP_1 > 0 THEN

        -- 2번째 자리가 10진수 0 ~ 8 일 시 9로

IF (REAL_1 > 47) AND (REAL_1 < 57) THEN --NUM +

REAL_1 := REAL_1+1;

            

        -- 2번째 자리가 10진수 9 또는 특수문자 :, ;, <, =, >, ?, @ 일 시 대문자 A 로.

ELSIF (REAL_1 > 56) AND (REAL_1 < 65) THEN

REAL_1 := 65;

            

        -- 2번째 자리가 A ~ Y 일 시 Z 로

ELSIF (REAL_1 > 64) AND (REAL_1 < 90) THEN --ALPABAT +

REAL_1 := REAL_1+1;

            

END IF;

END IF;

 

    -- 3 개 수를 CHAR 형으로 변환하여 이어 붙임.

LAST_CODE := CHR(REAL_1) || CHR(REAL_2) || CHR(REAL_3);

 

RETURN LAST_CODE;

END;



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함