숫자가 아닌 문자가 들어오면 E가 나오게 하고싶은데 도와주세요 0 4 866

by 마이노 [PL/SQL] PLSQL [2020.08.03 17:39:30]


CREATE OR REPLACE FUNCTION F_PMJ_JUMIN2(V_NUM IN VARCHAR2)
RETURN VARCHAR2 
AS
 A1 VARCHAR2(13);
 A2 VARCHAR2(7);
 A3 VARCHAR2(7);
 A4 VARCHAR2(7);
 A5 VARCHAR2(7);
 A6 VARCHAR2(7);
 B VARCHAR2(7) ;
BEGIN                   
    SELECT 
    NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,1,2),'[0-9]{2}'),'E') A2
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,3,2),'(0[1-9]|1[0-2])'),'E') A3
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,5,2),'[0-9]{2}'),'E') A4
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,7,1),'[1-4]{1}'),'E') A5
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,8,5),'[0-9]{5}'),'E') A6
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,13,1),'[0-9]{1}'),'E') B
   INTO A2,A3,A4,A5,A6,B
FROM DUAL;

    IF A4 < SUBSTR(LAST_DAY(TO_DATE(A2||A3,'YYMM')),7,2) THEN
       RETURN A2||A3||A4||A5||A6||B;
    ELSE RETURN  A2||A3||'E' ;
    END IF;
END ;

--문자들어가는거 수정<= 현재 LASTDAY에 A2,A3가 묶여있어서 문제가 심각해보임 

by 우리집아찌 [2020.08.03 17:58:00]
WITH T AS (
SELECT '112' V FROM DUAL UNION ALL
SELECT '21A' V FROM DUAL UNION ALL
SELECT '312' V FROM DUAL UNION ALL
SELECT '422' V FROM DUAL 
)

SELECT TRANSLATE( V , '0123456789ABCDEFGHI'|| V, '0123456789EEEEEEEEE')
  FROM T

 


by 마농 [2020.08.03 18:05:34]

주민번호를 의미별로 쪼개어
각 단위마다 에러인지 체크하는 듯 하네요?
이게 각 단위마다 E 를 표시해야 하는건지?
전체 주민번호에 대해 유효한지 검증해서 유효하지 않으면 E 한글자만 리턴하면 되는 것 아닌지요?
주민번호 검증을 위한 마지막 체크비트 계산하는 로직도 있어야 할 듯 하네요?


by 마이노 [2020.08.03 18:20:02]

CREATE OR REPLACE FUNCTION F_PMJ_JUMIN2(V_NUM IN VARCHAR2)
RETURN VARCHAR2 
AS
 A1 VARCHAR2(13);
 A2 VARCHAR2(7);
 A3 VARCHAR2(7);
 A4 VARCHAR2(7);
 A5 VARCHAR2(7);
 A6 VARCHAR2(7);
 B VARCHAR2(7) ;
 C VARCHAR2(7) ;
 G VARCHAR2(15);
 H VARCHAR2(15);
 I VARCHAR2(15);
 T_NUM varchar2(12) := '234567892345';
  S_NUM VARCHAR(15);
BEGIN                   
    SELECT 
    NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,1,2),'[0-9]{2}'),'E') A2
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,3,2),'(0[1-9]|1[0-2])'),'E') A3
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,5,2),'[0-9]{2}'),'E') A4
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,7,1),'[1-4]{1}'),'E') A5
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,8,5),'[0-9]{5}'),'E') A6
   ,NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,13,1),'[0-9]{1}'),'E') B
   ,DECODE(NVL(REGEXP_SUBSTR(SUBSTR(V_NUM,7,1),'[1-4]{1}'),'E'),1,'19',2,'19',3,'20',4,'20') C
   INTO A2,A3,A4,A5,A6,B,C
FROM DUAL;

    IF A2 ='E' THEN
        RETURN 'E' ;
    ELSIF A3='E' THEN
        RETURN A2||'E';
    ELSIF A4='E' THEN
        RETURN A2||A3||'E';
    ELSIF A4> SUBSTR(LAST_DAY(TO_DATE(C||A2||A3,'YYYYMM')),7,2) THEN
       RETURN A2||A3||'E';
    ELSIF A5='E' THEN
        RETURN A2||A3||A4||'E' ;
    ELSE 
    G := 0;
    FOR a IN 1..12 LOOP 
    H := to_number(substr(T_NUM,a,1));
    I := to_number(substr(V_NUM,a,1));
    G := G + (H*I);
    END LOOP;

    
    G := mod((11 - (mod(G,11))),10);
    IF G = B
    THEN return A2||A3||A4||A5||A6||B ;
    ELSE return A2||A3||A4||A5||A6||'E';
        END IF;
    END IF;
END ;

 

 

현재 여기까지 했고 중간 7번째 자리도 문자나 1~4를 벗어난 수가 오면 E를 주고 싶은데 오류입니다. 어떤게 오류인지 알려주실수 있으신가요??


by 마농 [2020.08.04 08:47:08]
-- 변경전 --
    ELSIF A4='E' THEN
         RETURN A2||A3||'E';
    ELSIF A4> SUBSTR(LAST_DAY(TO_DATE(C||A2||A3,'YYYYMM')),7,2) THEN
        RETURN A2||A3||'E';
    ELSIF A5='E' THEN

-- 변경후 (v_dt DATE 미리 선언) --
    ELSIF A4='E' THEN
         RETURN A2||A3||'E';
    ELSE
        BEGIN
            v_dt := TO_DATE(c||a2||a3||a4, 'yyyymmdd');
        EXCEPTION
            WHEN OTHERS THEN
                RETURN A2||A3||'E';
        END;
    END IF;
    IF A5='E' THEN

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입