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