PL/SQL의 선택문


1) IF~THEN~END IF

[ 형식 ]
IF condition THEN --조건문
statements; --조건이 만족할 경우 실행문


예제) 부서번호로 부서명 알아내기

DECLARE

  VEMPNO NUMBER(4);

  VENAME VARCHAR2(20);

  VDEPTNO EMP.DEPTNO%TYPE;

  VDNAME VARCHAR2(20) := NULL;

  

BEGIN

  SELECT EMPNO, ENAME, DEPTNO

  INTO VEMPNO, VENAME, VDEPTNO

  FROM EMP

  WHERE EMPNO = 7788;

  

  IF(VDEPTNO = 10) THEN

  VDNAME := 'ACCOUNTING';

  END IF;

  IF(VDEPTNO = 20) THEN

  VDNAME := 'RESEARCH';

  END IF;

  IF(VDEPTNO = 30) THEN

  VDNAME := 'SALES';

  END IF;

  IF(VDEPTNO = 40) THEN

  VDNAME := 'OPERATIONS';

  END IF;

  

  DBMS_OUTPUT.PUT_LINE('사번 이름 부서명');  

  DBMS_OUTPUT.PUT_LINE(VEMPNO||'/'||VENAME||'/'||VDNAME);

END;

/


결과)
사번 이름 부서명
7788/SCOTT/RESEARCH


문제) 연봉구하기 문제. 연봉 계산을 위해 '급여*12+커미션' 이라는 공식을 사용한다. 

- IF문을 넣지 않는 경우 커미션이 NULL 값이라 연봉 결과가 출력 안되는 문제가 있다.
- IF문을 통해 커미션을 0으로 변환해줘야만 연봉이 정상 출력된다.

DECLARE
-- %ROWTYPE로행 단위로 저장하는 레퍼런스 변수 선언
  VEMP EMP%ROWTYPE;
  ANNSAL NUMBER(7,2);  
BEGIN
  DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 연봉');  
  DBMS_OUTPUT.PUT_LINE('---------------------');  
 
 -- SCOTT 사원의 전체 정보를 행 단위로 VEMP에 저장 
  SELECT * INTO VEMP
  FROM EMP
  WHERE ENAME = 'SCOTT';
  
-- 커미션이 NULL일 경우 0으로 변경해야 올바른 연봉 계산
IF(VEMP.COMM IS NULL) THEN
VEMP.COMM := 0;
END IF;

-- 스칼라 변수에 연봉을 계산할 결과를 저장
  ANNSAL := VEMP.SAL*12 + VEMP.COMM;

-- 결과 출력
  DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||VEMP.ENAME||'/'||ANNSAL);
END;
/

결과)
사번 / 이름 / 연봉
---------------------
7788/SCOTT/36000




2) IF~THEN~ELSE~END IF

[ 형식 ]
IF condition THEN 
statements; 
ELSE
statements; 
END IF;

예제) 직원의 연봉 구하기
: 커미션을 받는 직원은 급여에 12를 곱한 후 커미션과 합산, 받지 않는 직원은 급여에 12만 곱한다.

DECLARE
  VEMP EMP%ROWTYPE;
  ANNSAL NUMBER(7,2);
  
BEGIN
-- SCOTT 사원의 전체 정보를 행 단위로 VEMP에 저장
  SELECT * INTO VEMP
  FROM EMP
  WHERE ENAME = 'SCOTT';
  
  IF(VEMP.COMM IS NULL) THEN -- 커미션이 NULL이면
  ANNSAL := VEMP.SAL*12; -- 급여에 12를 곱하고
  ELSE -- 커미션이 NULL이 아니면
  ANNSAL := VEMP.SAL*12 + VEMP.COMM; -- 커미션과 합산  
  END IF;
  
  DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 연봉');  
  DBMS_OUTPUT.PUT_LINE('---------------------');  
  DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||VEMP.ENAME||'/'||ANNSAL);
END;
/

결과)
사번 / 이름 / 연봉
---------------------
7788/SCOTT/36000




3) IF~THEN~ELSIF~ELSE~END IF

[ 형식 ]
IF condition THEN 
statements; 
ELSIF condition THEN
statements;
ELSIF condition THEN
statements;
ELSE
statements;
END IF;

※ 주의 : ELSE IF가 아니라 ELSIF. 띄어쓰기 없고 ELSE 끝에 E가 빠진 ELS다.

예제) 부서번호로 부서명 알아내기

DECODE 함수 대신에 IF~THEN~ELSIF~ELSE~END IF 구문으로 부서번호에 대한 부서명 구하기


DECLARE

  VEMP EMP%ROWTYPE;

  VDNAME VARCHAR2(14);  

BEGIN

  DBMS_OUTPUT.PUT_LINE('사번 / 이름 / 부서명');  

  DBMS_OUTPUT.PUT_LINE('---------------------');  

  

  SELECT * INTO VEMP

  FROM EMP

  WHERE ENAME = 'SCOTT';

  

  IF(VEMP.DEPTNO = 10) THEN

  VDNAME := 'ACCOUNTING';

  ELSIF (VEMP.DEPTNO = 20) THEN

  VDNAME := 'RESEARCH';

  ELSIF (VEMP.DEPTNO = 30) THEN

  VDNAME := 'SALES';

  ELSIF (VEMP.DEPTNO = 40) THEN

  VDNAME := 'OPERATIONS';

  END IF;

  

  DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||VEMP.ENAME||'/'||VDNAME);

END;

/


결과)
사번 / 이름 / 부서명
---------------------
7788/SCOTT/RESEARCH








Posted by netyhobby
,