Database/유용한함수

Oracle 오라클 주민번호 유효성 체크 함수

리커니 2013. 5. 21.
반응형

* 주민등록번호 유효성 체크

------------------------------------------------------------

 

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 한다.

반응형

댓글

💲 추천 글