더북(TheBook)

IF문

특정 조건에 따라 처리를 하는 것을 조건문이라 하는데 그 대표적인 것이 바로 IF 문이며 그 구조는 다음과 같다.

    <조건이 1개일 경우>
    IF 조건 THEN
       조건 처리;
    END IF;
     
    <조건이 2개일 경우>
    IF 조건 THEN
       조건 처리 1;
    ELSE
      조건 처리2;
    END IF;
     
    <조건이 n개일 경우>
    IF 조건1 THEN
       조건 처리1;
    ELSIF 조건2 THEN
      조건 처리2;
      ...
    ELSE
       조건 처리n;
    END IF;

IF 다음에 오는 조건 값이 참, 즉 TRUE이면 해당 조건 처리 문장이 실행된다. IF문의 용법은 프로그래밍 언어에 따라 조금씩 차이가 있는데 오라클에서는 조건 다음에는 THEN을, 문장 맨 마지막에는 END IF를 명기해야 한다. 또한 조건이 1개 이상이면 ELSE IF가 아닌 ELSIF를 사용한다. 그럼 두 변수를 선언해 초기화한 뒤 둘 중 큰 수를 출력하는 로직을 IF문을 사용해 구현해 보자.

입력

    DECLARE
      vn_num1 NUMBER := 1;
      vn_num2 NUMBER := 2 ;
    BEGIN
      IF vn_num1 >= vn_num2 THEN
         DBMS_OUTPUT.PUT_LINE(vn_num1 ||'이 큰 수');
      ELSE
         DBMS_OUTPUT.PUT_LINE(vn_num2 ||'이 큰 수');
      END IF;
    END;

결과

    2이 큰 수

vn_num2가 vn_num1보다 크므로 ELSE 부분으로 제어가 넘어가 실행된 것을 확인할 수 있다. 이번에는 조건이 여러 개인 IF문을 살펴 보자.

입력

    DECLARE
      vn_salary NUMBER := 0;
      vn_department_id NUMBER := 0;
    BEGIN
      vn_department_id := ROUND(DBMS_RANDOM.VALUE (10, 120), -1);

       SELECT salary
         INTO vn_salary
         FROM employees
        WHERE department_id = vn_department_id
          AND ROWNUM = 1;

      DBMS_OUTPUT.PUT_LINE(vn_salary);

      IF vn_salary BETWEEN 1 AND 3000 THEN
         DBMS_OUTPUT.PUT_LINE('낮음');
      ELSIF vn_salary BETWEEN 3001 AND 6000 THEN
         DBMS_OUTPUT.PUT_LINE('중간');
      ELSIF vn_salary BETWEEN 6001 AND 10000 THEN
         DBMS_OUTPUT.PUT_LINE('높음');
      ELSE
         DBMS_OUTPUT.PUT_LINE('최상위');
      END IF;
    END;

결과

    13000
    최상위

앞의 익명 블록은 7장에서 샘플 데이터를 생성할 때 사용했던 DBMS_RANDOM 패키지를 사용해 10부터 120까지 숫자를 생성한 후 10의 자리(-1)에서 ROUND 처리를 해서 실행할 때마다 무작위로 10, 20, 30, … 120까지 수를 vn_department_id 변수에 할당한다. 이로 인해 이 PL/SQL 블록의 실행 결과는 실행할 때마다 달라질 것이다. 그리고 나서 이 변수 값에 해당하는 부서번호를 가진 사원을 무작위로 1명 선택해 급여를 가져와 vn_salary 변수에 넣어, IF 문을 사용해 범위에 맞게 출력하는 로직이다. 급여가 3000 이하이면 ‘낮음’, 3,001에서 6,000까지는 ‘중간’, 6,001에서 10,000까지는 ‘높음’, 그 이상은 ‘최상위’ 라는 텍스트를 출력하고 있다. 이처럼 여러 조건을 검토해 로직을 처리할 때는 IF~ELSIF~ELSE~END IF 구문을 사용한다.

또한 IF문을 중첩해서 사용할 수도 있다. 중첩할 때는 가장 가까운 IF 조건에 따라 로직이 처리된다.

입력

    DECLARE
      vn_salary NUMBER := 0;
      vn_department_id NUMBER := 0;
      vn_commission NUMBER := 0;
    BEGIN
      vn_department_id := ROUND(DBMS_RANDOM.VALUE (10, 120), -1);

       SELECT salary, commission_pct
         INTO vn_salary, vn_commission
         FROM employees
        WHERE department_id = vn_department_id
          AND ROWNUM = 1;

      DBMS_OUTPUT.PUT_LINE(vn_salary);

      IF vn_commission > 0 THEN
        IF vn_commission > 0.15 THEN
           DBMS_OUTPUT.PUT_LINE(vn_salary * vn_commission );
        END IF;
      ELSE
         DBMS_OUTPUT.PUT_LINE(vn_salary);
      END IF;
    END;

결과

    6500
    6500

위 익명 블록은 사원 테이블에서 커미션까지 가져와 커미션이 0보다 클 경우, 다시 조건을 걸어 커미션이 0.15보다 크면 ‘급여*커미션’ 결과를 출력하고, 커미션이 0보다 작으면 급여만 출력하고 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.