DB모델링

내가 보려고 정리한 오라클SQL_분기문(IF, CASE WHEN~THEN)

비비펄 2022. 12. 1. 12:24

❗📌분기명령

  - PL/SQL에서 제공된 분기문에는 IF, CASE WHEN ~ THEN이 존재 함

❗ IF 문

- 개발언어의 IF.문과 동일 기능 제공

(사용형식-1)
  IF 조건문1 THEN
     명령문1;
 [ELSE
     명령문2;]
  END IF;
  
(사용형식-2)
  IF 조건문1 THEN
     명령문1;
 ELSIF 조건문2 THEN
     명령문2;
       :
  ELSE
     명령문n;
  END IF;
  
(사용형식-3)
  IF 조건문1 THEN
     IF 조건문2 THEN
        명령문1;
     ELSE
        명령문2;
     END IF;
 ELSIF 조건문3 THEN
     명령문3;
       :
  ELSE
     명령문n;
  END IF;

 

사용예::
년도를 입력받아 윤년과 평년을 구별하는 블록을 작성하시오

윤년 : ((4의 배수)이면서 (100의 배수가 아니거나)) (400의 배수)가 되는 해
  ACCEPT P_YEAR PROMPT '년도 입력(YYYY) : '
    DECLARE
     L_YEAR NUMBER:=TO_NUMBER('&P_YEAR'); --입력받은 년도가 숫자로 바뀌어서 바뀐 연도가 L_YEAR에 저장    
     L_RES VARCHAR2(500);
     BEGIN
     IF (MOD(L_YEAR,4)=0 AND MOD(L_YEAR,100)!=0) OR(MOD(L_YEAR,400)=0)THEN
        L_RES:=L_YEAR||'년은 윤년입니다.';
    ELSE
    L_RES:=L_YEAR||'년은 평년입니다.';
    END IF;
    DBMS_OUTPUT.PUT_LINE(L_RES);
     END;​

    

 

사용예2::
첫 날에 100원, 두째날부터 전날의 2배씩 저축할 때 최초로 100만원을 넘는 날과 저축액수를 구하시오.

 DECLARE
      L_SUM NUMBER:=0; --저축 총액
      L_DAMT NUMBER:=100; --매일 저축할 액수
      L_DAYS NUMBER:=1; --날수
    BEGIN
      LOOP
        L_SUM:=L_SUM+L_DAMT;
        IF L_SUM>1000000 THEN
            EXIT;
        ELSE
        L_DAMT:=L_DAMT*2;
        L_DAYS:=L_DAYS+1;
        END IF;
      END LOOP;
      DBMS_OUTPUT.PUT_LINE('날수 :'||L_DAYS);
      DBMS_OUTPUT.PUT_LINE('저축액수 :'||L_SUM);
    END;​

 

❗  CASE WHEN ~ THEN

 - 다중분기문
 - JAVA의 SWITCH CASE문과 유사 기능 제공

(사용형식-1)
  CASE WHEN 조건1 THEN 
            명령1;
       WHEN 조건2 THEN 
            명령2;
             :
      [ELSE
            명령n;]
  END CASE;
  
(사용형식-2)
  CASE 조건
       WHEN 값1 THEN 
            명령1;
       WHEN 값2 THEN 
            명령2;
             :
      [ELSE
            명령n;]
  END CASE;
ACCEPT W_CONSUM PROMPT '수도 사용량을 입력해주세요(단위: 톤)'      
   DECLARE
     W_CONSUM NUMBER:=TO_NUMBER('&W_CONSUM');
     W_CSF NUMBER := 0;
     W_TOTAL NUMBER := 0; 
   BEGIN
     CASE WHEN W_CONSUM BETWEEN 1 AND 10
          THEN W_CSF:=W_CONSUM*1000;
           
          WHEN W_CONSUM BETWEEN 11 AND 20
          THEN W_CSF:=(W_CONSUM-10)*1300+10000;
           
          WHEN W_CONSUM BETWEEN 21 AND 30
          THEN W_CSF:=(W_CONSUM-20)*1700+23000;
          
          ELSE W_CSF:=(W_CONSUM-30)*2500+40000;
     END CASE;
    W_TOTAL := W_CSF + (W_CONSUM*300)+ (W_CONSUM*350);
    DBMS_OUTPUT.PUT_LINE('수도사용량:' ||  W_CONSUM);
    DBMS_OUTPUT.PUT_LINE('수도요금:' ||  W_TOTAL);    
  
   END;