SQL

사용자 정의 예외절(EXCEPTION)

에어팟맥스 2022. 7. 14. 17:24

     ------------ ***** 사용자 정의 예외절(EXCEPTION) ***** ----------------
     예외절 = 오류절
     
     ※ 형식
     
     exception
          when  익셉션이름1  [or 익셉션이름2]  then
                실행문장1;
                실행문장2;
                실행문장3;
                
          when  익셉션이름3  [or 익셉션이름4]  then
                실행문장4;
                실행문장5;
                실행문장6; 
                
          when  others  then  
                실행문장7;
                실행문장8;
                실행문장9; 

 


      === tbl_member_test1 테이블에 insert 할 수 있는 요일명과 시간을 제한해 두겠습니다. ===
        
          tbl_member_test1 테이블에 insert 할 수 있는 요일명은 월,화,수,목,금 만 가능하며
          또한 월,화,수,목,금 중에 오후 2시 부터 오후 5시 이전까지만(오후 5시 정각은 안돼요) insert 가 가능하도록 하고자 한다.
          만약에 insert 가 불가한 요일명(토,일)이거나 불가한 시간대에 insert 를 시도하면 
          '영업시간(월~금 14:00 ~ 16:59:59 까지) 아니므로 입력불가함!!' 이라는 오류메시지가 뜨도록 한다. 

 


   create or replace procedure pcd_tbl_member_test1_insert
   (p_userid IN tbl_member_test1.userid%type    -- IN 은 생략 가능하다. (OUT 은 불가.) ==> 생략하면 IN 으로 본다.
  , p_passwd    tbl_member_test1.passwd%type
  , p_name      tbl_member_test1.name%type
    )
   is
        v_length        number(2);
        error_insert    EXCEPTION;
        v_ch            varchar2(1);
        v_flag_upper    number(1) := 0;  -- 대문자 표식
        v_flag_lower    number(1) := 0;  -- 소문자 표식
        v_flag_num      number(1) := 0;  --  숫자 표식
        v_flag_special  number(1) := 0;  -- 특수문자 표식
        error_dayTime   exception;
        
   begin
   
        -- 입력(insert)이 불가한 요일명과 시간대를 알아보기 --
        if( to_char(sysdate, 'd') in ('1','7') or   -- to_char(sysdate, 'd') ==> '1'(일), '2'(월), '3'(화), '4'(수), '5'(목), '6'(금), '7'(토) 
            to_char(sysdate, 'hh24') < '14' or to_char(sysdate, 'hh24') > '16'
           ) then raise error_dayTime;
        
        else -- 암호를 검사한다 --
            v_length := length(p_passwd);
            
            if ( v_length  < 8 or v_length > 20 ) then 
                 raise error_insert;  -- 사용자가 정의하는 예외절(EXCEPTION) 을 구동하라.
            else 
                 for i in 1..v_length loop
                    v_ch := substr(p_passwd, i, 1);
                    
                    if( v_ch between 'A' and 'Z' )    then v_flag_upper := 1;
                    elsif( v_ch between 'a' and 'z' ) then v_flag_lower := 1;
                    elsif( v_ch between '0' and '9' ) then v_flag_num := 1;
                    else v_flag_special := 1;
                    end if;
                    
                 end loop;
                 
                 if ( v_flag_upper * v_flag_lower * v_flag_num * v_flag_special = 1 ) 
                    then insert into tbl_member_test1(userid, passwd, name) values(p_userid, p_passwd, p_name);
                         dbms_output.put_line('>> 입력성공 <<');
                 else
                    raise error_insert; -- 사용자가 정의하는 예외절(EXCEPTION) 을 구동하라.
                 end if;
                 
            end if;
        
        end if;
        
        exception
             when error_dayTime then 
                  raise_application_error( -20004, '>> 영업시간(월~금 14:00 ~ 16:59:59 까지) 아니므로 입력불가함!! <<');
             when error_insert then 
                  raise_application_error( -20003, '암호는 최소 8글자 이상이면서 대소문자, 숫자, 특수문자가 혼합되어야 합니다.');     
        
   end pcd_tbl_member_test1_insert;
   
   -- Procedure PCD_TBL_MEMBER_TEST1_INSERT이(가) 컴파일되었습니다.

[실행]

   exec pcd_tbl_member_test1_insert('eomjh', 'aBcd1234$', '엄정화');
   -- PL/SQL 프로시저가 성공적으로 완료되었습니다.
   -- >> 입력성공 << (수 오후 16:38)
   
   exec pcd_tbl_member_test1_insert('kangkc', 'wXyzd1234$', '강감찬');
   -- ORA-20004: >> 영업시간(월~금 14:00 ~ 16:59:59 까지) 아니므로 입력불가함!! << (수 오후 17:15)
   
   commit;
   
   select *
   from tbl_member_test1;

 

'SQL' 카테고리의 다른 글

---- ===== **** CURSOR ( 중요 ) **** ===== -----  (0) 2022.07.14
배열처럼 사용되는 table 타입 변수  (0) 2022.07.14
===== ***** 반복문 ***** =====  (0) 2022.07.13
제어문(IF문)  (0) 2022.07.13
사용자 정의 함수(Function)  (0) 2022.07.12