IF문(PL/SQL)

PL/SQL 컨텍스트 내에서 IF문을 사용하여 특정 기준을 기반으로 SQL문을 실행할 수 있습니다.

IF문의 네 가지 양식은 다음과 같습니다.
  • IF...THEN...END IF
  • IF...THEN...ELSE...END IF
  • IF...THEN...ELSE IF...END IF
  • IF...THEN...ELSIF...THEN...ELSE...END IF

IF...THEN...END IF

이 명령문의 구문은 다음과 같습니다.
IF boolean-expression THEN
  statements
END IF;
IF...THEN문은 IF의 가장 단순한 양식입니다. THEN과 END 사이의 명령문은 조건이 TRUE로 평가된 경우에만 실행됩니다. 다음 예에서 IF...THEN문은 보수를 받는 직원을 조사하여 표시하는 데 사용됩니다.
DECLARE
    v_empno         emp.empno%TYPE;
    v_comm          emp.comm%TYPE;
    CURSOR emp_cursor IS SELECT empno, comm FROM emp;
BEGIN
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO    COMM');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    LOOP
        FETCH emp_cursor INTO v_empno, v_comm;
        EXIT WHEN emp_cursor%NOTFOUND;
--
--  Test whether or not the employee gets a commission
--
        IF v_comm IS NOT NULL AND v_comm > 0 THEN
            DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
            TO_CHAR(v_comm,'$99999.99'));
        END IF;
    END LOOP;
    CLOSE emp_cursor;
END;
이 프로그램은 다음 샘플 출력을 생성합니다.
EMPNO    COMM
-----    ------- 
7499     $300.00 
7521     $500.00 
7654    $1400.00

IF...THEN...ELSE...END IF

이 명령문의 구문은 다음과 같습니다.
IF boolean-expression THEN
  statements
ELSE
  statements
END IF;
IF...THEN...ELSE문은 조건이 FALSE로 평가된 경우에 실행되는 대체 명령문 세트를 지정합니다. 다음 예에서는 IF...THEN...ELSE문을 사용하여 직원이 보수를 받지 않는 경우 Non-commission 텍스트를 표시하도록 앞의 예를 수정합니다.
DECLARE
    v_empno         emp.empno%TYPE;
    v_comm          emp.comm%TYPE;
    CURSOR emp_cursor IS SELECT empno, comm FROM emp;
BEGIN
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO    COMM');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    LOOP
        FETCH emp_cursor INTO v_empno, v_comm;
        EXIT WHEN emp_cursor%NOTFOUND;
--
--  Test whether or not the employee gets a commission
--
        IF v_comm IS NOT NULL AND v_comm > 0 THEN
            DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
            TO_CHAR(v_comm,'$99999.99'));
        ELSE
            DBMS_OUTPUT.PUT_LINE(v_empno || '     ' || 'Non-commission');
        END IF;
    END LOOP;
    CLOSE emp_cursor;
END;
이 프로그램은 다음 샘플 출력을 생성합니다.
EMPNO    COMM
-----    -------
7369     Non-commission
7499  $   300.00
7521  $   500.00
7566     Non-commission
7654  $  1400.00
7698     Non-commission
7782     Non-commission
7788     Non-commission
7839     Non-commission
7844     Non-commission
7876     Non-commission
7900     Non-commission
7902     Non-commission
7934     Non-commission

IF...THEN...ELSE IF...END IF

이 명령문의 구문은 다음과 같습니다.
IF boolean-expression THEN
  IF boolean-expression THEN
    statements
ELSE
  IF boolean-expression THEN
    statements
END IF;
외부 IF문의 조건이 TRUE로 평가되는지 또는 FALSE로 평가되는지 여부에 따라 대체 IF문이 호출되도록 IF문을 중첩시킬 수 있습니다. 다음 예에서는 외부 IF...THEN...ELSE문을 사용하여 직원이 보수를 받는지 여부를 테스트합니다. 이어서 내부 IF...THEN...ELSE문을 사용하여 직원의 보수 총액이 회사 평균을 초과하는지 또는 미만인지 여부를 테스트합니다. 이 양식의 IF문을 사용하면 외부 IF문의 ELSE 파트 내부에 IF문이 실제로 중첩됩니다. 따라서 중첩된 각 IF에 대해 하나의 END IF가 필요하고 상위 IF...ELSE에 대해서도 하나의 END IF가 필요합니다. (커서 선언의 SELECT문 내에서 NVL 함수를 사용하여 각 직원의 연간 보수를 계산하면 이 프로그램의 로직을 상당히 단순화할 수 있습니다. 그러나 이 예의 목적은 IF문의 사용 방법을 설명하는 것입니다.)
DECLARE
    v_empno         emp.empno%TYPE;
    v_sal           emp.sal%TYPE;
    v_comm          emp.comm%TYPE;
    v_avg           NUMBER(7,2);
    CURSOR emp_cursor IS SELECT empno, sal, comm FROM emp;
BEGIN
--
--  Calculate the average yearly compensation
--
    SELECT AVG((sal + NVL(comm,0)) * 24) INTO v_avg FROM emp;
    DBMS_OUTPUT.PUT_LINE('Average Yearly Compensation: ' ||
        TO_CHAR(v_avg,'$999,999.99'));
    OPEN emp_cursor;
    DBMS_OUTPUT.PUT_LINE('EMPNO    YEARLY COMP');
    DBMS_OUTPUT.PUT_LINE('-----    -----------');
    LOOP
        FETCH emp_cursor INTO v_empno, v_sal, v_comm;
        EXIT WHEN emp_cursor%NOTFOUND;
--
--  Test whether or not the employee gets a commission
--
        IF v_comm IS NOT NULL AND v_comm > 0 THEN
--
--  Test whether the employee's compensation with commission exceeds
--  the company average
--
            IF (v_sal + v_comm) * 24 > v_avg THEN
                DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
                    TO_CHAR((v_sal + v_comm) * 24,'$999,999.99') ||
                    ' Exceeds Average');
            ELSE
                DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
                    TO_CHAR((v_sal + v_comm) * 24,'$999,999.99') ||
                    ' Below Average');
            END IF;
        ELSE
--
--  Test whether the employee's compensation without commission exceeds
--  the company average
--
            IF v_sal * 24 > v_avg THEN
                DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
                    TO_CHAR(v_sal * 24,'$999,999.99') || ' Exceeds Average');
            ELSE
                DBMS_OUTPUT.PUT_LINE(v_empno || '  ' ||
                    TO_CHAR(v_sal * 24,'$999,999.99') || ' Below Average');
            END IF;
        END IF;
    END LOOP;
    CLOSE emp_cursor;
END;
이 프로그램은 다음 샘플 출력을 생성합니다.
Average Yearly Compensation: $  53,528.57
EMPNO    YEARLY COMP
-----    -----------
7369  $  19,200.00 Below Average
7499  $  45,600.00 Below Average
7521  $  42,000.00 Below Average
7566  $  71,400.00 Exceeds Average
7654  $  63,600.00 Exceeds Average
7698  $  68,400.00 Exceeds Average
7782  $  58,800.00 Exceeds Average
7788  $  72,000.00 Exceeds Average
7839  $ 120,000.00 Exceeds Average
7844  $  36,000.00 Below Average
7876  $  26,400.00 Below Average
7900  $  22,800.00 Below Average
7902  $  72,000.00 Exceeds Average
7934  $  31,200.00 Below Average

IF...THEN...ELSIF...THEN...ELSE...END IF

이 명령문의 구문은 다음과 같습니다.
IF boolean-expression THEN
  statements
[ ELSIF boolean-expression THEN
  statements
[ ELSIF boolean-expression THEN
  statements ] ...]
[ ELSE
  statements ]
END IF;
IF...THEN...ELSIF...ELSE문은 하나의 명령문에서 다수의 대체를 검사하는 방법을 제공합니다. 형식상 이 명령문은 중첩된 IF...THEN...ELSE...IF...THEN문과 동일하지만, 하나의 END IF만 필요합니다. 다음 예에서는 IF...THEN...ELSIF...ELSE문을 사용하여 보수별($25,000 단위)로 직원 수를 계산합니다.
DECLARE
    v_empno         emp.empno%TYPE;
    v_comp          NUMBER(8,2);
    v_lt_25K        SMALLINT := 0;
    v_25K_50K       SMALLINT := 0;
    v_50K_75K       SMALLINT := 0;
    v_75K_100K      SMALLINT := 0;
    v_ge_100K       SMALLINT := 0;
    CURSOR emp_cursor IS SELECT empno, (sal + NVL(comm,0)) * 24 FROM emp;
BEGIN
    OPEN emp_cursor;
    LOOP
        FETCH emp_cursor INTO v_empno, v_comp;
        EXIT WHEN emp_cursor%NOTFOUND;
        IF v_comp < 25000 THEN
            v_lt_25K := v_lt_25K + 1;
        ELSIF v_comp < 50000 THEN
            v_25K_50K := v_25K_50K + 1;
        ELSIF v_comp < 75000 THEN
            v_50K_75K := v_50K_75K + 1;
        ELSIF v_comp < 100000 THEN
            v_75K_100K := v_75K_100K + 1;
        ELSE
            v_ge_100K := v_ge_100K + 1;
        END IF;
    END LOOP;
    CLOSE emp_cursor;
    DBMS_OUTPUT.PUT_LINE('Number of employees by yearly compensation');
    DBMS_OUTPUT.PUT_LINE('Less than 25,000 : ' || v_lt_25K);
    DBMS_OUTPUT.PUT_LINE('25,000 - 49,9999 : ' || v_25K_50K);
    DBMS_OUTPUT.PUT_LINE('50,000 - 74,9999 : ' || v_50K_75K);
    DBMS_OUTPUT.PUT_LINE('75,000 - 99,9999 : ' || v_75K_100K);
    DBMS_OUTPUT.PUT_LINE('100,000 and over : ' || v_ge_100K);
END;
이 프로그램은 다음 샘플 출력을 생성합니다.
Number of employees by yearly compensation
Less than 25,000 : 2
25,000 - 49,9999 : 5
50,000 - 74,9999 : 6
75,000 - 99,9999 : 0
100,000 and over : 1