Oracle 23강(보강) - PL/SQL 분기명령

Whatever·2021년 10월 14일
0

기초 ORACLE

목록 보기
22/27
  1. 분기명령
  • IF문, CASE WHEN ~ THEN문 제공

1)IF문

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

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

(사용형식-2) --병렬IF 조건이 맞지 않을 때 다른 조건을 대입(예. GRADE)
IF 조건문1 THEN
명령문1;
ELSIF 조건문2 THEN
명령문2;
:
ELSE
명령문n;
END IF;

(사용형식-3) --중첩IF문(중간에 오는 IF에 꼭 END IF가 와야함)
IF 조건문1 THEN
IF 조건문2 THEN
명령문1;
ELSE
명령문2;
:
END IF
ELSE
명령문n;
END IF;

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

  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:='&P_YEAR'||'년은 윤년';
    ELSE
       V_MESSAGE:='&P_YEAR'||'년은 평년'; 
    END IF; --한 문장의 끝은 세미콜론   
    
    DBMS_OUTPUT.PUT_LINE(V_MESSAGE); 
    --출력문은 하나로 통일하는 게 좋음(그래서 V_MESSAGE사용한 것)
  END;

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

  DECLARE
    CURSOR CUR_ADD IS --SELECT문의 CURSOR는 뷰와 같다.(커서에서 한 줄씩 읽어옴)
      SELECT MEM_ID,MEM_NAME
        FROM MEMBER
       WHERE MEM_ADD1 LIKE '충남%'; --거주지 충남: 3명
    V_SUM NUMBER:=0;
    V_MESSAGE VARCHAR2(50);
  BEGIN
    FOR REC IN CUR_ADD LOOP
        SELECT SUM(CART_QTY*PROD_PRICE) INTO V_SUM --구매금액의 합계를 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; --여기에서 REC.MEM_ID는 첫번째의 MEM_ID를 가리킴
        IF V_SUM>=1000000 THEN --저장된 V_SUM의 값을 비교
           V_MESSAGE:=REC.MEM_NAME||'회원은 VIP회원입니다.';
        ELSIF V_SUM>=500000 THEN --V_SUM이 100만원미만인 행들(이미 위에서 가려짐)
           V_MESSAGE:=REC.MEM_NAME||'회원은 정상회원입니다.'; 
        ELSE
           V_MESSAGE:=REC.MEM_NAME||'회원은 관심회원입니다.';
        END IF;   
        DBMS_OUTPUT.PUT_LINE(V_MESSAGE);
    END LOOP;
  END;

--CURSOR로 하는 이유 : 한 명씩 가리켜야 함 / 한 명씩의 정보를 꺼내(읽어)오는 것은 CURSOR가 아니고서는 방법이 없음

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이상
'매우 미흡'는 그 이하

(1번째 CASE ~ WHEN 사용형식) - 값 기술      

  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:='매우 미흡';   --6이하다
    END CASE;
    DBMS_OUTPUT.PUT_LINE(V_SCORE||' => '||V_GRADE);
  END;
  
(2번째 CASE ~ WHEN 사용형식) - 조건문 기술(분기명령)

   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;


                 
              

0개의 댓글

관련 채용 정보