[Oracle SQL] 분기명령

고동이의 IT·2021년 10월 28일
0

Oracle SQL

목록 보기
28/31

> ## 2. 분기명령

  • IF 문 CASE WHEN ~ THEN 문 제공

    1)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
IF 조건문1 THEN
IF 조건문2 THEN
명령문1;
ELSE
명령문2;
END IF;
ELSE
명령문n;
END IF;

사용 예)년도를 입력받아 윤년과 평년을 구별하는 익명블록 작성
윤년은 해당년도가 4의 배수이면서 100의 배수가 아니거나
또는 400의 배수가 되는 해

    ACCEPT P_YEAR PROMPT '년도 : '
    DECLARE
      V_YEAR NUMBER:=TO_NUMBER('&P_YEAR');
      V_MESSAGE VARCHAR2(100);
    BEGIN
      IF (MOD(V_YEAR,4)=0 AND MOD(V_YEAR,100)!=0) OR
         (MOD(V_YEAR,400)=0) THEN
         V_MESSAGE:=V_YEAR||'년은 윤년';
      ELSE   
         V_MESSAGE:=V_YEAR||'년은 평년';
      END IF;
      
      DBMS_OUTPUT.PUT_LINE(V_MESSAGE);
    END;
  

사용예) 충남에 거주하는 회원을 추출하여 해당 회원들의 2005년 4~6월 구매 집계를 구한 후
구매금액 합계가 100만원 이상이면 'vip회원'
50만원-100만원: '정상회원'
그 이하이면 '열등회원'을 출력하시오

   DECLARE
     CURSOR CUR_ADD IS --SELECT 문의 커서는 뷰와 같음
       SELECT MEM_ID
         FROM MEMBER
        WHERE MEM_ADD1 LIKE '충남%'; --거주지 충남인 회원
        V_SUM NUMBER:=0;
        V_MESAAGE VARCHAR2(50);
   BEGIN
     FOR REC IN CUR_ADD LOOP
         SELECT SUM(CART_QTY*PROD_PRICE) INTO V_SUM
           FROM CART, PROD
          WHERE CART_PROD=PROD_ID
            AND SUBSTR(CART_NO,1,6) BETWEEN '200504' AND '200506'
            AND CART_MEMBER=REC.MEM_ID;
         IF V_SUM>=1000000 THEN 
            V_MESSAGE:=REC.MEM_NAME||'회원은 VIP회원입니다';
        ELSIF V_SUM>=500000 THEN
           V_MESSAGE:=REC.MEM_NAME||'회원은 정상회원입니다';
        ELSE
            V_MESSAGE:=REC.MEM_NAME||'회원은 관심회원입니다';
        END IF;
        
        DBMS_OUTPUT.PUT_LINE(V_MESSAGE);
     
     END LOOP;
   END;
   
   

2) CASE WHEN ~ THEN문

  • 다중분기문
  • 자바의 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;

사용예) 점수하나를 입력받아 '매우 우수','우수','보통','미흡','매우미흡'로 평점을 부여하시오
'매우 우수'는 90이상
'우수'는 80이상
'보통'는 70이상
'미흡'은 60이상
'매우미흡'는 그 이하

            DECLARE
   V_SCORE NUMBER:=88;
   V_GRADE VARCHAR2(50);
   BEGIN
    CASE TRUNC(V_SCORE/10)
     WHEN 10 THEN
          V_GRADE:='매우 우수';
           WHEN 9 THEN
          V_GRADE:=' 매우 우수';
           WHEN 8 THEN
          V_GRADE:='우수';
           WHEN 7 THEN
          V_GRADE:='보통';
           WHEN 6 THEN
             V_GRADE:='미흡';
            ELSE
          V_GRADE:='매우미흡';
          
          END CASE;
          DBMS_OUTPUT.PUT_LINE(V_SCORE||'=>'||V_GRADE);
           END;

 DECLARE
   V_SCORE NUMBER:=88;
   V_GRADE VARCHAR2(50);
   BEGIN
    CASE WHEN TRUNC(V_SCORE/10)=10 OR TRUNC(V_SCORE/10)=9 THEN
          V_GRADE:='매우 우수';
           WHEN TRUNC(V_SCORE/10)=8 THEN
          V_GRADE:='우수';
           WHEN TRUNC(V_SCORE/10)=7 THEN 
          V_GRADE:='보통';
           WHEN TRUNC(V_SCORE/10)=6 THEN
             V_GRADE:='미흡';
            ELSE
          V_GRADE:='매우미흡';
          
          END CASE;
          DBMS_OUTPUT.PUT_LINE(V_SCORE||'=>'||V_GRADE);
           END;
        
  
  
  
  
  
  
  
  
profile
삐약..뺙뺙

0개의 댓글