[DB] ORACLE 채번 함수 만들기
** 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;