SQL

제어문(IF문)

에어팟맥스 2022. 7. 13. 17:16

   ※ 형식
   
   if     조건1  then  실행문장1;
   elsif  조건2  then  실행문장2;
   elsif  조건3  then  실행문장3;
   else               실행문장4;
   end if;

 


   -- 나이 구하는 함수

   -- 앞에서 만들었던 func_age 함수는 완벽하지 않음

   select func_age_2('9007131234567')
   from dual; -- 33
   
   select func_age_2('abcdefghij')
   from dual; 
   -- ORA-06502: PL/SQL: 수치 또는 값 오류: 문자를 숫자로 변환하는데 오류입니다
   
   select func_age_2('9007139234567')
   from dual;  --  -67

 

[ func_age 수정 ]

   create or replace function func_age_2
   (p_jubun IN varchar2)
   return number
   is
       v_age            number(3);
       v_year           number(4);
       v_gender_number  varchar2(1) := substr(p_jubun, 7, 1);  
       
       error_jubun      EXCEPTION;  -- error_jubun 은 사용자가 정의하는 예외절(Exception) 임을 선언한다.
       
   begin
      if      v_gender_number in ('1','2') then v_year := 1900;
      elsif   v_gender_number in ('3','4') then v_year := 2000;
      else    RAISE  error_jubun;  -- error_jubun 은 사용자가 정의하는 예외절(Exception)이다.
      end if;
      v_age := extract(year from sysdate) - ( to_number(substr(p_jubun, 1, 2)) + v_year ) + 1;
      
      return v_age;
      
      EXCEPTION
            WHEN error_jubun THEN 
                 RAISE_APPLICATION_ERROR( -20001, '>> 주민번호의 성별은 1,2,3,4 중에 하나로 입력해야 합니다. <<');
                 --  -20001 ~ -20999
                 --  -20001 은 오류번호로써, 사용자가 정의해주는 EXCEPTION 에 대해서는 오류번호를 -20001 부터 -20999 까지만 사용하도록 오라클에서 비워두었다.
            WHEN others THEN
                 RAISE_APPLICATION_ERROR( -20002, '>> 올바른 주민번호가 아닙니다. <<');
                 
   end func_age_2;
   -- Function FUNC_AGE_2이(가) 컴파일되었습니다.

[ 결과 ]

   select func_age_2('9007131234567')
   from dual; -- 33
   
   select func_age_2('abcdef2ghij')
   from dual; 
   -- ORA-20002: >> 올바른 주민번호가 아닙니다. <<
   
   select func_age_2('9007139234567')
   from dual;  
   -- ORA-20001: >> 주민번호의 성별은 1,2,3,4 중에 하나로 입력해야 합니다. <<