반응형
* 주민등록번호 유효성 체크
------------------------------------------------------------
CREATE OR REPLACE FUNCTION KURS.NF_ISNUMBER
(
I_STR_NUMBER IN VARCHAR2
) RETURN VARCHAR2
IS /* 데이터가 NUMBER 형인지 검사하는 함수임. 1 이 나오면 NUMBER 형임 */
V_NUM NUMBER;
BEGIN
V_NUM := TO_NUMBER (I_STR_NUMBER);
RETURN 1;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END NF_ISNUMBER;
NUMBER형으로 가능한 문자열이면 1을 반환하고, 아니면 0을 반환한다.
CREATE OR REPLACE FUNCTION KURS.NF_RRN_CHK
(
I_REG_NUM IN VARCHAR2
) RETURN VARCHAR2
IS
V_REG_NUM VARCHAR2(100);
V_RETURN NUMBER;
V_CAL1 NUMBER; -- 주민등록번호 1자리
V_CAL2 NUMBER; -- 주민등록번호 2자리
V_CAL3 NUMBER; -- 주민등록번호 3자리
V_CAL4 NUMBER; -- 주민등록번호 4자리
V_CAL5 NUMBER; -- 주민등록번호 5자리
V_CAL6 NUMBER; -- 주민등록번호 6자리
V_CAL7 NUMBER; -- 주민등록번호 7자리
V_CAL8 NUMBER; -- 주민등록번호 8자리
V_CAL9 NUMBER; -- 주민등록번호 9자리
V_CAL10 NUMBER; -- 주민등록번호 10자리
V_CAL11 NUMBER; -- 주민등록번호 11자리
V_CAL12 NUMBER; -- 주민등록번호 12자리
V_CAL13 NUMBER; -- 주민등록번호 13자리
V_TOTAL NUMBER; -- 비교용 결과값
V_REST NUMBER; -- 나머지
V_CNT NUMBER;
V_BIRTH_CHK VARCHAR2(100);
BEGIN
V_REG_NUM := REPLACE(TRIM(I_REG_NUM), '-', '');
IF (NF_ISNUMBER(V_REG_NUM) = 0) THEN
V_RETURN := 1;
ELSIF (LENGTH(V_REG_NUM) <> 13) THEN
-- 길이가 13자리가 아니면 에러로 처리한다.
V_RETURN := 1;
END IF;
V_BIRTH_CHK := CASE WHEN SUBSTR(V_REG_NUM, 7, 1) IN ('1', '2') THEN '19' || SUBSTR(V_REG_NUM, 1, 6)
ELSE '20' || SUBSTR(V_REG_NUM, 1, 6)
END;
IF (NF_ISDATE(V_BIRTH_CHK) = 0) THEN
V_RETURN := 1;
ELSE
-- 주민등록번호 자리수별로 잘라내어 일정값으로 곱한다.
V_CAL1 := TO_NUMBER(SUBSTR(V_REG_NUM,1,1)) * 2;
V_CAL2 := TO_NUMBER(SUBSTR(V_REG_NUM,2,1)) * 3;
V_CAL3 := TO_NUMBER(SUBSTR(V_REG_NUM,3,1)) * 4;
V_CAL4 := TO_NUMBER(SUBSTR(V_REG_NUM,4,1)) * 5;
V_CAL5 := TO_NUMBER(SUBSTR(V_REG_NUM,5,1)) * 6;
V_CAL6 := TO_NUMBER(SUBSTR(V_REG_NUM,6,1)) * 7;
V_CAL7 := TO_NUMBER(SUBSTR(V_REG_NUM,7,1)) * 8;
V_CAL8 := TO_NUMBER(SUBSTR(V_REG_NUM,8,1)) * 9;
V_CAL9 := TO_NUMBER(SUBSTR(V_REG_NUM,9,1)) * 2;
V_CAL10 := TO_NUMBER(SUBSTR(V_REG_NUM,10,1)) * 3;
V_CAL11 := TO_NUMBER(SUBSTR(V_REG_NUM,11,1)) * 4;
V_CAL12 := TO_NUMBER(SUBSTR(V_REG_NUM,12,1)) * 5;
V_CAL13 := TO_NUMBER(SUBSTR(V_REG_NUM,13,1));
-- 결과값을 더한다.
V_TOTAL := V_CAL1 + V_CAL2 + V_CAL3 + V_CAL4 + V_CAL5 + V_CAL6
+ V_CAL7 + V_CAL8 + V_CAL9 + V_CAL10 + V_CAL11 + V_CAL12;
-- 총합을 11로 나눈 나머지를 구한다.
V_REST := MOD(V_TOTAL,11);
IF V_REST = 0 THEN
IF V_CAL13 = 1 THEN
V_RETURN := 0;
ELSE
V_RETURN := 1;
END IF;
ELSIF V_REST = 1 THEN
IF V_CAL13 = 0 THEN
V_RETURN := 0;
ELSE
V_RETURN := 1;
END IF;
ELSIF (11 - V_REST) = V_CAL13 THEN
V_RETURN := 0;
ELSE
V_RETURN := 1;
END IF;
END IF;
RETURN V_RETURN;
EXCEPTION
WHEN OTHERS THEN RETURN 1;
END NF_RRN_CHK;
------------------------------------------------------------
* 응용 & 사용법*
SELECT NF_RRN_CHK(주민번호) FROM DUAL;
유요한 주민번호 일경우 0을 return
유효하지 않은 주민등록번호일 경우 1을 return 한다.
반응형
'Database > 유용한함수' 카테고리의 다른 글
Oracle 오라클 행의 값을 한 컬럼으로 합치는 함수 (0) | 2013.05.16 |
---|
댓글