본문 바로가기

데이터베이스/ORACLE

26. 분기문 ( IF, CASE WHEN )

1. 분기문

1) IF 문

  • 프로그래밍 언어의 IF문과 동일 기능 제공

( 사용형식 -1 )

  IF 조건 THEN
     명령문;
  ELSE 
     명령문;
  END IF;

( 사용형식 -2 )

  IF 조건 THEN
     명령문;
  ELSIF 조건 THEN
     명령문;
  ELSIF 조건 THEN
     명령문;
  ELSE 
     명령문;
  END IF;

( 사용형식 -3 )

  IF 조건 THEN
     IF 조건 THEN
        명령문;
     ELSE 
        명령문;
     END IF;   
  ELSE 
     명령문;
  END IF;

 

예제) 키보드로 단을 입력받아 해당 구구단을 출력하는 익명 블록을 작성하시오

ACCEPT P_BASE PROMPT '구구단의 단입력(2-9) : '
DECLARE
  V_BASE NUMBER := TO_NUMBER('&P_BASE');
  
BEGIN
  FOR I IN 1..9 LOOP
    DBMS_OUTPUT.PUT_LINE(V_BASE||'*'||I||'='||V_BASE*i);
    END LOOP;
END;

 

예제)

임의의 부서코드(10-110)를 생성하여 해당부서에 속한 사원 중 첫번째로 검색되는 사원정보와
해당 사원의 급여를 이용하여
		1 ~ 3000 사이이면 '저임금 사원',
		3001 ~ 6000 사이이면 '중간임금 사원'
		6001 이상이면 '고임금 사원' 메세지를 비고에 출력하시오
		단, 출력할 사원정보는 사원번호, 사원명, 부서명, 급여, 비고
		--죄종출력제시된 컬럼개수만큼 변수선언
    
DECLARE
  V_EMP_ID  EMPLOYEES.EMPLOYEE_ID%TYPE;
  V_EMP_NAME EMPLOYEES.EMP_NAME%TYPE;
  V_DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
  V_DEPT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE;
  V_SAL EMPLOYEES.SALARY%TYPE;
  V_REMARKS VARCHAR2(50);

BEGIN
  --부서번호 생성
  V_DEPT_ID :=ROUND(DBMS_RANDOM.VALUE(10,120),-1);
  
  SELECT A.EMPLOYEE_ID, A.EMP_NAME, B.DEPARTMENT_NAME, A.SALARY
    INTO V_EMP_ID,V_EMP_NAME,V_DEPT_NAME,V_SAL
    FROM EMPLOYEES A, DEPARTMENTS B
   WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
     AND A.DEPARTMENT_ID=V_DEPT_ID
     AND ROWNUM=1;

  IF V_SAL BETWEEN 1 AND 3000 THEN
     V_REMARKS := '저임금 사원';
  ELSIF V_SAL BETWEEN 3001 AND 6000 THEN
     V_REMARKS := '중간임금 사원';
  ELSE 
     V_REMARKS := '고임금 사원'; 
  END IF;   
  
  DBMS_OUTPUT.PUT_LINE('사원번호 : ' ||V_EMP_ID);
  DBMS_OUTPUT.PUT_LINE('사원명 : ' ||V_EMP_NAME);
  DBMS_OUTPUT.PUT_LINE('부서명 : ' ||V_DEPT_NAME);
  DBMS_OUTPUT.PUT_LINE('급여 : ' ||V_SAL);
  DBMS_OUTPUT.PUT_LINE('비고 : ' ||V_REMARKS);    
  DBMS_OUTPUT.PUT_LINE('------------------------');
  
END;

 

예제)

매출테이블(CART)에서 20056월 매출액집계를 조회하여
   매출액이 1-50만원 이면 마일리지를 3050만원 초과 100만원 이하이면 50100만원 초과 200만원 이면 70점
          그 이상이면 100점을 추가 지급하는 익명블록을 작성하시오
--회원번호별 매출액 계산해서 업데이트 맴버테이블을 그회원에가서 마일리지 꺼내서 그구간에 따라서 넣음
  
(20056월 회원별 매출액집계 커서)--커서에서 한줄씩꺼내서 쓴다 
CURSOR CUR_MILE
IS
    SELECT CART_MEMBER,
           SUM(CART_QTY*PROD_PRICE)
      FROM CART, PROD
     WHERE CART_PROD=PROD_ID
       AND CART_NO LIKE '200506%'
     GROUP BY CART_MEMBER;  
     


----------------------------------

DECLARE
  V_PMILE  MEMBER.MEM_MILEAGE%TYPE;
  V_UMILE  MEMBER.MEM_MILEAGE%TYPE;
  CURSOR CUR_MILE
  IS
    SELECT CART_MEMBER,
           SUM(CART_QTY*PROD_PRICE) AS AMT
      FROM CART, PROD
     WHERE CART_PROD=PROD_ID
       AND CART_NO LIKE '200506%'
     GROUP BY CART_MEMBER;  
BEGIN
  FOR REC IN CUR_MILE LOOP
    SELECT MEM_MILEAGE INTO V_PMILE
      FROM MEMBER
     WHERE MEM_ID=REC.CART_MEMBER; 
    IF REC.AMT <= 500000 THEN
       V_UMILE:=V_PMILE+30;
    ELSIF REC.AMT <= 1000000 THEN
       V_UMILE:=V_PMILE+50;
    ELSIF REC.AMT <= 2000000 THEN
       V_UMILE:=V_PMILE+70;  
    ELSE
       V_UMILE:=V_PMILE+100;
    END IF;
    
    UPDATE MEMBER
       SET MEM_MILEAGE=V_UMILE
     WHERE MEM_ID=REC.CART_MEMBER;  
     
    COMMIT;
    
    DBMS_OUTPUT.PUT_LINE('회원번호 : '||REC.CART_MEMBER);
    DBMS_OUTPUT.PUT_LINE('변경전 마일리지 : '||V_PMILE);
    DBMS_OUTPUT.PUT_LINE('변경후 마일리지 : '||V_UMILE);
    DBMS_OUTPUT.PUT_LINE('-----------------------');
  END LOOP;
END;

 

2) CASE WHEN 문

  • 다중분기
  • 프로그래밍 언어의 SWITCH ~ CASE과 유사

( 사용 형식 )

 CASE WHEN 조건1 THEN
        명령문1;
      WHEN 조건2 THEN
        명령문2;
           :
      ELSE
        명령문n;
 END CASE;

( 사용형식 -2 )

CASE 변수 WHEN1 THEN
         명령문1;
      WHEN2 THEN
         명령문2;
            :
      ELSE
         명령문n;
 END CASE;

 

예제)

키보드로 점수(0-100)를 입력 받아
  90-100 : '수'
  80-89  : '우'
  70-79  : '미'
  그 이하 : '좀 더 노력해'를 출력하는 익명블록 작성
  
ACCEPT P_SCORE PROMPT '점수 입력(0-100) : '
DECLARE
  V_SCORE NUMBER := TO_NUMBER('&P_SCORE');
  V_JUM NUMBER := TRUNC(V_SCORE/10);  
BEGIN
  CASE V_JUM WHEN 10 THEN
         DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 수');
       WHEN 9 THEN 
         DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 수');
       WHEN 8 THEN 
         DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 우');
       WHEN 7 THEN 
         DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 미');
       ELSE
         DBMS_OUTPUT.PUT_LINE(V_SCORE||'-> 좀 더 노력해');
  END CASE;
END;

 

1._IF.sql
0.00MB

 

'데이터베이스 > ORACLE' 카테고리의 다른 글

28. TRIGGER  (0) 2021.03.17
27. 분기문 ( LOOP, WHILE, FOR ) / CURSOR  (0) 2021.03.17
25. PL SQL  (0) 2021.03.17
24. SUB QUERY  (0) 2021.03.16
23. OUTER JOIN  (0) 2021.03.16